/******************************************************************************* * Copyright (c) 2009, 2010 SpringSource, a divison of VMware, Inc. * All rights reserved. This program and the accompanying materials * are 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: * SpringSource, a division of VMware, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.virgo.ide.module.core; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; 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.IResourceVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.virgo.ide.facet.core.FacetCorePlugin; import org.eclipse.virgo.ide.facet.core.FacetUtils; import org.eclipse.wst.server.core.IModule; import org.eclipse.wst.server.core.model.ModuleDelegate; import org.eclipse.wst.server.core.util.ProjectModuleFactoryDelegate; import org.springframework.ide.eclipse.core.java.JdtUtils; /** * {@link ProjectModuleFactoryDelegate} extension that knows how to handle par and bundle projects. * @author Christian Dupuis * @since 1.0.0 */ public class ServerModuleFactoryDelegate extends ProjectModuleFactoryDelegate { public static final String MODULE_FACTORY_ID = "org.eclipse.virgo.server.modulefactory"; /** * {@inheritDoc} */ @Override public ModuleDelegate getModuleDelegate(IModule module) { return new ServerModuleDelegate(module.getProject()); } /** * {@inheritDoc} */ @Override protected IModule[] createModules(final IProject project) { final Set<IModule> modules = new HashSet<IModule>(); if (FacetUtils.isBundleProject(project)) { // Add module for bundle deployment modules.add(createModule(project.getName(), project.getName(), FacetCorePlugin.BUNDLE_FACET_ID, "1.0", project)); // Add module for par deployment for (IProject parProject : FacetUtils.getParProjects(project)) { modules.add(createModule(parProject.getName() + "$" + project.getName(), project.getName(), FacetCorePlugin.BUNDLE_FACET_ID, "1.0", project)); } } else if (FacetUtils.isParProject(project)) { modules.add(createModule(project.getName(), project.getName(), FacetCorePlugin.PAR_FACET_ID, "1.0", project)); } // Every project can also be a plan project if (FacetUtils.isPlanProject(project)) { // Collect output locations if java project final Set<IPath> outputLocations = new HashSet<IPath>(); try { if (project.hasNature(JavaCore.NATURE_ID)) { IJavaProject je = JavaCore.create(project); try { outputLocations.add(je.getOutputLocation()); for (IClasspathEntry entry : je.getRawClasspath()) { if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) { if (entry.getOutputLocation() != null) { outputLocations.add(entry.getOutputLocation()); } } } } catch (JavaModelException e) { //safe to ignore } } } catch (CoreException e) { //safe to ignore } try { project.accept(new IResourceVisitor() { public boolean visit(IResource resource) throws CoreException { if (resource instanceof IFile && resource.getName().endsWith(".plan")) { modules.add(createModule(resource.getFullPath().toString(), resource.getProject().getName() + "/" + resource.getProjectRelativePath().toString(), FacetCorePlugin.PLAN_FACET_ID, "2.0", project)); } else if (resource instanceof IContainer) { IPath path = ((IContainer) resource).getFullPath(); for (IPath outputLocation : outputLocations) { if (outputLocation.isPrefixOf(path)) { return false; } } return true; } return true; } }); } catch (CoreException e) { // TODO CD log exception } } return (IModule[]) modules.toArray(new IModule[modules.size()]); } /** * {@inheritDoc} */ @Override protected IPath[] getListenerPaths() { final List<IPath> paths = new ArrayList<IPath>(); for (IModule module : getModules()) { if (FacetUtils.isPlanProject(module.getProject())) { try { module.getProject().accept(new IResourceVisitor() { public boolean visit(IResource resource) throws CoreException { if (resource instanceof IFile && resource.getName().endsWith(".plan")) { paths.add(resource.getProjectRelativePath()); } return true; } }); } catch (CoreException e) { } } } paths.add(new Path(".settings/org.eclipse.wst.common.project.facet.core.xml")); paths.add(new Path(".project")); paths.add(new Path(".settings")); paths.add(new Path(".classpath")); return (IPath[]) paths.toArray(new IPath[paths.size()]); } }