blob: 92571d8fc8615130c1e5b58e22826160faf05fc6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 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.jst.j2ee.internal.deployables;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.j2ee.application.Application;
import org.eclipse.jst.j2ee.application.Module;
import org.eclipse.jst.j2ee.client.ApplicationClient;
import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualArchiveComponent;
import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
import org.eclipse.jst.j2ee.ejb.EJBJar;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.j2ee.jca.Connector;
import org.eclipse.jst.j2ee.webapplication.WebApp;
import org.eclipse.wst.common.componentcore.ArtifactEdit;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
import org.eclipse.wst.common.componentcore.internal.StructureEdit;
import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
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.model.ModuleDelegate;
import org.eclipse.wst.server.core.util.ProjectModuleFactoryDelegate;
/**
* J2EE module factory.
*/
public class J2EEDeployableFactory extends ProjectModuleFactoryDelegate {
protected Map moduleDelegates = new HashMap(5);
public static final String ID = "org.eclipse.jst.j2ee.server"; //$NON-NLS-1$
public J2EEDeployableFactory() {
super();
}
protected IModule[] createModules(IProject project) {
try {
ModuleCoreNature nature = (ModuleCoreNature) project.getNature(IModuleConstants.MODULE_NATURE_ID);
if (nature != null)
return createModules(nature);
} catch (CoreException e) {
Logger.getLogger().write(e);
}
return null;
}
protected IModule[] createModules(ModuleCoreNature nature) {
IProject project = nature.getProject();
try {
IVirtualComponent comp = ComponentCore.createComponent(project);
return createModuleDelegates(comp);
} catch (Exception e) {
Logger.getLogger().write(e);
}
return null;
}
public ModuleDelegate getModuleDelegate(IModule module) {
return (ModuleDelegate) moduleDelegates.get(module);
}
protected IModule[] createModuleDelegates(IVirtualComponent component) {
List projectModules = new ArrayList();
try {
IModule module = null;
String type = J2EEProjectUtilities.getJ2EEProjectType(component.getProject());
if (type != null && !type.equals("")) {
String version = J2EEProjectUtilities.getJ2EEProjectVersion(component.getProject());
module = createModule(component.getDeployedName(), component.getDeployedName(), type, version, component.getProject());
J2EEFlexProjDeployable moduleDelegate = new J2EEFlexProjDeployable(component.getProject(), component);
moduleDelegates.put(module, moduleDelegate);
projectModules.add(module);
}
// Check to add any binary modules
if (J2EEProjectUtilities.ENTERPRISE_APPLICATION.equals(type))
projectModules.addAll(Arrays.asList(createBinaryModules(component)));
} catch (Exception e) {
Logger.getLogger().write(e);
}
return (IModule[]) projectModules.toArray(new IModule[projectModules.size()]);
}
protected IModule[] createBinaryModules(IVirtualComponent component) {
List projectModules = new ArrayList();
EARArtifactEdit earEdit = null;
try {
earEdit = EARArtifactEdit.getEARArtifactEditForRead(component.getProject());
Application app = earEdit.getApplication();
IVirtualReference[] references = component.getReferences();
for (int i=0; i<references.length; i++) {
IVirtualComponent moduleComponent = references[i].getReferencedComponent();
// Is referenced component a J2EE binary module archive
if (moduleComponent instanceof J2EEModuleVirtualArchiveComponent) {
// Ensure module URI exists on EAR DD for binary archive
Module j2eeModule = app.getFirstModule(references[i].getArchiveName());
if (j2eeModule == null)
continue;
ArtifactEdit moduleEdit = null;
try {
String moduleVersion = null;
String moduleType = null;
if (j2eeModule.isEjbModule()) {
moduleEdit = ComponentUtilities.getArtifactEditForRead(moduleComponent, J2EEProjectUtilities.EJB);
EJBJar ejbJar = (EJBJar) moduleEdit.getContentModelRoot();
moduleType = J2EEProjectUtilities.EJB;
moduleVersion = ejbJar.getVersion();
}
else if (j2eeModule.isWebModule()) {
moduleEdit = ComponentUtilities.getArtifactEditForRead(moduleComponent, J2EEProjectUtilities.DYNAMIC_WEB);
WebApp webApp = (WebApp) moduleEdit.getContentModelRoot();
moduleType = J2EEProjectUtilities.DYNAMIC_WEB;
moduleVersion = webApp.getVersion();
}
else if (j2eeModule.isConnectorModule()) {
moduleEdit = ComponentUtilities.getArtifactEditForRead(moduleComponent, J2EEProjectUtilities.JCA);
Connector connector = (Connector) moduleEdit.getContentModelRoot();
moduleType = J2EEProjectUtilities.JCA;
moduleVersion = connector.getVersion();
}
else if (j2eeModule.isJavaModule()) {
moduleEdit = ComponentUtilities.getArtifactEditForRead(moduleComponent, J2EEProjectUtilities.APPLICATION_CLIENT);
ApplicationClient appClient = (ApplicationClient) moduleEdit.getContentModelRoot();
moduleType = J2EEProjectUtilities.APPLICATION_CLIENT;
moduleVersion = appClient.getVersion();
}
IModule nestedModule = createModule(moduleComponent.getDeployedName(), moduleComponent.getDeployedName(), moduleType, moduleVersion, moduleComponent.getProject());
if (nestedModule!=null) {
J2EEFlexProjDeployable moduleDelegate = new J2EEFlexProjDeployable(moduleComponent.getProject(), moduleComponent);
moduleDelegates.put(nestedModule, moduleDelegate);
projectModules.add(nestedModule);
moduleDelegate.getURI(nestedModule);
}
} finally {
if (moduleEdit!=null)
moduleEdit.dispose();
}
}
}
} finally {
if (earEdit!=null)
earEdit.dispose();
}
return (IModule[]) projectModules.toArray(new IModule[projectModules.size()]);
}
/**
* 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
*/
protected IPath[] getListenerPaths() {
return new IPath[] {
new Path(".project"), // nature
new Path(StructureEdit.MODULE_META_FILE_NAME), // component
new Path(".settings/org.eclipse.wst.common.project.facet.core.xml") // facets
};
}
protected void clearCache() {
moduleDelegates = new HashMap(5);
}
}