Package org.eclipse.jst.tapestry.core.internal.project.facet

Source Code of org.eclipse.jst.tapestry.core.internal.project.facet.TapestryFacetInstallDelegate$UpdateWebXMLForJavaEE

package org.eclipse.jst.tapestry.core.internal.project.facet;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderOperationConfig;
import org.eclipse.jst.j2ee.model.IModelProvider;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.javaee.web.WebApp;
import org.eclipse.jst.tapestry.core.internal.Messages;
import org.eclipse.jst.tapestry.core.internal.TapestryCorePlugin;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IDelegate;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;

/**
* Tapestry Facet Install Delegate for WTP faceted web projects. Deals with 2.5
* web app models.
*
* Uses
* <code>org.eclipse.jst.tapestry.core.internal.project.facet<code> for model
*    <li> creates Tapestry configuration file if not already present.
*    <li> updates web.xml for: servlet, servlet-mapping and context-param
*    <li> adds implementation jars to WEB-INF/lib if user requests
*
*/

public final class TapestryFacetInstallDelegate implements IDelegate {

  private final boolean tapestryFacetConfigurationEnabled = TapestryFacetConfigurationUtil
      .isTapestryFacetConfigurationEnabled();

  public void execute(IProject project, IProjectFacetVersion fv, Object cfg,
      IProgressMonitor monitor) throws CoreException {
    if (monitor != null) {
      monitor.beginTask("", 1); //$NON-NLS-1$
    }

    try {
      IDataModel config = null;

      if (cfg != null) {
        config = (IDataModel) cfg;
      } else {
        throw new TapestryFacetException(
            Messages.TapestryFacetInstallDelegate_InternalErr);
      }

      final TapestryUtils tapestryUtil = new TapestryUtilFactory()
          .create(fv, ModelProviderManager.getModelProvider(project));
      if (tapestryUtil == null) {
        throw new TapestryFacetException(NLS.bind(
            Messages.Could_Not_GetTapestryVersion, fv.toString()));
      }

      if (tapestryFacetConfigurationEnabled) {
        // Before we do any configuration, verify that web.xml is //
        // available for update
        final IModelProvider provider = tapestryUtil.getModelProvider();
        if (provider == null) {
          throw new TapestryFacetException(NLS.bind(
              Messages.TapestryFacetInstallDelegate_ConfigErr,
              project.getName()));
        } else if (!(provider.validateEdit(null, null).isOK())) {
          if (!(provider.validateEdit(null, null).isOK())) {// checks
                                    // for
                                    // web.xml
                                    // file
                                    // being
                                    // read-only
                                    // and
                                    // allows
                                    // user
                                    // to
                                    // set
                                    // writeable
            throw new TapestryFacetException(
                NLS.bind(
                    Messages.TapestryFacetInstallDelegate_NonUpdateableWebXML,
                    project.getName()));
          }
        }
      }

      Object obj = config
          .getProperty(ITapestryFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE);
      // Configure libraries
      ((LibraryInstallDelegate) obj).execute(new NullProgressMonitor());

      final LibraryInstallDelegate libDelegate = (LibraryInstallDelegate) (config
          .getProperty(ITapestryFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE));
      final LibraryProviderOperationConfig libConfig = libDelegate
          .getLibraryProviderOperationConfig();

      if (tapestryFacetConfigurationEnabled) {
       
        // Copy Tapestry jar libraries to web project
        copyTapestryJarLibraires(project, fv, config, monitor,
            tapestryUtil);

        // Update web model
        createServletAndModifyWebXML(project, config, monitor,
            tapestryUtil);

        addTapestryDefaultPackage(project,config,tapestryUtil);
      }

      if (monitor != null) {
        monitor.worked(1);
      }

    } finally {
      if (monitor != null) {
        monitor.done();
      }
    }

  }

  private IPath resolveConfigPath(final IProject project, final String path) {
    return ComponentCore.createComponent(project).getRootFolder()
        .getUnderlyingFolder().getRawLocation().append(new Path(path));

  }

  private void copyTapestryJarLibraires(final IProject project,
      final IProjectFacetVersion fv, final IDataModel config,
      final IProgressMonitor monitor, final TapestryUtils jsfUtil) {

    final String libPath = "/WEB-INF/lib/";
    IPath configPath = resolveConfigPath(project, libPath);
    final String[] jarList = new String[] { "antlr-runtime-3.1.1.jar",
        "commons-codec-1.3.jar", "javassist-3.9.0.GA.jar",
        "log4j-1.2.14.jar", "slf4j-api-1.5.2.jar",
        "slf4j-log4j12-1.5.2.jar", "stax-api-1.0.1.jar",
        "stax2-api-3.0.1.jar", "tapestry-core-5.1.0.5.jar",
        "tapestry-ioc-5.1.0.5.jar",
        "tapestry5-annotations-5.1.0.5.jar",
        "woodstox-core-asl-4.0.3.jar", };
    try {
      // if this path exists
      if (configPath.toFile().exists()) {// configPath.toFile().exists()
        final IWorkspaceRunnable op = new IWorkspaceRunnable() {
          public void run(final IProgressMonitor monitor_inner)
              throws CoreException {
            String absolutePath = ComponentCore
                .createComponent(project).getRootFolder()
                .getUnderlyingFolder().getRawLocation()
                .toString();
            String webContent = absolutePath.substring(absolutePath
                .lastIndexOf("/"));
            for (int i = 0; i < jarList.length; i++) {
              String jar = jarList[i];
              IFile eachJar = project.getFile(webContent
                  + libPath + jar);
              if (!eachJar.exists()) {
                eachJar.create(this.getClass().getClassLoader()
                    .getResourceAsStream("jars/" + jar),
                    false, null);
              }
            }
            project.refreshLocal(IResource.DEPTH_INFINITE,
                monitor_inner);
          }
        };
        op.run(monitor);
      }
    } catch (final CoreException e) {
      TapestryCorePlugin.log(e,
          "Exception occured while copying Tapestry jar libraries");
    }

  }
 
  /**
   * Add default package for Tapestry web project
   * @param project
   * @param tapestryUtil
   */
  private void addTapestryDefaultPackage(final IProject project,final IDataModel config, final TapestryUtils tapestryUtil) {
  IJavaProject javaProject = JavaCore.create(project);
  IPackageFragmentRoot[] packageFragmentRoots;
  try {
    packageFragmentRoots = javaProject.getAllPackageFragmentRoots();
    IPackageFragmentRoot packageFragmentRoot = packageFragmentRoots[0];
    final String tapestryPackage = config.getStringProperty(ITapestryFacetInstallDataModelProperties.CONFIG_PATH);
    packageFragmentRoot.createPackageFragment(tapestryPackage, false,null);
    packageFragmentRoot.createPackageFragment(tapestryPackage+".pages", false,null);
    packageFragmentRoot.createPackageFragment(tapestryPackage+".components", false,null);
    packageFragmentRoot.createPackageFragment(tapestryPackage+".services", false,null);
  } catch (JavaModelException e) {
    e.printStackTrace();
  }
 
  }

  /**
   * Create servlet and URL mappings and update the webapp
   *
   * @param project
   * @param config
   * @param monitor
   */
  private void createServletAndModifyWebXML(final IProject project,
      final IDataModel config, final IProgressMonitor monitor,
      final TapestryUtils tapestryUtil) {

    final IModelProvider provider = tapestryUtil.getModelProvider();
    final IPath webXMLPath = new Path("WEB-INF").append("web.xml"); //$NON-NLS-1$ //$NON-NLS-2$
    if (tapestryUtil.isJavaEE(provider.getModelObject())) {
      provider.modify(new UpdateWebXMLForJavaEE(project, config,
          tapestryUtil),
          doesDDFileExist(project, webXMLPath) ? webXMLPath
              : IModelProvider.FORCESAVE);
    } else {// must be 2.3 or 2.4
      provider.modify(new UpdateWebXMLForJ2EE(project, config,
          tapestryUtil), webXMLPath);
    }
    // TODO: is the MyFaces check a todo?
    // Check if runtime is MyFaces or Sun-RI
  }

  private boolean doesDDFileExist(final IProject project,
      final IPath webXMLPath) {
    return project.getProjectRelativePath().append(webXMLPath).toFile()
        .exists();
  }

  private class UpdateWebXMLForJavaEE implements Runnable {
    private final IProject project;
    private final IDataModel config;
    private final TapestryUtils tapestryUtil;

    UpdateWebXMLForJavaEE(final IProject project, final IDataModel config,
        final TapestryUtils tapestryUtil) {
      this.project = project;
      this.config = config;
      this.tapestryUtil = tapestryUtil;
    }

    public void run() {
      final WebApp webApp = (WebApp) ModelProviderManager
          .getModelProvider(project).getModelObject();
      tapestryUtil.updateWebApp(webApp, config);
    }
  }

  private class UpdateWebXMLForJ2EE implements Runnable {
    private final IProject project;
    private final IDataModel config;
    private final TapestryUtils tapestryUtil;

    UpdateWebXMLForJ2EE(final IProject project, final IDataModel config,
        final TapestryUtils tapestryUtil) {
      this.project = project;
      this.config = config;
      this.tapestryUtil = tapestryUtil;
    }

    public void run() {
      final org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) ModelProviderManager
          .getModelProvider(project).getModelObject();
      tapestryUtil.updateWebApp(webApp, config);
    }

  }
}
TOP

Related Classes of org.eclipse.jst.tapestry.core.internal.project.facet.TapestryFacetInstallDelegate$UpdateWebXMLForJavaEE

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.