/******************************************************************************* * Copyright (c) 2008 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.FilenameFilter; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; 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.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.launching.IVMInstall; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jst.common.project.facet.JavaFacetUtils; import org.eclipse.jst.common.project.facet.core.ClasspathHelper; import org.eclipse.jst.common.project.facet.core.JavaFacet; import org.eclipse.jst.common.project.facet.core.internal.JavaFacetUtil; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties; 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.IFacetedProject; import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action; import org.eclipse.wst.common.project.facet.core.IProjectFacet; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; import org.jboss.tools.common.util.ResourcesUtils; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.core.project.facet.SeamRuntime; import org.jboss.tools.seam.core.project.facet.SeamRuntimeManager; import org.jboss.tools.seam.core.project.facet.SeamVersion; import org.osgi.service.prefs.BackingStoreException; /** * @author Alexey Kazakov * This is basic class that helps New Seam Wizard Page to create EJB, EAR and test projects for seam WAR project. */ public class SeamProjectCreator { protected static final String TEST_WAR_PROFILE = "test-war"; //$NON-NLS-1$ protected static final String TEST_EAR_PROFILE = "test"; //$NON-NLS-1$ protected static final String DEV_WAR_PROFILE = "dev-war"; //$NON-NLS-1$ protected static final String DEV_EAR_PROFILE = "dev"; //$NON-NLS-1$ private static AntCopyUtils.FileSet JBOSS_TEST_LIB_FILESET = new AntCopyUtils.FileSet() .include("testng-.*-jdk15\\.jar") //$NON-NLS-1$ .include("myfaces-api-.*\\.jar") //$NON-NLS-1$ .include("myfaces-impl-.*\\.jar") //$NON-NLS-1$ .include("servlet-api\\.jar") //$NON-NLS-1$ .include("hibernate-all\\.jar") //$NON-NLS-1$ .include("jboss-ejb3-all\\.jar") //$NON-NLS-1$ .include("thirdparty-all\\.jar") //$NON-NLS-1$ .exclude(".*/CVS") //$NON-NLS-1$ .exclude(".*/\\.svn"); //$NON-NLS-1$ protected IDataModel model; protected IProject seamWebProject; protected SeamLibFileSetProvider seamLibFileSetProvider; protected SeamRuntime seamRuntime; protected String seamHomePath; protected File seamHomeFolder; protected File seamLibFolder; protected File seamGenHomeFolder; protected String earProjectName; protected String ejbProjectName; protected String testProjectName; protected File earProjectFolder; protected File ejbProjectFolder; protected File earContentsFolder; protected FilterSet filtersFilterSet; protected File seamGenResFolder; protected File persistenceFile; protected File hibernateConsoleLaunchFile; protected File hibernateConsolePropsFile; protected FilterSet jdbcFilterSet; protected FilterSet encodedJdbcFilterSet; protected FilterSet projectFilterSet; protected FilterSet encodedProjectFilterSet; protected FilterSetCollection viewFilterSetCollection; protected FilterSetCollection hibernateDialectFilterSet; protected File dataSourceDsFile; protected File ejbTemplateDir; protected AntCopyUtils.FileSet excludeCvsSvn; protected FilterSet ejbFilterSet; protected File webMetaInf; protected File ejbMetaInf; protected File droolsLibFolder; private String jbossSeamPath; private static final Map<String,String> COMPILER_LEVEL_TO_EXEC_ENV = new HashMap<String,String>(); static { COMPILER_LEVEL_TO_EXEC_ENV.put( JavaCore.VERSION_1_3, "J2SE-1.3" ); //$NON-NLS-1$ COMPILER_LEVEL_TO_EXEC_ENV.put( JavaCore.VERSION_1_4, "J2SE-1.4" ); //$NON-NLS-1$ COMPILER_LEVEL_TO_EXEC_ENV.put( JavaCore.VERSION_1_5, "J2SE-1.5" ); //$NON-NLS-1$ COMPILER_LEVEL_TO_EXEC_ENV.put( JavaCore.VERSION_1_6, "JavaSE-1.6" ); //$NON-NLS-1$ COMPILER_LEVEL_TO_EXEC_ENV.put( JavaCore.VERSION_1_7, "JavaSE-1.7" ); //$NON-NLS-1$ } private static final IPath CPE_PREFIX_FOR_EXEC_ENV = new Path( "org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType" ); //$NON-NLS-1$ /** * @param model Seam facet data model * @param seamWebProject Seam web project */ public SeamProjectCreator(IDataModel model, IProject seamWebProject, SeamLibFileSetProvider seamLibFileSetProvider) { this.model = model; this.seamWebProject = seamWebProject; this.seamLibFileSetProvider = seamLibFileSetProvider; earProjectName = model.getStringProperty(ISeamFacetDataModelProperties.SEAM_EAR_PROJECT); ejbProjectName = model.getStringProperty(ISeamFacetDataModelProperties.SEAM_EJB_PROJECT); testProjectName = model.getStringProperty(ISeamFacetDataModelProperties.SEAM_TEST_PROJECT); seamRuntime = SeamRuntimeManager.getInstance().findRuntimeByName(model.getProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME).toString()); if(seamRuntime==null) { throw new RuntimeException("Can't get seam runtime " + model.getProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME).toString()); } seamHomePath = seamRuntime.getHomeDir(); seamHomeFolder = new File(seamHomePath); seamLibFolder = new File(seamHomePath, SeamFacetAbstractInstallDelegate.SEAM_LIB_RELATED_PATH); seamGenHomeFolder = new File(seamHomePath, "seam-gen"); //$NON-NLS-1$ filtersFilterSet = SeamFacetFilterSetFactory.createFiltersFilterSet(model); seamGenResFolder = new File(seamGenHomeFolder, "resources"); //$NON-NLS-1$ persistenceFile = new File(seamGenResFolder, "META-INF/persistence-" + (SeamFacetAbstractInstallDelegate.isWarConfiguration(model) ? DEV_WAR_PROFILE : DEV_EAR_PROFILE) + ".xml"); //$NON-NLS-1$ //$NON-NLS-2$ try { hibernateConsoleLaunchFile = new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "hibernatetools/hibernate-console.launch"); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } hibernateConsolePropsFile = new File(seamGenHomeFolder, "hibernatetools/hibernate-console.properties"); //$NON-NLS-1$ //hibernateConsoleLaunchFile = new File(seamGenHomeFolder, "hibernatetools/hibernate-console.launch"); //$NON-NLS-1$ dataSourceDsFile = new File(seamGenResFolder, "datasource-ds.xml"); //$NON-NLS-1$ IVirtualComponent component = ComponentCore.createComponent(seamWebProject); IVirtualFolder webRootVirtFolder = component.getRootFolder().getFolder(new Path("/")); //$NON-NLS-1$ IContainer webRootFolder = webRootVirtFolder.getUnderlyingFolder(); File webContentFolder = webRootFolder.getLocation().toFile(); webMetaInf = new File(webContentFolder, "META-INF"); //$NON-NLS-1$ earProjectFolder = new File(seamWebProject.getLocation().removeLastSegments(1).toFile(), earProjectName); earContentsFolder = new File(earProjectFolder, "EarContent"); //$NON-NLS-1$ ejbProjectFolder = new File(seamWebProject.getLocation().removeLastSegments(1).toFile(), ejbProjectName); ejbMetaInf = new File(ejbProjectFolder, "ejbModule/META-INF"); //$NON-NLS-1$ jdbcFilterSet = SeamFacetFilterSetFactory.createJdbcFilterSet(model); encodedJdbcFilterSet = SeamFacetFilterSetFactory.createJdbcFilterSet(model, true); projectFilterSet = SeamFacetFilterSetFactory.createProjectFilterSet(model); encodedProjectFilterSet = SeamFacetFilterSetFactory.createProjectFilterSet(model, true); viewFilterSetCollection = new FilterSetCollection(); viewFilterSetCollection.addFilterSet(jdbcFilterSet); viewFilterSetCollection.addFilterSet(projectFilterSet); FilterSet driverSet = SeamFacetAbstractInstallDelegate.getDriverFilterSet(model); if(driverSet!=null) { viewFilterSetCollection.addFilterSet(driverSet); } hibernateDialectFilterSet = new FilterSetCollection(); hibernateDialectFilterSet.addFilterSet(encodedJdbcFilterSet); hibernateDialectFilterSet.addFilterSet(encodedProjectFilterSet); hibernateDialectFilterSet.addFilterSet(SeamFacetFilterSetFactory.createHibernateDialectFilterSet(model, true)); try { ejbTemplateDir = new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "ejb"); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } excludeCvsSvn = new AntCopyUtils.FileSet(SeamFacetAbstractInstallDelegate.CVS_SVN).dir(ejbTemplateDir); ejbFilterSet = new FilterSet(); ejbFilterSet.addFilter("projectName", seamWebProject.getName()); //$NON-NLS-1$ ejbFilterSet.addFilter("earProjectName", earProjectName); //$NON-NLS-1$ ejbFilterSet.addFilter("ejbProjectName", ejbProjectName); //$NON-NLS-1$ ejbFilterSet.addFilter("testProjectName", testProjectName); //$NON-NLS-1$ ejbFilterSet.addFilter("runtimeName", WtpUtils.getServerRuntimeName(seamWebProject)); //$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$ } else { ejbFilterSet.addFilter("driverJar", ""); //$NON-NLS-1$ //$NON-NLS-2$ } droolsLibFolder = new File(seamHomePath, SeamFacetInstallDelegate.DROOLS_LIB_SEAM_RELATED_PATH); } public SeamVersion getVersion() { String seamVersionString = getModel().getProperty(IFacetDataModelProperties.FACET_VERSION_STR).toString(); return SeamVersion.parseFromString(seamVersionString); } public IDataModel getModel() { return model; } public void setModel(IDataModel model) { this.model = model; } protected AntCopyUtils.FileSet getJBossTestLibFileset() { return JBOSS_TEST_LIB_FILESET; } protected AntCopyUtils.FileSet getJbossEarContent() { return SeamFacetInstallDelegate.JBOSS_EAR_CONTENT; } /** * Creates test project for seam web project in case of WAR deployment and test, EAR and EJB projects in case of EAR deployment. * @param monitor * @throws CoreException */ public void execute(IProgressMonitor monitor) throws CoreException { boolean testProjectCreated = createTestProject(); final String consoleName = SeamFacetAbstractInstallDelegate.isWarConfiguration(model) ? seamWebProject.getName() : ejbProjectName; if(!SeamFacetAbstractInstallDelegate.isWarConfiguration(model)) { createEjbProject(); createEarProject(); try { File[] earJars = earContentsFolder.listFiles(new FilenameFilter() { /* (non-Javadoc) * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String) */ public boolean accept(File dir, String name) { if (SeamCorePlugin.getDefault().hasM2Facet(seamWebProject)) { return false; } return name.lastIndexOf(".jar") > 0; //$NON-NLS-1$ } }); StringBuffer earJarsStrWar = new StringBuffer(); StringBuffer earJarsStrEjb = new StringBuffer(); if(earJars != null){ for (File file : earJars) { earJarsStrWar.append(" ").append(file.getName()).append(" \n"); if (isJBossSeamJar(file)) { jbossSeamPath = file.getAbsolutePath(); } else { earJarsStrEjb.append(" ").append(file.getName()).append(" \n"); } } } if(earJarsStrEjb.length()>0) { earJarsStrEjb.insert(0, "Class-Path: "); //$NON-NLS-1$ } FilterSetCollection manifestFilterColWar = new FilterSetCollection(projectFilterSet); FilterSet manifestFilterWar = new FilterSet(); manifestFilterWar.addFilter("earLibs", earJarsStrWar.toString()); //$NON-NLS-1$ manifestFilterColWar.addFilterSet(manifestFilterWar); if(shouldCopyLibrariesAndTemplates(model)) AntCopyUtils.copyFileToFolder(new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "war/META-INF/MANIFEST.MF"), webMetaInf, manifestFilterColWar, true); //$NON-NLS-1$ FilterSetCollection manifestFilterColEjb = new FilterSetCollection(projectFilterSet); FilterSet manifestFilterEjb = new FilterSet(); manifestFilterEjb.addFilter("earClasspath", earJarsStrEjb.toString()); //$NON-NLS-1$ manifestFilterColEjb.addFilterSet(manifestFilterEjb); if(shouldCopyLibrariesAndTemplates(model)) AntCopyUtils.copyFileToFolder(new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "ejb/ejbModule/META-INF/MANIFEST.MF"), ejbMetaInf, manifestFilterColEjb, true); //$NON-NLS-1$ } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } } SeamFacetAbstractInstallDelegate.toggleHibernateOnProject(seamWebProject, consoleName); String wsPath = seamWebProject.getLocation().removeLastSegments(1).toFile().getAbsoluteFile().getPath(); IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot(); if (!SeamFacetAbstractInstallDelegate.isWarConfiguration(model)) { IProject ejbProjectToBeImported = wsRoot.getProject(ejbProjectName); ResourcesUtils.importExistingProject(ejbProjectToBeImported, wsPath + "/" + ejbProjectName, ejbProjectName, monitor, false); // Set up compilation level and java facet for ejb project. String level = JavaFacetUtils.getCompilerLevel(seamWebProject); String ejbLevel = JavaFacetUtils.getCompilerLevel(ejbProjectToBeImported); if (!ejbLevel.equals(level)) { JavaFacetUtils.setCompilerLevel(ejbProjectToBeImported, level); } Action action = new Action(Action.Type.VERSION_CHANGE, JavaFacetUtils.compilerLevelToFacet(level), null); IFacetedProject facetedProject = ProjectFacetsManager.create(ejbProjectToBeImported); facetedProject.modify(Collections.singleton(action), null); SeamFacetAbstractInstallDelegate.toggleHibernateOnProject(ejbProjectToBeImported, consoleName); IProjectFacet sf = ProjectFacetsManager.getProjectFacet("jst.ejb"); IProjectFacetVersion pfv = ProjectFacetsManager.create(ejbProjectToBeImported).getInstalledVersion(sf); IProjectFacet jf = JavaFacet.FACET; IProjectFacetVersion jfv = ProjectFacetsManager.create(ejbProjectToBeImported).getInstalledVersion(jf); JavaFacetUtil.resetClasspath(ejbProjectToBeImported, null, jfv); ClasspathHelper.addClasspathEntries(ejbProjectToBeImported, pfv); // WtpUtils.reconfigure(ejbProjectToBeImported,monitor); IProject earProjectToBeImported = wsRoot.getProject(earProjectName); ResourcesUtils.importExistingProject(earProjectToBeImported, wsPath + "/" + earProjectName, earProjectName, monitor, false); if (jbossSeamPath != null && jbossSeamPath.trim().length() > 0 && new File(jbossSeamPath).exists()) { IJavaProject ejbJavaProject = JavaCore.create(ejbProjectToBeImported); if (ejbJavaProject != null) { if (!ejbJavaProject.isOpen()) { ejbJavaProject.open(monitor); } IClasspathEntry[] cps = ejbJavaProject.getRawClasspath(); IClasspathEntry[] entries = new IClasspathEntry[cps.length + 1]; for (int i = 0; i < cps.length; i++) { entries[i] = cps[i]; } IPath path = new Path(jbossSeamPath); IFile[] files = wsRoot.findFilesForLocation(path); IFile f = null; if (files != null && files.length > 0) { f = files[0]; } else { f = wsRoot.getFile(path); } if (f.exists()) { path = f.getFullPath(); } entries[cps.length] = JavaCore.newLibraryEntry(path, null, null); ejbJavaProject.setRawClasspath(entries, monitor); } } WtpUtils.reconfigure(ejbProjectToBeImported, monitor); configureJBossAppXml(); WtpUtils.reconfigure(earProjectToBeImported, monitor); } IProject testProjectToBeImported = null; if(testProjectCreated){ testProjectToBeImported = wsRoot.getProject(testProjectName); ResourcesUtils.importExistingProject(testProjectToBeImported, wsPath + "/" + testProjectName, testProjectName, monitor, true); // Set up compilation level for test project. String level = JavaFacetUtils.getCompilerLevel(seamWebProject); String testLevel = JavaFacetUtils.getCompilerLevel(testProjectToBeImported); if (!testLevel.equals(level)) { JavaFacetUtils.setCompilerLevel(testProjectToBeImported, level); } testProjectToBeImported.refreshLocal(IResource.DEPTH_INFINITE, monitor); final IVMInstall vm = JavaRuntime.getDefaultVMInstall(); if (vm != null) { // See https://issues.jboss.org/browse/JBIDE-8076 IClasspathEntry cpe = getJreContainer(seamWebProject); if (cpe == null) { final IPath path = CPE_PREFIX_FOR_EXEC_ENV.append(getCorrespondingExecutionEnvironment(level)); cpe = JavaCore.newContainerEntry(path); } IJavaProject javaProject = JavaCore.create(testProjectToBeImported); IClasspathEntry[] entries = javaProject.getRawClasspath(); int jreIndex = getJreContainerIndex(testProjectToBeImported); if (jreIndex == -1) { IClasspathEntry[] newEntries = new IClasspathEntry[entries.length+1]; System.arraycopy( entries, 0, newEntries, 1, entries.length ); newEntries[0] = cpe; javaProject.setRawClasspath(newEntries, null); } else { entries[jreIndex]=cpe; javaProject.setRawClasspath(entries, null); } } SeamFacetAbstractInstallDelegate.toggleHibernateOnProject(testProjectToBeImported, consoleName); } createSeamProjectPreferenes(); WtpUtils.reconfigure(seamWebProject, monitor); if(testProjectToBeImported != null) WtpUtils.reconfigure(testProjectToBeImported, monitor); } private boolean isJBossSeamJar(File file) { String regex = "(jboss-seam){1}(-[0-9][0-9\\.]+){0,1}(.jar){1}"; return Pattern.matches(regex, file.getName()); } private static String getCorrespondingExecutionEnvironment( String compilerLevel ) { final String res = COMPILER_LEVEL_TO_EXEC_ENV.get( compilerLevel ); if( res == null ) { throw new IllegalArgumentException( compilerLevel ); } return res; } public static int getJreContainerIndex(final IProject proj) throws CoreException { final IJavaProject jproj = JavaCore.create(proj); final IClasspathEntry[] cp = jproj.getRawClasspath(); for (int i = 0; i < cp.length; i++) { final IClasspathEntry cpe = cp[i]; if (cpe.getEntryKind() == IClasspathEntry.CPE_CONTAINER && cpe.getPath().segment(0) .equals(JavaRuntime.JRE_CONTAINER)) { return i; } } return -1; } public static IClasspathEntry getJreContainer(final IProject proj) throws CoreException { final IJavaProject jproj = JavaCore.create(proj); final IClasspathEntry[] cp = jproj.getRawClasspath(); for (int i = 0; i < cp.length; i++) { final IClasspathEntry cpe = cp[i]; if (cpe.getEntryKind() == IClasspathEntry.CPE_CONTAINER && cpe.getPath().segment(0) .equals(JavaRuntime.JRE_CONTAINER)) { return cpe; } } return null; } /** * Creates test project for given seam web project. */ protected boolean createTestProject() { if(!(Boolean)model.getProperty(ISeamFacetDataModelProperties.TEST_PROJECT_CREATING) || !shouldCopyLibrariesAndTemplates(model)) return false; File testProjectDir = new File(seamWebProject.getLocation().removeLastSegments(1).toFile(), testProjectName); //$NON-NLS-1$ testProjectDir.mkdir(); IVirtualComponent component = ComponentCore.createComponent(seamWebProject); IVirtualFolder webRootVirtFolder = component.getRootFolder().getFolder(new Path("/")); //$NON-NLS-1$ File testLibDir = new File(testProjectDir, "lib"); //$NON-NLS-1$ File embededEjbDir = new File(testProjectDir, "embedded-ejb"); //$NON-NLS-1$ File testSrcDir = new File(testProjectDir, "test-src"); //$NON-NLS-1$ FilterSet filterSet = new FilterSet(); filterSet.addFilter("projectName", seamWebProject.getName()); //$NON-NLS-1$ filterSet.addFilter("earProjectName", earProjectName); //$NON-NLS-1$ filterSet.addFilter("ejbProjectName", ejbProjectName); //$NON-NLS-1$ filterSet.addFilter("testProjectName", testProjectName); //$NON-NLS-1$ filterSet.addFilter("runtimeName", WtpUtils.getServerRuntimeName(seamWebProject)); //$NON-NLS-1$ filterSet.addFilter("webRootFolder", webRootVirtFolder.getUnderlyingFolder().getFullPath().removeFirstSegments(1).toString()); //$NON-NLS-1$ AntCopyUtils.FileSet includeLibs = new AntCopyUtils.FileSet(getJBossTestLibFileset()).dir(new File(seamRuntime.getHomeDir(), "lib")); //$NON-NLS-1$ File[] libs = includeLibs.getDir().listFiles(new AntCopyUtils.FileSetFileFilter(includeLibs)); StringBuffer testLibraries = new StringBuffer(); for (File file : libs) { testLibraries.append("\t<classpathentry kind=\"lib\" path=\"lib/" + file.getName() + "\"/>\n"); //$NON-NLS-1$ //$NON-NLS-2$ } StringBuffer requiredProjects = new StringBuffer(); requiredProjects.append("\t<classpathentry combineaccessrules=\"false\" kind=\"src\" path=\"/" + seamWebProject.getName() + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ if (!SeamFacetAbstractInstallDelegate.isWarConfiguration(model)) { requiredProjects.append("\n\t<classpathentry combineaccessrules=\"false\" kind=\"src\" path=\"/" + ejbProjectName + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$ } filterSet.addFilter("testLibraries", testLibraries.toString()); //$NON-NLS-1$ filterSet.addFilter("requiredProjects", requiredProjects.toString()); //$NON-NLS-1$ File testTemplateDir = null; try { testTemplateDir = new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "test"); //$NON-NLS-1$ } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); return false; } AntCopyUtils.FileSet excludeCvsSvn = new AntCopyUtils.FileSet(SeamFacetAbstractInstallDelegate.CVS_SVN).dir(testTemplateDir); AntCopyUtils.copyFilesAndFolders( testTemplateDir, testProjectDir, new AntCopyUtils.FileSetFileFilter(excludeCvsSvn), new FilterSetCollection(filterSet), true); excludeCvsSvn.dir(new File(seamRuntime.getHomeDir(), "embedded-ejb/conf")); //$NON-NLS-1$ AntCopyUtils.copyFiles( new File(seamRuntime.getHomeDir(), "embedded-ejb/conf"), //$NON-NLS-1$ embededEjbDir, new AntCopyUtils.FileSetFileFilter(excludeCvsSvn)); if(shouldCopyLibraries(model)){ AntCopyUtils.copyFiles( new File(seamRuntime.getHomeDir(), "lib"), //$NON-NLS-1$ testLibDir, new AntCopyUtils.FileSetFileFilter(includeLibs)); } SeamFacetAbstractInstallDelegate.createComponentsProperties(testSrcDir, "", Boolean.TRUE); //$NON-NLS-1$ return true; } /** * Creates test project for given seam web project. * @param testProjectName */ protected boolean createTestProject(String testProjectName) { if(testProjectName==null) { throw new IllegalArgumentException("Test project name must not be null"); } this.testProjectName = testProjectName; return createTestProject(); } /** * Creates EJB project for given seam web project. * @param ejbProjectName */ protected void createEjbProject(String ejbProjectName) { if(ejbProjectName==null) { throw new IllegalArgumentException("EJB project name must not be null"); } this.ejbProjectName = ejbProjectName; createEjbProject(); } protected void createEjbProject() { if(!shouldCopyLibrariesAndTemplates(model)) return; ejbProjectFolder.mkdir(); AntCopyUtils.copyFilesAndFolders( ejbTemplateDir, ejbProjectFolder, new AntCopyUtils.FileSetFileFilter(excludeCvsSvn), new FilterSetCollection(ejbFilterSet), true); // ******************************************************************************************* // Copy sources to EJB project in case of EAR configuration // ******************************************************************************************* AntCopyUtils.copyFileToFile( new File(seamGenHomeFolder, "src/Authenticator.java"), //$NON-NLS-1$ new File(ejbProjectFolder, "ejbModule/" + model.getProperty(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME).toString().replace('.', '/') + "/" + "Authenticator.java"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ new FilterSetCollection(filtersFilterSet), true); AntCopyUtils.copyFileToFile( persistenceFile, new File(ejbProjectFolder, "ejbModule/META-INF/persistence.xml"), //$NON-NLS-1$ viewFilterSetCollection, true); createComponentsProperties(); AntCopyUtils.FileSet ejbSrcResourcesSet = new AntCopyUtils.FileSet(SeamFacetAbstractInstallDelegate.JBOOS_EJB_WEB_INF_CLASSES_SET).dir(seamGenResFolder); AntCopyUtils.copyFilesAndFolders( seamGenResFolder, new File(ejbProjectFolder, "ejbModule"), new AntCopyUtils.FileSetFileFilter(ejbSrcResourcesSet), viewFilterSetCollection, true); //$NON-NLS-1$ AntCopyUtils.copyFileToFolder( new File(seamGenResFolder, "META-INF/ejb-jar.xml"), //$NON-NLS-1$ new File(ejbProjectFolder, "ejbModule/META-INF/"), //$NON-NLS-1$ viewFilterSetCollection, true); /*AntCopyUtils.copyFileToFolder( hibernateConsolePref, new File(ejbProjectFolder,".settings"), //$NON-NLS-1$ new FilterSetCollection(projectFilterSet), true);*/ FilterSet ejbFilterSet = new FilterSet(); ejbFilterSet.addFilter("projectName", ejbProjectFolder.getName()); //$NON-NLS-1$ ejbFilterSet.addFilter("earProjectName", earProjectName); //$NON-NLS-1$ ejbFilterSet.addFilter("ejbProjectName", ejbProjectName); //$NON-NLS-1$ ejbFilterSet.addFilter("testProjectName", testProjectName); //$NON-NLS-1$ ejbFilterSet.addFilter("connectionProfile", model.getStringProperty(ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE));//$NON-NLS-1$ AntCopyUtils.copyFileToFile( hibernateConsoleLaunchFile, new File(ejbProjectFolder, getLaunchCfgName(ejbProjectFolder.getName()) + ".launch"), //$NON-NLS-1$ new FilterSetCollection(ejbFilterSet), true); AntCopyUtils.copyFileToFolder( hibernateConsolePropsFile, ejbProjectFolder, hibernateDialectFilterSet, true); } protected void createComponentsProperties() { SeamFacetAbstractInstallDelegate.createComponentsProperties(new File(ejbProjectFolder, "ejbModule"), earProjectName, false); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } protected String getLaunchCfgName(String baseName){ ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager(); return lm.generateUniqueLaunchConfigurationNameFrom(baseName); } protected void copyJBossApp() { FilterSet earFilterSet = new FilterSet(); earFilterSet.addFilter("projectName", earProjectFolder.getName() + ".ear"); //$NON-NLS-1$ //$NON-NLS-2$ earFilterSet.addFilter("earProjectName", earProjectName); //$NON-NLS-1$ earFilterSet.addFilter("ejbProjectName", ejbProjectName); //$NON-NLS-1$ earFilterSet.addFilter("testProjectName", testProjectName); //$NON-NLS-1$ AntCopyUtils.copyFileToFolder( new File(seamGenResFolder, "META-INF/jboss-app.xml"), //$NON-NLS-1$ new File(earContentsFolder, "META-INF"), //$NON-NLS-1$ new FilterSetCollection(earFilterSet), true); } protected void createEarProject() { if(!shouldCopyLibrariesAndTemplates(model)) return; earProjectFolder.mkdir(); File earContentsFolder = new File(earProjectFolder, "EarContent"); //$NON-NLS-1$ copyJBossApp(); // Copy configuration files from template try { AntCopyUtils.copyFilesAndFolders( new File(SeamFacetInstallDataModelProvider.getTemplatesFolder(), "ear"), //$NON-NLS-1$ earProjectFolder, new AntCopyUtils.FileSetFileFilter(excludeCvsSvn), new FilterSetCollection(ejbFilterSet), true); } catch (IOException e) { SeamCorePlugin.getPluginLog().logError(e); } // Fill ear contents AntCopyUtils.copyFiles(seamHomeFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getJbossEarContent()).dir(seamHomeFolder))); if (!SeamCorePlugin.getDefault().hasM2Facet(seamWebProject) && shouldCopyLibraries(model)) { AntCopyUtils.copyFiles(seamLibFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getJbossEarContent()).dir(seamLibFolder))); AntCopyUtils.copyFiles(droolsLibFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getJbossEarContent()).dir(droolsLibFolder))); } AntCopyUtils.copyFiles(seamGenResFolder, earContentsFolder, new AntCopyUtils.FileSetFileFilter(new AntCopyUtils.FileSet(getJbossEarContent()).dir(seamGenResFolder))); File resources = new File(earProjectFolder, "resources"); AntCopyUtils.copyFileToFile( dataSourceDsFile, new File(resources, seamWebProject.getName() + "-ds.xml"), //$NON-NLS-1$ //$NON-NLS-2$ viewFilterSetCollection, true); } protected void createSeamProjectPreferenes() { IScopeContext projectScope = new ProjectScope(seamWebProject); IEclipsePreferences prefs = projectScope.getNode(SeamCorePlugin.PLUGIN_ID); String testSrcPath = seamWebProject.getFullPath().removeLastSegments(1).append(testProjectName).append("test-src").toString(); prefs.put(ISeamFacetDataModelProperties.TEST_CREATING, ((Boolean)model.getProperty(ISeamFacetDataModelProperties.TEST_PROJECT_CREATING)).toString()); prefs.put(ISeamFacetDataModelProperties.SEAM_TEST_PROJECT, testProjectName); prefs.put(ISeamFacetDataModelProperties.TEST_SOURCE_FOLDER, testSrcPath); if(!SeamFacetAbstractInstallDelegate.isWarConfiguration(model)) { prefs.put(ISeamFacetDataModelProperties.SEAM_EJB_PROJECT, ejbProjectName); prefs.put(SeamFacetAbstractInstallDelegate.SEAM_EAR_PROJECT, earProjectName); String srcPath = seamWebProject.getFullPath().removeLastSegments(1).append(ejbProjectName).append("ejbModule").toString(); prefs.put(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER, srcPath); prefs.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, srcPath); } else { IVirtualComponent component = ComponentCore.createComponent(seamWebProject); IVirtualFolder rootFolder = component.getRootFolder(); IContainer sourceFolder = rootFolder.getFolder(new Path("/WEB-INF/classes")).getUnderlyingFolder(); //$NON-NLS-1$ IContainer parentFolder = sourceFolder.getParent(); IPath srcRootFolder = parentFolder.getFullPath(); IPath srcFolder = sourceFolder.getFullPath(); IPath model = srcRootFolder.append(ISeamFacetDataModelProperties.DEFAULT_MODEL_SRC_FOLDER_NAME); IPath action = srcRootFolder.append(ISeamFacetDataModelProperties.DEFAULT_ACTION_SRC_FOLDER_NAME); IResource modelFolder = parentFolder.findMember(ISeamFacetDataModelProperties.DEFAULT_MODEL_SRC_FOLDER_NAME); IResource actionFolder = parentFolder.findMember(ISeamFacetDataModelProperties.DEFAULT_ACTION_SRC_FOLDER_NAME); if(modelFolder==null || !modelFolder.exists() || actionFolder==null || !actionFolder.exists()) { model = srcFolder; action = srcFolder; } prefs.put(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER, model.toString()); prefs.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, action.toString()); } try { prefs.flush(); } catch (BackingStoreException e) { SeamCorePlugin.getPluginLog().logError(e); } } protected void configureJBossAppXml() { // Do nothing special for Seam 1.2 } 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); } }