/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.internal.core.project.facet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; import org.apache.tools.ant.types.FilterSet; import org.apache.tools.ant.types.FilterSetCollection; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.ILogListener; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.datatools.connectivity.IConnectionProfile; import org.eclipse.datatools.connectivity.ProfileManager; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.emf.common.util.EList; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jst.common.project.facet.core.ClasspathHelper; import org.eclipse.jst.j2ee.application.Application; import org.eclipse.jst.j2ee.application.ApplicationFactory; import org.eclipse.jst.j2ee.application.EjbModule; import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit; import org.eclipse.jst.j2ee.model.IModelProvider; import org.eclipse.jst.j2ee.model.ModelProviderManager; import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants; import org.eclipse.jst.javaee.core.DisplayName; import org.eclipse.jst.javaee.core.JavaeeFactory; import org.eclipse.jst.javaee.core.Listener; import org.eclipse.jst.javaee.core.ParamValue; import org.eclipse.jst.javaee.core.UrlPatternType; import org.eclipse.jst.javaee.web.AuthConstraint; import org.eclipse.jst.javaee.web.Filter; import org.eclipse.jst.javaee.web.FilterMapping; import org.eclipse.jst.javaee.web.SecurityConstraint; import org.eclipse.jst.javaee.web.Servlet; import org.eclipse.jst.javaee.web.ServletMapping; import org.eclipse.jst.javaee.web.WebApp; import org.eclipse.jst.javaee.web.WebFactory; import org.eclipse.jst.javaee.web.WebResourceCollection; import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.dialogs.IOverwriteQuery; import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider; import org.eclipse.ui.wizards.datatransfer.IImportStructureProvider; import org.eclipse.ui.wizards.datatransfer.ImportOperation; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; 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.IFacetedProject; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; import org.eclipse.wst.server.core.IServer; import org.eclipse.wst.server.core.ServerCore; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.seam.core.ISeamProject; import org.jboss.tools.seam.core.SeamCoreMessages; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.core.SeamUtil; import org.jboss.tools.seam.core.project.facet.SeamProjectPreferences; import org.jboss.tools.seam.core.project.facet.SeamRuntime; import org.jboss.tools.seam.core.project.facet.SeamRuntimeManager; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; /** * * @author eskimo * */ public abstract class SeamFacetAbstractInstallDelegate implements ILogListener, IDelegate, ISeamFacetDataModelProperties, SeamLibFileSetProvider { public static final String MOJARRA_1_2 = "Mojarra-1.2"; //$NON-NLS-1$ public static final String ORG_JBOSS_JBOSSFACES_JSF_CONFIG_NAME = "org.jboss.jbossfaces.JSF_CONFIG_NAME"; //$NON-NLS-1$ public static String ORG_RICHFACES_SKIN = "org.richfaces.SKIN"; //$NON-NLS-1$ public static String ORG_RICHFACES_SKIN_VALUE = "blueSky"; //$NON-NLS-1$ public static String ORG_JBOSS_SEAM_SERVLET_SEAMLISTENER = "org.jboss.seam.servlet.SeamListener"; //$NON-NLS-1$ public static String ORG_JBOSS_SEAM_SERVLET_SEAMFILTER = "org.jboss.seam.servlet.SeamFilter"; //$NON-NLS-1$ public static String ORG_JBOSS_SEAM_SERVLET_SEAMFILTER_NAME = "Seam Filter"; //$NON-NLS-1$ public static String ORG_JBOSS_SEAM_SERVLET_SEAMFILTER_MAPPING_VALUE = "/*"; //$NON-NLS-1$ public static String ORG_JBOSS_SEAM_SERVLET_SEAMRESOURCESERVLET = "org.jboss.seam.servlet.SeamResourceServlet"; //$NON-NLS-1$ public static String ORG_JBOSS_SEAM_SERVLET_SEAMRESOURCESERVLET_NAME = "Seam Resource Servlet"; //$NON-NLS-1$ public static String ORG_JBOSS_SEAM_SERVLET_SEAMRESOURCESERVLET_VALUE = "/seam/resource/*"; //$NON-NLS-1$ public static String FACELETS_DEVELOPMENT = "facelets.DEVELOPMENT"; //$NON-NLS-1$ public static String JAVAX_FACES_DEFAULT_SUFFIX = "javax.faces.DEFAULT_SUFFIX"; //$NON-NLS-1$ public static String JAVAX_FACES_DEFAULT_SUFFIX_VALUE = ".xhtml"; //$NON-NLS-1$ public static String RESTRICT_RAW_XHTML = SeamCoreMessages.SeamFacetAbstractInstallDelegate_Restrict_raw_XHTML_Documents; public static String XHTML = "XHTML"; //$NON-NLS-1$ public static String WEB_RESOURCE_COLLECTION_PATTERN = "*.xhtml"; //$NON-NLS-1$ public static String SEAM_LIB_RELATED_PATH = "lib"; //$NON-NLS-1$ public static final String DEV_WAR_PROFILE = "dev-war"; //$NON-NLS-1$ public static final String DEV_EAR_PROFILE = "dev"; //$NON-NLS-1$ protected IDataModel facetModel; public static AntCopyUtils.FileSet JBOOS_EJB_WEB_INF_CLASSES_SET = new AntCopyUtils.FileSet() .include("import\\.sql") //$NON-NLS-1$ .include("seam\\.properties") //$NON-NLS-1$ .exclude(".*/WEB-INF"); //$NON-NLS-1$ public static AntCopyUtils.FileSet VIEW_FILESET = new AntCopyUtils.FileSet() .include("home\\.xhtml") //$NON-NLS-1$ .include("error\\.xhtml") //$NON-NLS-1$ .include("login\\.xhtml") //$NON-NLS-1$ .include("login\\.page.xml") //$NON-NLS-1$ .include("index\\.html") //$NON-NLS-1$ .include("layout") //$NON-NLS-1$ .include("layout/.*") //$NON-NLS-1$ .include("stylesheet") //$NON-NLS-1$ .include("stylesheet/.*") //$NON-NLS-1$ //.include("img/.*") //$NON-NLS-1$ //.include("img") //$NON-NLS-1$ .exclude(".*/.*\\.ftl") //$NON-NLS-1$ .exclude(".*/CVS") //$NON-NLS-1$ .exclude(".*/\\.svn"); //$NON-NLS-1$ public static AntCopyUtils.FileSet DEFAULT_JBOOS_WAR_WEBINF_SET = new AntCopyUtils.FileSet() .include("WEB-INF") //$NON-NLS-1$ //.include("WEB-INF/web\\.xml") //$NON-NLS-1$ .include("WEB-INF/pages\\.xml") //$NON-NLS-1$ .include("WEB-INF/jboss-web\\.xml") //$NON-NLS-1$ // .include("WEB-INF/faces-config\\.xml") //$NON-NLS-1$ .include("WEB-INF/componets\\.xml"); //$NON-NLS-1$ public static AntCopyUtils.FileSet JBOOS_WAR_WEB_INF_CLASSES_SET = new AntCopyUtils.FileSet() .include("import\\.sql") //$NON-NLS-1$ .include("security\\.drl") //$NON-NLS-1$ .include("seam\\.properties") //$NON-NLS-1$ .include("messages_en\\.properties"); //$NON-NLS-1$ public static String WEB_LIBRARIES_RELATED_PATH = "WEB-INF/lib"; //$NON-NLS-1$ static AntCopyUtils.FileSet CVS_SVN = new AntCopyUtils.FileSet() .include(".*") //$NON-NLS-1$ .exclude(".*/CVS") //$NON-NLS-1$ .exclude("CVS") //$NON-NLS-1$ .exclude(".*\\.svn") //$NON-NLS-1$ .exclude(".*/\\.svn"); //$NON-NLS-1$ private static IOverwriteQuery OVERWRITE_ALL = new IOverwriteQuery() { public String queryOverwrite(String file) { return ALL; } }; protected AntCopyUtils.FileSet getJBossWarWebinfSet() { return DEFAULT_JBOOS_WAR_WEBINF_SET; } /* (non-Javadoc) * @see org.eclipse.wst.common.project.facet.core.IDelegate#execute(org.eclipse.core.resources.IProject, org.eclipse.wst.common.project.facet.core.IProjectFacetVersion, java.lang.Object, org.eclipse.core.runtime.IProgressMonitor) */ public void execute(IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException { try { // TODO find a better way to handle exceptions for creating seam projects // now here is the simple way that allows keep most of seam classes // untouched, this abstract class just listen to eclipse log and show an // error dialog if there were records logged from seam.core plugin startListening(); IDataModel model = (IDataModel) config; facetModel = model; doExecute(project,fv,config,monitor); boolean createEarProjects = model.getBooleanProperty(ISeamFacetDataModelProperties.CREATE_EAR_PROJECTS); if (createEarProjects) { // Create ear, ejb, test projects JBIDE-3782 getProjectCreator(model, project, this).execute(monitor); } } finally { stopListening(); } if(errorOccurs) { errorOccurs = false; Display.getDefault().syncExec( new Runnable() { public void run() { ErrorDialog.openError(Display.getCurrent().getActiveShell(), SeamCoreMessages.SEAM_FACET_INSTALL_ABSTRACT_DELEGATE_ERROR, SeamCoreMessages.SEAM_FACET_INSTALL_ABSTRACT_DELEGATE_CHECK_ERROR_LOG_VIEW, new Status(IStatus.ERROR,SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.SEAM_FACET_INSTALL_ABSTRACT_DELEGATE_ERRORS_OCCURED)); } }); } } public static boolean toggleHibernateOnProject(IProject project, String defaultConsoleName) { IScopeContext scope = new ProjectScope(project); Preferences node = scope.getNode("org.hibernate.eclipse.console"); //$NON-NLS-1$ if(node!=null) { node.putBoolean("hibernate3.enabled", true ); //$NON-NLS-1$ node.put("default.configuration", defaultConsoleName ); //$NON-NLS-1$ try { node.flush(); } catch (BackingStoreException e) { SeamCorePlugin.getDefault().logError(SeamCoreMessages.SeamFacetAbstractInstallDelegate_Could_not_save_changes_to_preferences, e); return false; } } else { return false; } try { addProjectNature(project, "org.hibernate.eclipse.console.hibernateNature", new NullProgressMonitor() ); //$NON-NLS-1$ return true; } catch(CoreException ce) { SeamCorePlugin.getDefault().logError(SeamCoreMessages.SeamFacetAbstractInstallDelegate_Could_not_activate_Hibernate_nature_on_project + project.getName(), ce); return false; } } /** * Add the given project nature to the given project (if it isn't already added). * * @param project * @param nature * @param monitor * @return true if nature where added, false if not * @throws OperationCanceledException if job were canceled or CoreException if something went wrong. */ public static boolean addProjectNature(IProject project, String nature, IProgressMonitor monitor) throws CoreException { if (monitor != null && monitor.isCanceled()) { throw new OperationCanceledException(); } if (!project.hasNature(nature)) { IProjectDescription description = project.getDescription(); String[] prevNatures = description.getNatureIds(); String[] newNatures = new String[prevNatures.length + 1]; System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length); newNatures[prevNatures.length] = nature; description.setNatureIds(newNatures); project.setDescription(description, monitor); return true; } else { monitor.worked(1); return false; } } /** * * @param model * @return */ public static boolean isWarConfiguration(IDataModel model) { return ISeamFacetDataModelProperties.DEPLOY_AS_WAR.equals(model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS)); } static void createComponentsProperties(final File seamGenResFolder, String projectName, Boolean embedded) { Properties components = new Properties(); String prefix = "".equals(projectName) ? "" : projectName + "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ components.put("embeddedEjb", embedded.toString()); //$NON-NLS-1$ components.put("jndiPattern", prefix + "#{ejbName}/local"); //$NON-NLS-1$ //$NON-NLS-2$ File componentsProps = new File(seamGenResFolder, "components.properties"); //$NON-NLS-1$ try { componentsProps.createNewFile(); components.store(new FileOutputStream(componentsProps), ""); //$NON-NLS-1$ } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } private IVirtualFolder warDefaultSrcRootFolder; protected IVirtualFolder warModelSrcRootFolder; protected IVirtualFolder warActionSrcRootFolder; protected File seamHomeFolder; protected String seamHomePath; protected File seamLibFolder; protected File seamGenResFolder; protected File srcFolder; protected File webContentFolder; protected IPath webContentPath; protected File webLibFolder; protected IContainer webRootFolder; protected File seamGenHomeFolder; protected File seamGenViewSource; protected File dataSourceDsFile; protected File componentsFile; protected File webInfFolder; protected File webInfClasses; protected File webInfClassesMetaInf; protected File persistenceFile; protected File hibernateConsoleLaunchFile; protected File hibernateConsolePropsFile; /** * * @param project * @param fv * @param model * @param monitor * @throws CoreException */ protected void doExecuteForWar(IProject project, IProjectFacetVersion fv, IDataModel model, IProgressMonitor monitor) throws CoreException { // get WebContents folder path from DWP model IVirtualComponent component = ComponentCore.createComponent(project); IVirtualFolder webRootVirtFolder = component.getRootFolder().getFolder(new Path("/")); //$NON-NLS-1$ warDefaultSrcRootFolder = component.getRootFolder().getFolder(new Path("/WEB-INF/classes")); //$NON-NLS-1$ IContainer[] roots = webRootVirtFolder.getUnderlyingFolders(); webRootFolder = null; if(roots.length>1) { for (IContainer container : roots) { if(!container.getFullPath().toString().contains("/target/")) { //$NON-NLS-1$ webRootFolder = container; break; } } } if(webRootFolder==null) { webRootFolder = webRootVirtFolder.getUnderlyingFolder(); } webContentFolder = webRootFolder.getLocation().toFile(); webContentPath = webRootFolder.getFullPath(); webInfFolder = new File(webContentFolder, "WEB-INF"); //$NON-NLS-1$ webInfClasses = new File(webInfFolder, "classes"); //$NON-NLS-1$ webInfClassesMetaInf = new File(webInfClasses, "META-INF"); //$NON-NLS-1$ webInfClassesMetaInf.mkdirs(); webLibFolder = new File(webContentFolder, WEB_LIBRARIES_RELATED_PATH); srcFolder = isWarConfiguration(model) ? new File(warDefaultSrcRootFolder.getUnderlyingFolder().getLocation().toFile(), DEFAULT_MODEL_SRC_FOLDER_NAME) : warDefaultSrcRootFolder.getUnderlyingFolder().getLocation().toFile(); if (model.getBooleanProperty(CONFIGURE_WAR_PROJECT)) { Object runtimeName = model.getProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME); if (runtimeName != null) { copyFilesToWarProject(project, fv, model, monitor); } else { // If seam runtime is null then just modify web.xml and add seam nature. configureWebXml(project); } } } protected String getFacesConfigPath(WebApp webApp) { if(webApp==null) { return JSFUtils.JSF_DEFAULT_CONFIG_PATH; } File facesConfig = new File(webContentFolder, JSFUtils.JSF_DEFAULT_CONFIG_PATH); if(facesConfig.exists()) { return JSFUtils.JSF_DEFAULT_CONFIG_PATH; } String path = null; Iterator it = webApp.getContextParams().iterator(); while (it.hasNext()) { ParamValue cp = (ParamValue) it.next(); if (cp != null && cp.getParamName()!= null && cp.getParamName().trim().equals(JSFUtils.JSF_CONFIG_CONTEXT_PARAM)) { path = cp.getParamValue().trim(); if(path.length()>0) { facesConfig = new File(webContentFolder, path); if(facesConfig.exists()) { return path; } } } } return JSFUtils.JSF_DEFAULT_CONFIG_PATH; } /** * * @param project * @param fv * @param model * @param monitor * @throws CoreException */ protected void copyFilesToWarProject(IProject project, IProjectFacetVersion fv, IDataModel model, IProgressMonitor monitor) throws CoreException { if(!shouldCopyLibrariesAndTemplates(model)) return; final AntCopyUtils.FileSet viewFileSet = new AntCopyUtils.FileSet(VIEW_FILESET).dir(seamGenViewSource); AntCopyUtils.copyFilesAndFolders( seamGenViewSource, webContentFolder, new AntCopyUtils.FileSetFileFilter(viewFileSet), viewFilterSetCollection, false); IImportStructureProvider structureProvider = FileSystemStructureProvider.INSTANCE; File rootDir = new File(seamGenViewSource,"img"); //$NON-NLS-1$ IPath imgPath = webContentPath.append("img"); //$NON-NLS-1$ try { ImportOperation op= new ImportOperation(imgPath, rootDir, structureProvider, OVERWRITE_ALL); op.setCreateContainerStructure(false); op.run(monitor); } catch (InterruptedException e) { // should not happen } catch (InvocationTargetException e) { Throwable t = e.getTargetException(); if (t instanceof CoreException) { ErrorDialog.openError(Display.getCurrent().getActiveShell(), SeamCoreMessages.SeamFacetAbstractInstallDelegate_Error, null, ((CoreException) t).getStatus()); } } // ******************************************************************* // Copy manifest and configuration resources the same way as view // ******************************************************************* AntCopyUtils.FileSet webInfSet = new AntCopyUtils.FileSet(getJBossWarWebinfSet()).dir(seamGenResFolder); WebApp webApp = configureWebXml(project); AntCopyUtils.copyFileToFile( componentsFile, new File(webInfFolder, "components.xml"), //$NON-NLS-1$ new FilterSetCollection(projectFilterSet), false); String facesConfigPath = getFacesConfigPath(webApp); configureFacesConfigXml(project, monitor, facesConfigPath); AntCopyUtils.copyFilesAndFolders( seamGenResFolder, webContentFolder, new AntCopyUtils.FileSetFileFilter(webInfSet), viewFilterSetCollection, false); final FilterSetCollection hibernateDialectFilterSet = new FilterSetCollection(); hibernateDialectFilterSet.addFilterSet(encodedJdbcFilterSet); hibernateDialectFilterSet.addFilterSet(encodedProjectFilterSet); hibernateDialectFilterSet.addFilterSet(SeamFacetFilterSetFactory.createHibernateDialectFilterSet(model, true)); final IContainer source = warDefaultSrcRootFolder.getUnderlyingFolder(); // ******************************************************************************************** // Handle WAR configurations // ******************************************************************************************** if (isWarConfiguration(model)) { boolean sourcesDoesNotExist = warDefaultSrcRootFolder.members().length==0; // ******************************************************************************************** // Copy seam project indicator // ******************************************************************************************** IPath actionSrcPath = new Path(source.getFullPath().removeFirstSegments(1) + "/" + DEFAULT_ACTION_SRC_FOLDER_NAME); //$NON-NLS-1$ IPath modelSrcPath = new Path(source.getFullPath().removeFirstSegments(1) + "/" + DEFAULT_MODEL_SRC_FOLDER_NAME); //$NON-NLS-1$ if(sourcesDoesNotExist) { // Remove old source folder and create new ones. warDefaultSrcRootFolder.delete(IVirtualFolder.FORCE, monitor); WtpUtils.createSourceFolder(project, actionSrcPath, source.getFullPath().removeFirstSegments(1), webRootFolder.getFullPath().removeFirstSegments(1).append("WEB-INF/dev")); //$NON-NLS-1$ WtpUtils.createSourceFolder(project, modelSrcPath, source.getFullPath().removeFirstSegments(1), null); IVirtualComponent component = ComponentCore.createComponent(project); warModelSrcRootFolder = component.getRootFolder().getFolder(new Path("/WEB-INF/classes")); //$NON-NLS-1$ warActionSrcRootFolder = component.getRootFolder().getFolder(new Path("/WEB-INF/dev")); //$NON-NLS-1$ warModelSrcRootFolder.createLink(modelSrcPath, 0, null); warActionSrcRootFolder.createLink(actionSrcPath, 0, null); } else { // In case if user alrady has some resources we should not remove it. actionSrcPath = source.getFullPath().removeFirstSegments(1); modelSrcPath = actionSrcPath; srcFolder = source.getLocation().toFile(); warActionSrcRootFolder = warDefaultSrcRootFolder; warModelSrcRootFolder = warDefaultSrcRootFolder; } File actionsSrc = new File(project.getLocation().toFile(), actionSrcPath.toOSString()); AntCopyUtils.FileSet webInfClassesSet = new AntCopyUtils.FileSet(JBOOS_WAR_WEB_INF_CLASSES_SET).dir(seamGenResFolder); AntCopyUtils.copyFilesAndFolders( seamGenResFolder, srcFolder, new AntCopyUtils.FileSetFileFilter(webInfClassesSet), viewFilterSetCollection, false); createComponentsProperties(srcFolder, "", false); //$NON-NLS-1$ //AntCopyUtils.copyFileToFolder(new File(seamGenResFolder, "seam.properties"), actionsSrc, true); //$NON-NLS-1$ AntCopyUtils.copyFileToFile( new File(seamGenHomeFolder, "src/Authenticator.java"), //$NON-NLS-1$ new File(actionsSrc,model.getProperty(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME).toString().replace('.', '/') + "/" + "Authenticator.java"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ new FilterSetCollection(filtersFilterSet), false); AntCopyUtils.copyFileToFile( persistenceFile, new File(srcFolder, "META-INF/persistence.xml"), //$NON-NLS-1$ viewFilterSetCollection, false); File resources = new File(project.getLocation().toFile(), "resources"); //$NON-NLS-1$ AntCopyUtils.copyFileToFile( dataSourceDsFile, new File(resources, project.getName() + "-ds.xml"), //$NON-NLS-1$ viewFilterSetCollection, false); if (hibernateConsoleLaunchFile != null) { AntCopyUtils.copyFileToFile( hibernateConsoleLaunchFile, new File(project.getLocation().toFile(), getLaunchCfgName(project.getName()) + ".launch"), //$NON-NLS-1$ viewFilterSetCollection, false); } AntCopyUtils.copyFileToFolder( hibernateConsolePropsFile, project.getLocation().toFile(), hibernateDialectFilterSet, false); WtpUtils.setClasspathEntryAsExported(project, new Path("org.eclipse.jst.j2ee.internal.web.container"), monitor); //$NON-NLS-1$ } else { // In case of EAR configuration AntCopyUtils.copyFileToFolder(new File(seamGenResFolder, "messages_en.properties"), srcFolder, false); //$NON-NLS-1$ WtpUtils.createSourceFolder(project, source.getFullPath().removeFirstSegments(1), source.getFullPath().removeFirstSegments(1), webRootFolder.getFullPath().removeFirstSegments(1).append("WEB-INF/dev")); //$NON-NLS-1$ } } protected String getLaunchCfgName(String baseName){ ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager(); return lm.generateUniqueLaunchConfigurationNameFrom(baseName); } protected File earContentsFolder; protected File earLibFolder; /** * * @param project * @param fv * @param model * @param monitor * @throws CoreException */ protected void doExecuteForEar(IProject project, IProjectFacetVersion fv, IDataModel model, IProgressMonitor monitor) throws CoreException { if(seamHomePath==null) { return; } model.setProperty(ISeamFacetDataModelProperties.SEAM_EAR_PROJECT, project.getName()); IVirtualComponent component = ComponentCore.createComponent(project); IVirtualFolder rootVirtFolder = component.getRootFolder().getFolder(new Path("/")); //$NON-NLS-1$ earContentsFolder = rootVirtFolder.getUnderlyingFolder().getLocation().toFile(); earLibFolder = new File(earContentsFolder, "lib"); File metaInfFolder = new File(earContentsFolder, "META-INF"); //$NON-NLS-1$ File applicationXml = new File(metaInfFolder, "application.xml"); //$NON-NLS-1$ File earProjectFolder = project.getLocation().toFile(); FilterSet earFilterSet = new FilterSet(); earFilterSet.addFilter("projectName", project.getName() + ".ear"); //$NON-NLS-1$ //$NON-NLS-2$ if(shouldCopyLibrariesAndTemplates(model)){ AntCopyUtils.copyFileToFolder( new File(seamGenResFolder, "META-INF/jboss-app.xml"), //$NON-NLS-1$ metaInfFolder, new FilterSetCollection(earFilterSet), false); } if(applicationXml.exists()) { configureApplicationXml(project, monitor); } if(shouldCopyLibrariesAndTemplates(model)){ // Copy configuration files from template try { AntCopyUtils.copyFilesAndFolders( new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "ear"), //$NON-NLS-1$ earProjectFolder, new FilterSetCollection(ejbFilterSet), false); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } fillEarContents(project, model); if(shouldCopyLibrariesAndTemplates(model)){ File resources = new File(earProjectFolder, "resources"); //$NON-NLS-1$ AntCopyUtils.copyFileToFile( dataSourceDsFile, new File(resources, project.getName() + "-ds.xml"), //$NON-NLS-1$ viewFilterSetCollection, false); } } protected void configureApplicationXml(IProject project, IProgressMonitor monitor) { EARArtifactEdit earArtifactEdit = null; try { earArtifactEdit = EARArtifactEdit.getEARArtifactEditForWrite(project); if(earArtifactEdit!=null) { Application application = earArtifactEdit.getApplication(); EList modules = application.getModules(); boolean moduleExists = false; for (Iterator iterator = modules.iterator(); iterator.hasNext();) { Object module = iterator.next(); if(module instanceof EjbModule) { EjbModule ejbModule = (EjbModule)module; if("jboss-seam.jar".equals(ejbModule.getUri())) { //$NON-NLS-1$ moduleExists = true; break; } } } if(!moduleExists) { EjbModule module = ApplicationFactory.eINSTANCE.createEjbModule(); module.setUri("jboss-seam.jar"); //$NON-NLS-1$ application.getModules().add(module); } earArtifactEdit.save(monitor); } } finally { if(earArtifactEdit!=null) { earArtifactEdit.dispose(); } } } /** * Fill ear contents */ abstract protected void fillEarContents(IProject project, IDataModel model); protected IResource getSrcFolder(IProject project) throws JavaModelException { IJavaProject javaProject = EclipseResourceUtil.getJavaProject(project); IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots(); IPackageFragmentRoot src = null; for (int i= 0; i < roots.length; i++) { if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) { src = roots[i]; } } if(src!=null) { return src.getResource(); } return null; } /** * * @param project * @param fv * @param model * @param monitor * @throws CoreException */ protected void doExecuteForEjb(final IProject project, IProjectFacetVersion fv, IDataModel model, IProgressMonitor monitor) throws CoreException { if(seamHomePath == null) { return; } File ejbProjectFolder = project.getLocation().toFile(); FilterSet filtersFilterSet = SeamFacetFilterSetFactory.createFiltersFilterSet(model); FilterSet jdbcFilterSet = SeamFacetFilterSetFactory.createJdbcFilterSet(model); FilterSet projectFilterSet = SeamFacetFilterSetFactory.createProjectFilterSet(model); FilterSetCollection hibernateDialectFilterSet = new FilterSetCollection(); hibernateDialectFilterSet.addFilterSet(encodedJdbcFilterSet); hibernateDialectFilterSet.addFilterSet(encodedProjectFilterSet); hibernateDialectFilterSet.addFilterSet(SeamFacetFilterSetFactory.createHibernateDialectFilterSet(model, true)); IResource src = getSrcFolder(project); if(src!=null) { viewFilterSetCollection = new FilterSetCollection(); viewFilterSetCollection.addFilterSet(jdbcFilterSet); viewFilterSetCollection.addFilterSet(projectFilterSet); File srcFile = src.getLocation().toFile(); if(shouldCopyLibrariesAndTemplates(model)){ // Copy sources to EJB project in case of EAR configuration AntCopyUtils.copyFileToFile( new File(seamGenHomeFolder, "src/Authenticator.java"), //$NON-NLS-1$ new File(srcFile, model.getProperty(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME).toString().replace('.', '/') + "/" + "Authenticator.java"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ new FilterSetCollection(filtersFilterSet), false); } File persistentXml = new File(srcFile, "META-INF/persistence.xml"); //$NON-NLS-1$ if(!persistentXml.exists() && shouldCopyLibrariesAndTemplates(model)) { AntCopyUtils.copyFileToFile(persistenceFile, new File(srcFile, "META-INF/persistence.xml"), //$NON-NLS-1$ viewFilterSetCollection, false); } else { // TODO modify persistence.xml } File componentProperties = new File(srcFile, "components.properties"); //$NON-NLS-1$ if(!componentProperties.exists()) { SeamFacetAbstractInstallDelegate.createComponentsProperties(srcFile, project.getName(), false); } AntCopyUtils.FileSet ejbSrcResourcesSet = new AntCopyUtils.FileSet(JBOOS_EJB_WEB_INF_CLASSES_SET).dir(seamGenResFolder); if(shouldCopyLibrariesAndTemplates(model)){ AntCopyUtils.copyFilesAndFolders(seamGenResFolder, srcFile, new AntCopyUtils.FileSetFileFilter(ejbSrcResourcesSet), viewFilterSetCollection, false); } File ejbJarXml = new File(srcFile, "META-INF/ejb-jar.xml"); //$NON-NLS-1$ if(!ejbJarXml.exists() && shouldCopyLibrariesAndTemplates(model)) { AntCopyUtils.copyFileToFolder(new File(seamGenResFolder, "META-INF/ejb-jar.xml"), //$NON-NLS-1$ new File(srcFile, "META-INF"), viewFilterSetCollection, false); //$NON-NLS-1$ } else { // TODO modify ejb-jar.xml } } if(shouldCopyLibrariesAndTemplates(model)){ AntCopyUtils.copyFileToFile( hibernateConsoleLaunchFile, new File(ejbProjectFolder, getLaunchCfgName(ejbProjectFolder.getName()) + ".launch"), //$NON-NLS-1$ new FilterSetCollection(ejbFilterSet), false); AntCopyUtils.copyFileToFolder(hibernateConsolePropsFile, ejbProjectFolder, hibernateDialectFilterSet, false); } } enum ProjectType { EAR, EJB, WAR } protected ProjectType projectType; protected FilterSet ejbFilterSet; protected FilterSetCollection viewFilterSetCollection; protected FilterSet jdbcFilterSet; protected FilterSet encodedJdbcFilterSet; protected FilterSet projectFilterSet; protected FilterSet encodedProjectFilterSet; protected FilterSet filtersFilterSet; /** * * @param project * @param fv * @param config * @param monitor * @throws CoreException */ public void doExecute(final IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException { final IDataModel model = (IDataModel)config; IFacetedProject facetedProject = ProjectFacetsManager.create(project); IProjectFacetVersion ejbVersion = facetedProject.getProjectFacetVersion(IJ2EEFacetConstants.EJB_FACET); IProjectFacetVersion webVersion = facetedProject.getProjectFacetVersion(IJ2EEFacetConstants.DYNAMIC_WEB_FACET); IProjectFacetVersion earVersion = facetedProject.getProjectFacetVersion(IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET); IProjectFacetVersion jpaVersion = null; if(ProjectFacetsManager.isProjectFacetDefined("jpt.jpa")) jpaVersion = facetedProject.getProjectFacetVersion(ProjectFacetsManager.getProjectFacet("jpt.jpa")); initDefaultModelValues(model, webVersion!=null); model.setProperty(ISeamFacetDataModelProperties.SEAM_PROJECT_NAME, project.getName()); Boolean dbExists = (Boolean) model.getProperty(ISeamFacetDataModelProperties.DB_ALREADY_EXISTS); Boolean dbRecreate = (Boolean) model.getProperty(ISeamFacetDataModelProperties.RECREATE_TABLES_AND_DATA_ON_DEPLOY); if (!dbExists && !dbRecreate) { model.setProperty(ISeamFacetDataModelProperties.HIBERNATE_HBM2DDL_AUTO, "update"); //$NON-NLS-1$ } else if (dbExists && !dbRecreate) { model.setProperty(ISeamFacetDataModelProperties.HIBERNATE_HBM2DDL_AUTO, "validate"); //$NON-NLS-1$ } else if (dbRecreate) { model.setProperty(ISeamFacetDataModelProperties.HIBERNATE_HBM2DDL_AUTO, "create-drop"); //$NON-NLS-1$ } jdbcFilterSet = SeamFacetFilterSetFactory.createJdbcFilterSet(model); encodedJdbcFilterSet = SeamFacetFilterSetFactory.createJdbcFilterSet(model, true); projectFilterSet = SeamFacetFilterSetFactory.createProjectFilterSet(model); encodedProjectFilterSet = SeamFacetFilterSetFactory.createProjectFilterSet(model, true); filtersFilterSet = SeamFacetFilterSetFactory.createFiltersFilterSet(model); // **************************************************************** // Copy view folder from seam-gen installation to WebContent folder // **************************************************************** final AntCopyUtils.FileSet viewFileSet = new AntCopyUtils.FileSet(VIEW_FILESET).dir(seamGenViewSource); viewFilterSetCollection = new FilterSetCollection(); viewFilterSetCollection.addFilterSet(jdbcFilterSet); viewFilterSetCollection.addFilterSet(projectFilterSet); viewFilterSetCollection.addFilterSet(SeamFacetFilterSetFactory.createHibernateDialectFilterSet(model)); Object runtimeName = model.getProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME); if(runtimeName!=null) { final SeamRuntime selectedRuntime = SeamRuntimeManager.getInstance().findRuntimeByName(runtimeName.toString()); seamHomePath = selectedRuntime.getHomeDir(); seamHomeFolder = new File(seamHomePath); seamLibFolder = new File(seamHomePath, SEAM_LIB_RELATED_PATH); seamGenResFolder = new File(seamHomePath, "seam-gen/resources"); //$NON-NLS-1$ seamGenHomeFolder = new File(seamHomePath, "seam-gen"); //$NON-NLS-1$ seamGenViewSource = new File(seamGenHomeFolder, "view"); //$NON-NLS-1$ dataSourceDsFile = new File(seamGenResFolder, "datasource-ds.xml"); //$NON-NLS-1$ componentsFile = new File(seamGenResFolder, "WEB-INF/components" + (isWarConfiguration(model) ? "-war" : "") + ".xml"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ hibernateConsolePropsFile = new File(seamGenHomeFolder, "hibernatetools/hibernate-console.properties"); //$NON-NLS-1$ /*if (jpaVersion != null) { IScopeContext context = new ProjectScope(project); IEclipsePreferences prefs = context.getNode("org.eclipse.jpt.core"); String platformId = prefs.get("org.eclipse.jpt.core.platform", null); if ("hibernate".equals(platformId)){ // Hibernate automatically creates console configuration hibernateConsoleLaunchFile = null; } else { try { hibernateConsoleLaunchFile = new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "hibernatetools/hibernate-console_jpa.launch");//$NON-NLS-1$ } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } //hibernateConsoleLaunchFile = new File(seamGenHomeFolder, "hibernatetools/hibernate-console_jpa.launch"); //$NON-NLS-1$ } } else { try { hibernateConsoleLaunchFile = new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "hibernatetools/hibernate-console.launch"); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } //hibernateConsoleLaunchFile = new File(seamGenHomeFolder, "hibernatetools/hibernate-console.launch"); //$NON-NLS-1$ }*/ try { hibernateConsoleLaunchFile = new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "hibernatetools/hibernate-console.launch"); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } if (jpaVersion != null) { IScopeContext context = new ProjectScope(project); IEclipsePreferences prefs = context.getNode("org.eclipse.jpt.core"); String platformId = prefs.get("org.eclipse.jpt.core.platform", null); if ("hibernate".equals(platformId)){ // Delete launch configuration ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager(); ILaunchConfigurationType lct = lm.getLaunchConfigurationType("org.hibernate.eclipse.launch.ConsoleConfigurationLaunchConfigurationType"); ILaunchConfiguration[] lcs = lm.getLaunchConfigurations(lct); ILaunchConfiguration lsForDelete = null; for(int i = 0; i < lcs.length && lcs[i].exists(); i++) { String lcProject = lcs[i].getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null); if (project.getName().equals(lcProject)) { lsForDelete = lcs[i]; break; } } if (lsForDelete != null){ lsForDelete.delete(); } try { hibernateConsoleLaunchFile = new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "hibernatetools/hibernate-console_jpa.launch");//$NON-NLS-1$ } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } } //final File hibernateConsolePref = new File(seamGenHomeFolder, "hibernatetools/.settings/org.hibernate.eclipse.console.prefs"); //$NON-NLS-1$ persistenceFile = new File(seamGenResFolder, "META-INF/persistence-" + (isWarConfiguration(model) ? DEV_WAR_PROFILE : DEV_EAR_PROFILE) + ".xml"); //$NON-NLS-1$ //$NON-NLS-2$ ejbFilterSet = new FilterSet(); ejbFilterSet.addFilter("projectName", project.getName()); //$NON-NLS-1$ String serverRuntimeName = WtpUtils.getServerRuntimeName(project); if(serverRuntimeName!=null) { ejbFilterSet.addFilter("runtimeName", serverRuntimeName); //$NON-NLS-1$ } if (model.getProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATHS_ARRAY) != null) { File driver = new File(((String[]) model.getProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATHS_ARRAY))[0]); ejbFilterSet.addFilter("driverJar", " " + driver.getName() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ viewFilterSetCollection.addFilterSet(getDriverFilterSet(model)); } else { ejbFilterSet.addFilter("driverJar", ""); //$NON-NLS-1$ //$NON-NLS-2$ } } else { seamHomePath = null; } if(ejbVersion!=null) { projectType = ProjectType.EJB; doExecuteForEjb(project, fv, model, monitor); } else if(webVersion!=null) { projectType = ProjectType.WAR; doExecuteForWar(project, fv, model, monitor); } else if(earVersion!=null) { projectType = ProjectType.EAR; doExecuteForEar(project, fv, model, monitor); } if(projectType != ProjectType.EAR) { ClasspathHelper.addClasspathEntries(project, fv); createSeamProjectPreferenes(project, model); // EclipseResourceUtil.addNatureToProject(project, ISeamProject.NATURE_ID); SeamUtil.enableSeamSupport(project); } project.refreshLocal(IResource.DEPTH_INFINITE, monitor); } public static FilterSet getDriverFilterSet(IDataModel model) { if (model.getProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATHS_ARRAY) != null) { File driver = new File(((String[]) model.getProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATHS_ARRAY))[0]); FilterSet dbTypeFilterSet = new FilterSet(); dbTypeFilterSet.addFilter("database.type", driver.getName()); return dbTypeFilterSet; } return null; } private void initDefaultModelValues(IDataModel model, boolean warProject) { if(model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS)==null) { model.setProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS, warProject?ISeamFacetDataModelProperties.DEPLOY_AS_WAR:ISeamFacetDataModelProperties.DEPLOY_AS_EAR); } String projectNamePackage = (String)model.getProperty(ISeamFacetDataModelProperties.SEAM_PROJECT_NAME); projectNamePackage = SeamUtil.getSeamPackageName(projectNamePackage); IStatus status = JavaConventions.validatePackageName(projectNamePackage, CompilerOptions.VERSION_1_5, CompilerOptions.VERSION_1_5); if(!status.isOK()) { projectNamePackage = "project"; //$NON-NLS-1$ } if(model.getProperty(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME)==null) { model.setProperty(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME, "org.domain." + projectNamePackage + ".session"); //$NON-NLS-1$ //$NON-NLS-2$ } if(model.getProperty(ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME)==null) { model.setProperty(ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME, "org.domain." + projectNamePackage + ".entity"); //$NON-NLS-1$ //$NON-NLS-2$ } if(model.getProperty(ISeamFacetDataModelProperties.TEST_PROJECT_CREATING)==null) { model.setProperty(ISeamFacetDataModelProperties.TEST_PROJECT_CREATING, new Boolean(true)); } if(model.getProperty(ISeamFacetDataModelProperties.TEST_CASES_PACKAGE_NAME)==null) { model.setProperty(ISeamFacetDataModelProperties.TEST_CASES_PACKAGE_NAME, "org.domain." + projectNamePackage + ".test"); //$NON-NLS-1$ //$NON-NLS-2$ } if(model.getProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME)==null && model.getBooleanProperty(CONFIGURE_DEFAULT_SEAM_RUNTIME)) { String runtimeName = SeamFacetInstallDataModelProvider.getSeamRuntimeDefaultValue(model); if((runtimeName!=null && runtimeName.length()>0)) { model.setProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, runtimeName); } } if(model.getProperty(ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE)==null) { String defaultDs = SeamProjectPreferences.getStringPreference(SeamProjectPreferences.SEAM_DEFAULT_CONNECTION_PROFILE); IConnectionProfile[] profiles = ProfileManager.getInstance().getProfilesByCategory("org.eclipse.datatools.connectivity.db.category"); //$NON-NLS-1$ List<String> names = new ArrayList<String>(); for (IConnectionProfile connectionProfile : profiles) { names.add(connectionProfile.getName()); } if(names.contains(defaultDs)) { model.setProperty(ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, defaultDs); } else if(!names.isEmpty()) { model.setProperty(ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, names.get(0)); } } } /** * */ private void stopListening() { SeamCorePlugin.getDefault().getLog().removeLogListener(this); } /** * */ private void startListening() { SeamCorePlugin.getDefault().getLog().addLogListener(this); } private boolean errorOccurs = false; private boolean hasErrors() { return errorOccurs; } /* (non-Javadoc) * @see org.eclipse.wst.common.project.facet.core.IActionConfigFactory#create() */ public Object create() throws CoreException { return null; } public void logging(IStatus status, String plugin) { if(status.getPlugin().equals(SeamCorePlugin.PLUGIN_ID)) { errorOccurs = true; } } /** * @param project * @param model */ protected void createSeamProjectPreferenes(final IProject project, final IDataModel model) { IScopeContext projectScope = new ProjectScope(project); IEclipsePreferences prefs = projectScope.getNode(SeamCorePlugin.PLUGIN_ID); prefs.put(SEAM_SETTINGS_VERSION, SEAM_SETTINGS_VERSION_1_1); boolean standaloneProject = true; if(projectType==ProjectType.EJB) { // Try to find parent web seam project for that ejb project. ISeamProject parentWebProject = SeamUtil.findReferencingSeamWarProjectForProject(project); if(parentWebProject!=null) { // set parent web Seam project. prefs.put(SEAM_PARENT_PROJECT, parentWebProject.getProject().getName()); standaloneProject = false; } } if(standaloneProject) { prefs.put(JBOSS_AS_DEPLOY_AS, model.getProperty(JBOSS_AS_DEPLOY_AS).toString()); if(model.getProperty(SEAM_RUNTIME_NAME)!=null) { prefs.put(SEAM_RUNTIME_NAME, model.getProperty(SEAM_RUNTIME_NAME).toString()); } if(model.getProperty(SEAM_CONNECTION_PROFILE)!=null) { prefs.put(SEAM_CONNECTION_PROFILE, model.getProperty(SEAM_CONNECTION_PROFILE).toString()); } prefs.put(SESSION_BEAN_PACKAGE_NAME, model.getProperty(SESSION_BEAN_PACKAGE_NAME).toString()); prefs.put(ENTITY_BEAN_PACKAGE_NAME, model.getProperty(ENTITY_BEAN_PACKAGE_NAME).toString()); prefs.put(TEST_CASES_PACKAGE_NAME, model.getProperty(TEST_CASES_PACKAGE_NAME).toString()); prefs.put(TEST_CREATING, "false"); //$NON-NLS-1$ prefs.put(SEAM_TEST_PROJECT, project.getName()); IVirtualComponent component = ComponentCore.createComponent(project); IVirtualFolder rootFolder = component.getRootFolder(); IContainer webRootFolder = rootFolder.getFolder(new Path("/")).getUnderlyingFolder(); //$NON-NLS-1$ String webRootFolderPath = webRootFolder.getFullPath().toString(); IPath srcRootFolder = null; if(projectType == ProjectType.WAR) { // Fix for https://issues.jboss.org/browse/JBIDE-9183 srcRootFolder = rootFolder.getFolder(new Path("/WEB-INF/classes")).getUnderlyingFolder().getFullPath(); //$NON-NLS-1$ // srcRootFolder = rootFolder.getFolder(new Path("/WEB-INF/classes")).getUnderlyingFolder().getParent().getFullPath(); //$NON-NLS-1$ } else if(projectType == ProjectType.EJB) { try { srcRootFolder = getSrcFolder(project).getFullPath(); } catch (JavaModelException e) { SeamCorePlugin.getPluginLog().logError(e); srcRootFolder = new Path(""); //$NON-NLS-1$ } } if(projectType == ProjectType.WAR) { prefs.put(WEB_CONTENTS_FOLDER, webRootFolderPath); } else { prefs.put(WEB_CONTENTS_FOLDER, srcRootFolder.toString()); } if(!isWarConfiguration(model)) { prefs.put(SEAM_EJB_PROJECT, project.getName()); prefs.put(SEAM_EAR_PROJECT, project.getName()); } prefs.put(ENTITY_BEAN_SOURCE_FOLDER, srcRootFolder.toString()); prefs.put(SESSION_BEAN_SOURCE_FOLDER, srcRootFolder.toString()); prefs.put(TEST_SOURCE_FOLDER, srcRootFolder.toString()); } try { prefs.flush(); } catch (BackingStoreException e) { SeamCorePlugin.getPluginLog().logError(e); } } protected void addSecurityConstraint(WebApp webApp) { SecurityConstraint securityConstraint = WebFactory.eINSTANCE .createSecurityConstraint(); DisplayName displayName = JavaeeFactory.eINSTANCE.createDisplayName(); displayName.setValue(RESTRICT_RAW_XHTML); securityConstraint.getDisplayNames().add(displayName); WebResourceCollection webResourceCollection = WebFactory.eINSTANCE .createWebResourceCollection(); webResourceCollection.setWebResourceName(XHTML); UrlPatternType urlPattern = JavaeeFactory.eINSTANCE .createUrlPatternType(); urlPattern.setValue(WEB_RESOURCE_COLLECTION_PATTERN); webResourceCollection.getUrlPatterns().add(urlPattern); AuthConstraint authConstraint = WebFactory.eINSTANCE .createAuthConstraint(); securityConstraint.setAuthConstraint(authConstraint); securityConstraint.getWebResourceCollections().add( webResourceCollection); webApp.getSecurityConstraints().add(securityConstraint); } protected void createOrUpdateServletMapping(WebApp webApp, String name, String value) { if (name == null || value == null) return; List servletMappings = webApp.getServletMappings(); boolean added = false; for (Iterator iterator = servletMappings.iterator(); iterator.hasNext();) { ServletMapping servletMapping = (ServletMapping) iterator.next(); if (servletMapping != null && name.equals(servletMapping.getServletName())) { added = true; // FIXME } } if (!added) { ServletMapping mapping = WebFactory.eINSTANCE .createServletMapping(); Servlet servlet = findServletByName(webApp, name); if (servlet != null) { mapping.setServletName(servlet.getServletName()); UrlPatternType urlPattern = JavaeeFactory.eINSTANCE .createUrlPatternType(); urlPattern.setValue(value); mapping.getUrlPatterns().add(urlPattern); webApp.getServletMappings().add(mapping); } } } private Servlet findServletByName(WebApp webApp, String name) { Iterator it = webApp.getServlets().iterator(); while (it.hasNext()) { Servlet servlet = (Servlet) it.next(); if (servlet.getServletName() != null && servlet.getServletName().trim().equals(name)) { return servlet; } } return null; } protected void createOrUpdateServlet(WebApp webApp, String servletClass, String servletName) { if (servletClass == null || servletName == null) return; List servlets = webApp.getServlets(); boolean added = false; for (Iterator iterator = servlets.iterator(); iterator.hasNext();) { Servlet servlet = (Servlet) iterator.next(); if (servletName.equals(servlet.getServletName())) { servlet.setServletName(servletName); added = true; break; } } if (!added) { Servlet servlet = WebFactory.eINSTANCE.createServlet(); servlet.setServletName(servletName); servlet.setServletClass(servletClass); webApp.getServlets().add(servlet); } } protected void createOrUpdateFilterMapping(WebApp webApp, String mapping, String value) { if (mapping == null || value == null) return; List filterMappings = webApp.getFilterMappings(); boolean added = false; /*for (Iterator iterator = filterMappings.iterator(); iterator.hasNext();) { FilterMapping filterMapping = (FilterMapping) iterator.next(); String filterName = filterMapping.getFilterName(); List filters = webApp.getFilters(); for (Iterator iterator2 = filters.iterator(); iterator2.hasNext();) { Filter filter = (Filter) iterator2.next(); if (filter != null && filterName != null && mapping.equals(filter.getFilterName())) { // FIXME added = true; break; } } if (added) break; }*/ if (!added) { FilterMapping filterMapping = WebFactory.eINSTANCE .createFilterMapping(); Filter filter = (Filter) getFilterByName(webApp, mapping); if (filter != null) { filterMapping.setFilterName(filter.getFilterName()); UrlPatternType urlPattern = JavaeeFactory.eINSTANCE .createUrlPatternType(); urlPattern.setValue(value); filterMapping.getUrlPatterns().add(urlPattern); webApp.getFilterMappings().add(filterMapping); } } } protected Object getFilterByName(WebApp webApp, String name) { if (webApp == null || name == null) return null; List filters = webApp.getFilters(); for (Iterator iterator = filters.iterator(); iterator.hasNext();) { Filter filter = (Filter) iterator.next(); if (filter != null && name.equals(filter.getFilterName())) return filter; } return null; } protected void createOrUpdateFilter(WebApp webApp, String name, String clazz) { if (name == null || clazz == null) return; List filters = webApp.getFilters(); boolean added = false; for (Iterator iterator = filters.iterator(); iterator.hasNext();) { Filter filter = (Filter) iterator.next(); if (filter != null && name.endsWith(filter.getFilterName())) { filter.setFilterName(name); filter.setFilterClass(clazz); added = true; break; } } if (!added) { Filter filter = WebFactory.eINSTANCE.createFilter(); filter.setFilterName(name); filter.setFilterClass(clazz); webApp.getFilters().add(filter); } } protected void createOrUpdateListener(WebApp webApp, String name) { if (name == null) return; List listeners = webApp.getListeners(); boolean added = false; for (Iterator iterator = listeners.iterator(); iterator.hasNext();) { Listener listener = (Listener) iterator.next(); if (listener != null && name.equals(listener.getListenerClass())) { listener.setListenerClass(name); added = true; } } if (!added) { Listener listener = JavaeeFactory.eINSTANCE.createListener(); listener.setListenerClass(name); webApp.getListeners().add(listener); } } protected void createOrUpdateContextParam(WebApp webApp, String name, String value) { if (name == null || value == null) return; List paramValues = webApp.getContextParams(); boolean added = false; for (Iterator iterator = paramValues.iterator(); iterator.hasNext();) { ParamValue paramValue = (ParamValue) iterator.next(); if (paramValue != null && name.equals(paramValue.getParamName())) { paramValue.setParamValue(value); added = true; break; } } if (!added) { ParamValue paramValue = JavaeeFactory.eINSTANCE.createParamValue(); paramValue.setParamName(name); paramValue.setParamValue(value); webApp.getContextParams().add(paramValue); } } /** * * @param project * @param monitor * @param webConfigName */ abstract protected void configureFacesConfigXml(final IProject project, IProgressMonitor monitor, String webConfigName); protected abstract void configure(WebApp webApp, IProject project); protected WebApp configureWebXml(final IProject project) { IModelProvider modelProvider = ModelProviderManager .getModelProvider(project); Object modelObject = modelProvider.getModelObject(); if (!(modelObject instanceof WebApp)) { // TODO log return null; } IPath modelPath = new Path("WEB-INF").append("web.xml"); //$NON-NLS-1$ //$NON-NLS-2$ boolean exists = project.getProjectRelativePath().append(modelPath) .toFile().exists(); if (!exists) { modelPath = IModelProvider.FORCESAVE; } modelProvider.modify(new Runnable() { public void run() { IModelProvider modelProvider = ModelProviderManager .getModelProvider(project); Object modelObject = modelProvider.getModelObject(); if (!(modelObject instanceof WebApp)) { // TODO log return; } WebApp webApp = (WebApp) modelObject; configure(webApp, project); } }, modelPath); return (WebApp)modelObject; } protected abstract SeamProjectCreator getProjectCreator(IDataModel model, IProject project, SeamFacetAbstractInstallDelegate seamFacetInstallDelegate); protected boolean shouldCopyLibrariesAndTemplates(IDataModel model){ return model.getBooleanProperty(ISeamFacetDataModelProperties.SEAM_TEMPLATES_AND_LIBRARIES_COPYING); } protected boolean shouldCopyLibraries(IDataModel model){ return model.getBooleanProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_LIBRARIES_COPYING); } /** * Returns the server defined in the model. * @param model * @return */ public static IServer getServer(IDataModel model) { Object serverObject = model.getProperty(ISeamFacetDataModelProperties.JBOSS_AS_TARGET_SERVER); IServer server = null; if(serverObject instanceof String) { IServer[] servers = ServerCore.getServers(); for (IServer i : servers) { if(serverObject.equals(i.getName())) { server = i; break; } } } else if(serverObject instanceof IServer) { server = (IServer)serverObject; } return server; } }