/******************************************************************************* * Copyright (c) 2003, 2012 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.runtimes.module; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.bpel.runtimes.IBPELModuleFacetConstants; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.internal.StructureEdit; import org.eclipse.wst.common.componentcore.internal.flat.IChildModuleReference; import org.eclipse.wst.common.componentcore.internal.util.FacetedProjectUtilities; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; import org.eclipse.wst.server.core.IModule; import org.eclipse.wst.server.core.internal.Module; import org.eclipse.wst.server.core.internal.ModuleFactory; import org.eclipse.wst.server.core.internal.ServerPlugin; import org.eclipse.wst.server.core.model.ModuleDelegate; import org.eclipse.wst.server.core.model.ModuleFactoryDelegate; import org.eclipse.wst.server.core.util.ProjectModuleFactoryDelegate; /** * J2EE module factory. */ public class BPELModuleFactoryDelegate extends ProjectModuleFactoryDelegate implements IResourceChangeListener { protected Map <IModule, FlatComponentDeployable> moduleDelegates = new HashMap<IModule, FlatComponentDeployable>(5); public static final String BPEL_FACTORY = "org.eclipse.bpel.runtimes.module.moduleFactory"; //$NON-NLS-1$ public static BPELModuleFactoryDelegate FACTORY; public static BPELModuleFactoryDelegate factoryInstance() { if( FACTORY == null ) { ensureFactoryLoaded(BPEL_FACTORY); } return FACTORY; } public static void ensureFactoryLoaded(String factoryId) { ModuleFactory[] factories = ServerPlugin.getModuleFactories(); for( int i = 0; i < factories.length; i++ ) { if( factories[i].getId().equals(factoryId)) { factories[i].getDelegate(new NullProgressMonitor()); } } } public BPELModuleFactoryDelegate() { super(); } @Override public void initialize() { super.initialize(); if( getId().equals(BPEL_FACTORY)) FACTORY = this; ResourcesPlugin.getWorkspace().addResourceChangeListener(this); } @Override protected IModule[] createModules(IProject project) { IVirtualComponent component = ComponentCore.createComponent(project); if(component != null) return createModuleDelegates(component); return null; } @Override public ModuleDelegate getModuleDelegate(IModule module) { if (module == null) return null; ModuleDelegate md = moduleDelegates.get(module); // if( md == null && ((Module)module).getInternalId().startsWith(BINARY_PREFIX)) // return createDelegate(module); if (md == null) { createModules(module.getProject()); md = moduleDelegates.get(module); } return md; } @SuppressWarnings("restriction") protected boolean canHandleProject(IProject p) { boolean result = FacetedProjectUtilities.isProjectOfType(p, IBPELModuleFacetConstants.BPEL20_PROJECT_FACET); return result; } protected IModule[] createModuleDelegates(IVirtualComponent component) { if(component == null){ return null; } List<IModule> projectModules = new ArrayList<IModule>(); IProject project = component.getProject(); try { if (canHandleProject(project)) { // defer to other ProjectModuleFactoryDelegates who think they can handle BPEL modules ModuleFactory[] factories = ServerPlugin.getModuleFactories(); for (int i = 0; i < factories.length; i++) { if(!factories[i].getId().equals(BPEL_FACTORY)) { // it's not me! ModuleFactoryDelegate d = factories[i].getDelegate(new NullProgressMonitor()); if (d instanceof ProjectModuleFactoryDelegate) { ProjectModuleFactoryDelegate pd = (ProjectModuleFactoryDelegate)d; IModule[] modules = pd.getModules(project); if (modules!=null && modules.length>0) // return empty array - let the other guy handle this one return new IModule[0]; } } } String type = IBPELModuleFacetConstants.BPEL20_MODULE_TYPE; String version = IBPELModuleFacetConstants.BPEL20_MODULE_VERSION; IModule module = createModule(component.getName(), component.getName(), type, version, project); FlatComponentDeployable moduleDelegate = createModuleDelegate(project, component); moduleDelegates.put(module, moduleDelegate); projectModules.add(module); // Check to add any binary modules // if (J2EEProjectUtilities.ENTERPRISE_APPLICATION.equals(type)) // projectModules.addAll(LEGACY_createBinaryModules(component)); } else { return null; } } catch (Exception e) { // e.printStackTrace(); // J2EEPlugin.logError(e); } return projectModules.toArray(new IModule[projectModules.size()]); } protected FlatComponentDeployable createModuleDelegate(IProject project, IVirtualComponent component) { return new BPELDeployable(project, component); } // protected FlatComponentDeployable getNestedDelegate(IVirtualComponent component) { // return new BPELDeployable(component.getProject(), component); // } /** * Returns the list of resources that the module should listen to for state * changes. The paths should be project relative paths. Subclasses can * override this method to provide the paths. * * @return a possibly empty array of paths */ @Override protected IPath[] getListenerPaths() { return new IPath[] { new Path(".project"), // nature //$NON-NLS-1$ new Path(StructureEdit.MODULE_META_FILE_NAME), // component new Path(".settings/org.eclipse.wst.common.project.facet.core.xml") // facets //$NON-NLS-1$ }; } @Override protected void clearCache(IProject project) { super.clearCache(project); List<IModule> modulesToRemove = null; for (Iterator<IModule> iterator = moduleDelegates.keySet().iterator(); iterator.hasNext();) { IModule module = iterator.next(); if (module.getProject().equals(project)) { if (modulesToRemove == null) { modulesToRemove = new ArrayList<IModule>(); } modulesToRemove.add(module); } } if (modulesToRemove != null) { for (IModule module : modulesToRemove) { moduleDelegates.remove(module); } } } // /** // * From this point on, when queried, projects will generate their binary // * child modules on the fly and they will be small and dumb // * // * @param parent // * @param child // * @return // */ // public IModule createChildModule(FlatComponentDeployable parent, IChildModuleReference child) { // File file = child.getFile(); // if( file != null ) { // IPath p = new Path(file.getAbsolutePath()); // JavaEEQuickPeek qp = JavaEEBinaryComponentHelper.getJavaEEQuickPeek(p); // IModule module = createModule(qp, BINARY_PREFIX + file.getAbsolutePath(), file.getName(), parent.getProject()); // FlatComponentDeployable moduleDelegate = getNestedDelegate(child.getComponent()); // moduleDelegates.put(module, moduleDelegate); // return module; // } // return null; // } // /** // * Create a module delegate on the fly for this binary file // * @param module // * @return // */ // public ModuleDelegate createDelegate(IModule module) { // String internalId = ((Module)module).getInternalId(); // String path = internalId.substring(BINARY_PREFIX.length()); // File f = new File(path); // return new BinaryFileModuleDelegate(f); // } public void resourceChanged(IResourceChangeEvent event) { cleanAllDelegates(); } protected void cleanAllDelegates() { Iterator<FlatComponentDeployable> i = moduleDelegates.values().iterator(); while(i.hasNext()) { i.next().clearCache(); } modulesChanged(); } }