/******************************************************************************* * 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.core; import java.util.HashSet; import java.util.Set; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; 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.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties; /** * Helper class that collects related J2EE projects for * a given WAR project. * * @author Viacheslav Kabanovich */ public class SeamProjectsSet { IProject ear; IProject war; IProject ejb; IProject test; IProject[] childProjects = new IProject[0]; IEclipsePreferences prefs; /** * @param project EAR, EJB or Web Seam project * @return */ public static SeamProjectsSet create(IProject project) { return new SeamProjectsSet(project); } /** * @param project EAR, EJB or Web Seam project */ public SeamProjectsSet(IProject project) { ISeamProject seamProject = SeamCorePlugin.getSeamProject(project, false); if(seamProject==null) { // maybe the project is EAR? If so it doesn't have seam nature. ISeamProject warProject = SeamUtil.findReferencingSeamWarProjectForProject(project); if(warProject!=null) { initWebProject(warProject.getProject()); } } else { IScopeContext projectScope = new ProjectScope(project); IEclipsePreferences preferences = projectScope.getNode(SeamCorePlugin.PLUGIN_ID); if(preferences!=null) { String parentProjectName = preferences.get(ISeamFacetDataModelProperties.SEAM_PARENT_PROJECT, null); if(parentProjectName==null) { // The project is main web seam project. initWebProject(project); } else { IProject warProject = ResourcesPlugin.getWorkspace().getRoot().getProject(parentProjectName); if(warProject!=null) { initWebProject(warProject); } } } } } public void initWebProject(IProject warProject) { IScopeContext projectScope = new ProjectScope(warProject); prefs = projectScope.getNode(SeamCorePlugin.PLUGIN_ID); war = warProject; if(prefs!=null) { String earName = prefs.get( ISeamFacetDataModelProperties.SEAM_EAR_PROJECT, warProject.getName()+"-ear"); //$NON-NLS-1$ if(earName!=null && !"".equals(earName.trim())) { //$NON-NLS-1$ ear = (IProject)warProject.getWorkspace().getRoot().findMember(earName); } String ejbName = prefs.get( ISeamFacetDataModelProperties.SEAM_EJB_PROJECT, warProject.getName()+"-ejb"); //$NON-NLS-1$ if(ejbName!=null && !"".equals(ejbName.trim())) { //$NON-NLS-1$ ejb = (IProject)warProject.getWorkspace().getRoot().findMember(ejbName); } String testName = prefs.get( ISeamFacetDataModelProperties.SEAM_TEST_PROJECT, warProject.getName()+"test"); //$NON-NLS-1$ if(testName!=null && !"".equals(testName)) { //$NON-NLS-1$ test = (IProject)warProject.getWorkspace().getRoot().findMember(testName); } IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); Set<IProject> childProjectSet = new HashSet<IProject>(); for (int i = 0; i < projects.length; i++) { ISeamProject seamProject = SeamCorePlugin.getSeamProject(projects[i], false); if(seamProject!=null) { projectScope = new ProjectScope(projects[i]); IEclipsePreferences preferences = projectScope.getNode(SeamCorePlugin.PLUGIN_ID); if(preferences!=null) { String parentProjectName = preferences.get(ISeamFacetDataModelProperties.SEAM_PARENT_PROJECT, null); if(parentProjectName!=null && parentProjectName.equals(warProject.getName())) { childProjectSet.add(projects[i]); } } } } childProjects = childProjectSet.toArray(new IProject[childProjectSet.size()]); } } /** * @return all child projects of main web seam project. */ public IProject[] getChildProjects() { return childProjects; } /** * @return all Seam projects of one application */ public IProject[] getAllProjects() { IProject[] projects = new IProject[childProjects.length + 1]; for (int i = 0; i < childProjects.length; i++) { projects[i] = childProjects[i]; } projects[childProjects.length] = war; return projects; } /** * @return default deploy type for Seam project set */ public String getDefaultDeployType() { if(ejb!=null && war!=ejb) { return ISeamFacetDataModelProperties.DEPLOY_AS_EAR; } return ISeamFacetDataModelProperties.DEPLOY_AS_WAR; } public boolean isWarConfiguration() { if(prefs==null) { return false; } return prefs.get(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS, ISeamFacetDataModelProperties.DEPLOY_AS_WAR).equals(ISeamFacetDataModelProperties.DEPLOY_AS_WAR); } /** * Returns list of WAR projects. * @return */ public IProject getWarProject() { return war; } /** * Returns EAR project or null, if WAR project is not used by EAR. * @return */ public IProject getEarProject() { return ear; } /** * Returns list of EJB projects. * @return */ public IProject getEjbProject() { return ejb; } /** * * @return */ public IProject getTestProject() { return test; } public IContainer getDefaultActionFolder() { return getDefaultEjbSourceFolder(); } /** * * @return the action folder (this folder is not guaranteed to exist!) */ public IContainer getActionFolder() { String folderPath = null; if(prefs!=null) { folderPath = prefs.get(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, null); } if(folderPath==null || folderPath.length()==0) { return getDefaultActionFolder(); } return (IContainer)ResourcesPlugin.getWorkspace().getRoot().findMember(folderPath); } /** * @return the model folder if exists (this folder is not guaranteed to exist!) */ public IContainer getDefaultModelFolder() { return getDefaultEjbSourceFolder(); } /** * @return the model folder if exists (this folder is not guaranteed to exist!) */ public IContainer getModelFolder() { String folderPath = null; if(prefs!=null) { folderPath = prefs.get(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER, null); } if(folderPath==null || folderPath.length()==0) { return getDefaultModelFolder(); } return (IContainer)ResourcesPlugin.getWorkspace().getRoot().findMember(folderPath); } public IContainer getDefaultEjbSourceFolder() { return getSrc(ejb); } public IContainer getDefaultTestSourceFolder() { return getSrc(test); } public IContainer getDefaultWarSourceFolder() { IFolder webSrcFolder = findWebSrcFolder(); if(webSrcFolder!=null) { return webSrcFolder; } return getSrc(war); } private IContainer getSrc(IProject project) { if(project==null) { project = war; } IResource resource = EclipseResourceUtil.getJavaSourceRoot(project); if(resource!=null) { return (IContainer) resource; } return project; } /** * Returns default web contents folder. * @return */ public IContainer getDefaultViewsFolder() { IVirtualComponent com = ComponentCore.createComponent(war); if(com!=null) { IVirtualFolder webRootFolder = com.getRootFolder().getFolder(new Path("/")); //$NON-NLS-1$ if(webRootFolder!=null) { return (IFolder)webRootFolder.getUnderlyingFolder(); } } return getWarProject(); } /** * Returns default ear contents folder. * @return */ public IContainer getDefaultEarViewsFolder() { IVirtualComponent com = ComponentCore.createComponent(ear); if(com!=null) { IVirtualFolder webRootFolder = com.getRootFolder().getFolder(new Path("/")); //$NON-NLS-1$ if(webRootFolder!=null) { return (IFolder)webRootFolder.getUnderlyingFolder(); } } return getWarProject(); } /** * Returns web contents folder. * @return */ public IContainer getViewsFolder() { String folderPath = null; if(prefs!=null) { folderPath = prefs.get(ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER, null); } if(folderPath==null || folderPath.length()==0) { return getDefaultViewsFolder(); } return (IContainer)ResourcesPlugin.getWorkspace().getRoot().findMember(folderPath); } /** * Returns source folder for test cases. * @return */ public IContainer getTestsFolder() { String folderPath = null; if(prefs!=null) { folderPath = prefs.get(ISeamFacetDataModelProperties.TEST_SOURCE_FOLDER, null); } if(folderPath==null || folderPath.length()==0) { return getDefaultTestSourceFolder(); } return (IContainer)ResourcesPlugin.getWorkspace().getRoot().findMember(folderPath); } public String getEntityPackage(){ if(prefs==null) { return "entity"; } return prefs.get(ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME, "entity"); //$NON-NLS-1$ } public void refreshLocal(IProgressMonitor monitor) throws CoreException { if(ejb!=null) { ejb.refreshLocal(IResource.DEPTH_INFINITE, monitor); } if(test!=null) { test.refreshLocal(IResource.DEPTH_INFINITE, monitor); } if(war!=null) { war.refreshLocal(IResource.DEPTH_INFINITE, monitor); } } private IFolder findWebSrcFolder() { IVirtualComponent component = ComponentCore.createComponent(war); if(component!=null) { IVirtualFolder vFolder = component.getRootFolder().getFolder("WEB-INF/classes"); return (IFolder)vFolder.getUnderlyingFolder(); } return null; } }