package org.jboss.tools.seam.core.test.project.facet; import java.io.File; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import junit.framework.TestCase; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectNature; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jst.common.project.facet.core.JavaFacet; import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties; 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.IProjectFacet; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; import org.jboss.tools.seam.core.SeamProjectsSet; 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.jboss.tools.seam.internal.core.project.facet.AntCopyUtils.FileSet; import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties; import org.jboss.tools.seam.internal.core.project.facet.Seam23FacetInstallDelegate; import org.jboss.tools.seam.internal.core.project.facet.Seam23ProjectCreator; import org.jboss.tools.seam.internal.core.project.facet.Seam2FacetInstallDelegate; import org.jboss.tools.seam.internal.core.project.facet.Seam2ProjectCreator; import org.jboss.tools.seam.internal.core.project.facet.SeamFacetInstallDataModelProvider; import org.jboss.tools.seam.internal.core.project.facet.SeamLibFileSetProvider; import org.jboss.tools.seam.internal.core.project.facet.SeamProjectCreator; import org.jboss.tools.test.util.JobUtils; import org.jboss.tools.test.util.ResourcesUtils; /** * Base class for facet related tests; based on the facet test class found in * WTP test suite. * * @author max * */ public abstract class AbstractSeamFacetTest extends TestCase { public static final String SEAM23_FOLDER_NAME = "jboss-seam-2.3.0.Final"; protected static final IWorkspace ws = ResourcesPlugin.getWorkspace(); protected SeamRuntime seamRuntime; protected static final String SEAM_1_2_0 = "Seam 1.2.0"; protected static final String SEAM_2_0_0 = "Seam 2.0.0"; protected static final String SEAM_2_3_0 = "Seam 2.3.0"; protected static final String SEAM_1_2_HOME = "jbosstools.test.seam.1.2.1.eap.home"; protected static final String SEAM_2_0_HOME = "jbosstools.test.seam.2.0.1.GA.home"; protected static final IProjectFacetVersion seamFacetVersion; protected static IProjectFacetVersion dynamicWebVersion; protected static IProjectFacetVersion javaVersion; protected static IProjectFacetVersion javaFacesVersion; private static final IProjectFacet seamFacet; static { seamFacet = ProjectFacetsManager.getProjectFacet("jst.seam"); seamFacetVersion = seamFacet.getVersion("1.2"); javaVersion = JavaFacet.JAVA_50; dynamicWebVersion = ProjectFacetsManager.getProjectFacet("jst.web").getVersion("2.5"); javaFacesVersion = ProjectFacetsManager.getProjectFacet("jst.jsf").getVersion("1.2"); } protected final ArrayList<IResource> resourcesToCleanup = new ArrayList<IResource>(); protected final List<Runnable> tearDownOperations = new ArrayList<Runnable>(); protected AbstractSeamFacetTest(final String name) { super(name); } @Override protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); assertSeamHomeAvailable(); File folder = getSeamHomeFolder(); SeamRuntimeManager.getInstance().addRuntime(SEAM_1_2_0, folder.getAbsolutePath(), SeamVersion.SEAM_1_2, true); seamRuntime = SeamRuntimeManager.getInstance().findRuntimeByName(SEAM_1_2_0); } public static final String SYS_PROP_IS_NOT_DEFINED = "System property {0} is not defined"; protected File getSeamHomeFolder() { return getSeamHomeFolder(null); } protected File getSeamHomeFolder(String rootFolderName) { String seamHomeFolder = System.getProperty(getSystemPropertyName()); if(seamHomeFolder==null) { throw new IllegalStateException( MessageFormat.format(SYS_PROP_IS_NOT_DEFINED, getSystemPropertyName()) ); } File home = rootFolderName!=null? new File(seamHomeFolder, rootFolderName): new File(seamHomeFolder); return home.getAbsoluteFile(); } public static final String SEAM_EAP_121_HOME_PROPERY = "jbosstools.test.seam.1.2.1.eap.home"; protected String getSystemPropertyName() { return SEAM_EAP_121_HOME_PROPERY; } protected void tearDown() throws Exception { // Wait until all jobs is finished to avoid delete project problems boolean oldAutoBuilding = true; Exception last = null; try { oldAutoBuilding = ResourcesUtils.setBuildAutomatically(false); ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null); JobUtils.waitForIdle(); for (IResource r : this.resourcesToCleanup) { try { System.out.println("Deleting resource " + r.getLocation()); if(r instanceof IProject) { IProject project = (IProject)r; for (String natureId : project.getDescription().getNatureIds()) { IProjectNature nature = project.getNature(natureId); nature.deconfigure(); } } try { r.delete(true, null); } catch (Exception ex) { // Ignore any exceptions here (mostly because ResourceException rising is possible here) // But we cannot break tearDown() procedures in test cases which widely use this method // So, just print an exception stacktrace to see it in console log ex.printStackTrace(); } } catch(Exception e) { e.printStackTrace(); last = e; } } for (Runnable runnable : this.tearDownOperations) { runnable.run(); } } finally { ResourcesUtils.setBuildAutomatically(oldAutoBuilding); } // Do not throw any exceptions in tearDown procedure unless they are important // if(last!=null) throw last; } protected final void addResourceToCleanup(final IResource resource) { if(resource==null) throw new IllegalArgumentException(); if(resourcesToCleanup.contains(resource)) throw new IllegalArgumentException(); this.resourcesToCleanup.add(resource); // System.out.println("Resource is added to clean up list: " + resource); } protected final void addResourcesToCleanup(final IResource[] resource) { if(resource==null) throw new IllegalArgumentException(); this.resourcesToCleanup.addAll(Arrays.asList(resource)); // for (IResource r : resource) { // System.out.println("Resource is added to clean up list: " + r); // } } protected final void addTearDownOperation(final Runnable runnable) { this.tearDownOperations.add(runnable); } protected IFacetedProject createFacetedProject(final String name) throws CoreException { assertFalse(ws.getRoot().getProject(name).exists()); final IFacetedProject fpj = ProjectFacetsManager.create(name, null, null); final IProject pj = fpj.getProject(); assertTrue(pj.exists()); addResourceToCleanup(pj); return fpj; } protected IDataModel createSeamDataModel(String deployType) { IDataModel config = (IDataModel) new SeamFacetInstallDataModelProvider().create(); config.setStringProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, SEAM_1_2_0); config.setBooleanProperty(ISeamFacetDataModelProperties.DB_ALREADY_EXISTS, true); config.setBooleanProperty(ISeamFacetDataModelProperties.RECREATE_TABLES_AND_DATA_ON_DEPLOY, false); config.setStringProperty(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS, deployType); config.setStringProperty(ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME, "org.session.beans"); config.setStringProperty(ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME, "org.entity.beans"); config.setStringProperty(ISeamFacetDataModelProperties.TEST_CASES_PACKAGE_NAME, "org.test.beans"); config.setStringProperty(ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, "noop-connection"); config.setProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATHS_ARRAY, new String[] { "noop-driver.jar" }); config.setProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_NAME, "noop-driver.jar"); config.setBooleanProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_LIBRARIES_COPYING, true); config.setBooleanProperty(ISeamFacetDataModelProperties.SEAM_TEMPLATES_AND_LIBRARIES_COPYING, true); return config; } protected void installDependentFacets(final IFacetedProject fproj) throws CoreException { fproj.installProjectFacet(javaVersion, null, null); fproj.installProjectFacet(dynamicWebVersion, null, null); fproj.installProjectFacet(javaFacesVersion, null, null); } protected void setIfEmpty(IDataModel model, String propertyName, String value){ String oldValue = model.getStringProperty(propertyName); if(oldValue == null || "".equals(oldValue)){ model.setStringProperty(propertyName, value); } } protected IFacetedProject createSeamProject(String baseProjectName, final IDataModel config) throws CoreException { final IFacetedProject fproj = ProjectFacetsManager.create(baseProjectName, null, null); installDependentFacets(fproj); // new SeamFacetPreInstallDelegate().execute(fproj.getProject(), getSeamFacetVersion(), config, null); fproj.installProjectFacet(getSeamFacetVersion(), config, null); SeamProjectsSet seamProjectsSet = new SeamProjectsSet(fproj.getProject()); assertTrue(seamProjectsSet.getActionFolder().exists()); assertTrue(seamProjectsSet.getModelFolder().exists()); final IProject proj = fproj.getProject(); setIfEmpty(config, ISeamFacetDataModelProperties.SEAM_TEST_PROJECT, baseProjectName+"-test"); setIfEmpty(config, ISeamFacetDataModelProperties.SEAM_EAR_PROJECT, baseProjectName+"-ear"); setIfEmpty(config, ISeamFacetDataModelProperties.SEAM_EJB_PROJECT, baseProjectName+"-ejb"); ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { String seamVersionString = config.getProperty(IFacetDataModelProperties.FACET_VERSION_STR).toString(); SeamVersion seamVersion = SeamVersion.parseFromString(seamVersionString); SeamProjectCreator creator = null; if(seamVersion == SeamVersion.SEAM_1_2) { creator = new SeamProjectCreator(config, proj, new SeamLibFileSetProvider() { @Override public FileSet getEarLibFileSet() { return null; } @Override public FileSet getWarLibFileSet() { return null; } @Override public FileSet getWarLibFileSetForEar() { return null; } }); } else if(seamVersion == SeamVersion.SEAM_2_0 || seamVersion == SeamVersion.SEAM_2_1 || seamVersion == SeamVersion.SEAM_2_2) { creator = new Seam2ProjectCreator(config, proj, new SeamLibFileSetProvider() { @Override public FileSet getEarLibFileSet() { return Seam2FacetInstallDelegate.SEAM2_JBOSS_EAR_LIB; } @Override public FileSet getWarLibFileSet() { return Seam2FacetInstallDelegate.SEAM2_JBOSS_WAR_LIB_FILESET_WAR_CONFIG; } @Override public FileSet getWarLibFileSetForEar() { return Seam2FacetInstallDelegate.SEAM2_JBOSS_WAR_LIB_FILESET_WAR_CONFIG; } }); } else if(seamVersion == SeamVersion.SEAM_2_3) { creator = new Seam23ProjectCreator(config, proj, new SeamLibFileSetProvider() { @Override public FileSet getEarLibFileSet() { return Seam23FacetInstallDelegate.getEarLibFileSet(config); } @Override public FileSet getWarLibFileSet() { return Seam23FacetInstallDelegate.getWarLibFileSet(config); } @Override public FileSet getWarLibFileSetForEar() { return Seam23FacetInstallDelegate.getWarLibFileSetForEar(config); } }); } else { throw new RuntimeException("Can't get seam version from seam facet model"); } creator.execute(monitor); proj.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null); } },new NullProgressMonitor()); // Fix for JBIDE-JBIDE-7690: Let all the project to be created before we'll add them to the clean up list JobUtils.waitForIdle(); SeamProjectsSet seamAllProjectsSet = new SeamProjectsSet(fproj.getProject()); this.addResourcesToCleanup(seamAllProjectsSet.getAllProjects()); return fproj; } protected IFacetedProject createSeamWarProject(String name) throws CoreException { final IFacetedProject fproj = createSeamProject(name, createSeamDataModel("war")); final IProject proj = fproj.getProject(); assertNotNull(proj); assertTrue(proj.exists()); if(shouldCheckTestProject()) { assertTrue(proj.getWorkspace().getRoot().getProject(proj.getName() + "-test").exists()); } return fproj; } protected IFacetedProject createSeamEarProject(String name) throws CoreException { final IFacetedProject fproj = createSeamProject(name, createSeamDataModel("ear")); SeamProjectsSet seamProjectsSet = new SeamProjectsSet(fproj.getProject()); final IProject proj = fproj.getProject(); assertNotNull(proj); assertTrue(seamProjectsSet.getWarProject().exists()); if(shouldCheckTestProject()) { assertTrue(seamProjectsSet.getTestProject().exists()); } assertTrue(seamProjectsSet.getEjbProject().exists()); assertTrue(seamProjectsSet.getEarProject().exists()); return fproj; } protected boolean shouldCheckTestProject() { return true; } protected IProjectFacetVersion getSeamFacetVersion() { return seamFacetVersion; } public void assertSeamHomeAvailable() { File folder = getSeamHomeFolder(); assertTrue("Seam home folder (" + folder.getAbsolutePath() + ") does not exist", folder.exists()); File seamgen = new File(folder, "seam-gen"); assertTrue("Seamgen folder (" + seamgen.getAbsolutePath() + ") does not exist", seamgen.exists()); } }