blob: 1e8ce00f348b691d0264a9aa92b0c1824611f964 [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.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
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.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jem.workbench.utility.JemProjectUtilities;
import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
import org.eclipse.jst.j2ee.ejb.EJBJar;
import org.eclipse.jst.j2ee.internal.EjbModuleExtensionHelper;
import org.eclipse.jst.j2ee.internal.IEJBModelExtenderManager;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.server.core.IApplicationClientModule;
import org.eclipse.jst.server.core.IConnectorModule;
import org.eclipse.jst.server.core.IEJBModule;
import org.eclipse.jst.server.core.IEnterpriseApplication;
import org.eclipse.jst.server.core.IJ2EEModule;
import org.eclipse.jst.server.core.IWebModule;
import org.eclipse.wst.common.componentcore.ArtifactEdit;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.internal.ModuleFolder;
import org.eclipse.wst.server.core.model.IModuleFolder;
import org.eclipse.wst.server.core.model.IModuleResource;
import org.eclipse.wst.web.internal.deployables.ComponentDeployable;
/**
* J2EE module superclass.
*/
public class J2EEFlexProjDeployable extends ComponentDeployable implements IJ2EEModule, IEnterpriseApplication, IApplicationClientModule, IConnectorModule, IEJBModule, IWebModule {
private static final IPath WEB_CLASSES_PATH = new Path("WEB-INF").append("classes"); //$NON-NLS-1$ //$NON-NLS-2$
/**
* Constructor for J2EEFlexProjDeployable.
*
* @param project
* @param aComponent
* @deprecated use J2EEFlexProjDeployable(IProject project)
*/
public J2EEFlexProjDeployable(IProject project, IVirtualComponent aComponent) {
super(project);
}
/**
* Constructor for J2EEFlexProjDeployable.
*
* @param project
*/
public J2EEFlexProjDeployable(IProject project) {
super(project);
}
/**
* Returns the root folders for the resources in this module.
*
* @return a possibly-empty array of resource folders
*/
public IContainer[] getResourceFolders() {
List result = new ArrayList();
IVirtualComponent vc = ComponentCore.createComponent(getProject());
if (vc != null) {
IVirtualFolder vFolder = vc.getRootFolder();
if (vFolder != null) {
IContainer[] underlyingFolders = vFolder.getUnderlyingFolders();
result.addAll(Arrays.asList(underlyingFolders));
IPackageFragmentRoot[] srcRoots = J2EEProjectUtilities.getSourceContainers(getProject());
try {
for (int i=0; i<srcRoots.length; i++) {
IResource corrResource = srcRoots[i].getCorrespondingResource();
if (corrResource == null || !(corrResource instanceof IContainer))
continue;
IContainer srcContainer = (IContainer) corrResource;
result.remove(srcContainer);
}
} catch (Exception e) {}
}
}
return (IContainer[]) result.toArray(new IContainer[result.size()]);
}
/**
* Returns the root folders containing Java output in this module.
*
* @return a possibly-empty array of Java output folders
*/
public IContainer[] getJavaOutputFolders() {
IVirtualComponent vc = ComponentCore.createComponent(getProject());
if (vc == null)
return new IContainer[0];
return J2EEProjectUtilities.getOutputContainers(getProject());
}
public IModuleResource[] members() throws CoreException {
members.clear();
IPath javaPath = Path.EMPTY;
if (J2EEProjectUtilities.isDynamicWebProject(component.getProject()))
javaPath = WEB_CLASSES_PATH;
IVirtualComponent vc = ComponentCore.createComponent(getProject());
if (vc != null) {
IVirtualFolder vFolder = vc.getRootFolder();
IModuleResource[] mr = getMembers(vFolder, Path.EMPTY);
int size = mr.length;
for (int j = 0; j < size; j++) {
if (!members.contains(mr[j]))
members.add(mr[j]);
}
List utilMembers = getUtilMembers(vc);
if (!utilMembers.isEmpty())
members.addAll(utilMembers);
}
IContainer[] javaCont = getJavaOutputFolders();
int size = javaCont.length;
for (int i = 0; i < size; i++) {
IModuleResource[] mr = getMembers(javaCont[i], javaPath, javaPath, javaCont);
int size2 = mr.length;
for (int j = 0; j < size2; j++) {
if (!members.contains(mr[j]))
members.add(mr[j]);
}
}
IModuleResource[] mr = new IModuleResource[members.size()];
members.toArray(mr);
return mr;
}
protected IModuleResource[] handleJavaPath(IPath path, IPath javaPath, IPath curPath, IContainer[] javaCont, IModuleResource[] mr, IContainer cc) throws CoreException {
if (curPath.equals(javaPath)) {
int size = javaCont.length;
for (int i = 0; i < size; i++) {
IModuleResource[] mr2 = getMembers(javaCont[i], path.append(cc.getName()), null, null);
IModuleResource[] mr3 = new IModuleResource[mr.length + mr2.length];
System.arraycopy(mr, 0, mr3, 0, mr.length);
System.arraycopy(mr2, 0, mr3, mr.length, mr2.length);
mr = mr3;
}
} else {
boolean containsFolder = false;
String name = javaPath.segment(curPath.segmentCount());
int size = mr.length;
for (int i = 0; i < size && !containsFolder; i++) {
if (mr[i] instanceof IModuleFolder) {
IModuleFolder mf2 = (IModuleFolder) mr[i];
if (name.equals(mf2.getName())) {
containsFolder = true;
}
}
}
if (!containsFolder && javaCont.length > 0) {
ModuleFolder mf2 = new ModuleFolder(javaCont[0], name, curPath);
IModuleResource[] mrf = new IModuleResource[0];
size = javaCont.length;
for (int i = 0; i < size; i++) {
IModuleResource[] mrf2 = getMembers(javaCont[i], javaPath, null, null);
IModuleResource[] mrf3 = new IModuleResource[mrf.length + mrf2.length];
System.arraycopy(mrf, 0, mrf3, 0, mrf.length);
System.arraycopy(mrf2, 0, mrf3, mrf.length, mrf2.length);
mrf = mrf3;
}
mf2.setMembers(mrf);
IModuleResource[] mr3 = new IModuleResource[mr.length + 1];
System.arraycopy(mr, 0, mr3, 0, mr.length);
mr3[mr.length] = mf2;
mr = mr3;
}
}
return mr;
}
/**
* Returns the classpath as a list of absolute IPaths.
*
* @return an array of paths
*/
public IPath[] getClasspath() {
List paths = new ArrayList();
IJavaProject proj = JemProjectUtilities.getJavaProject(getProject());
URL[] urls = JemProjectUtilities.getClasspathAsURLArray(proj);
for (int i = 0; i < urls.length; i++) {
URL url = urls[i];
paths.add(Path.fromOSString(url.getPath()));
}
return (IPath[]) paths.toArray(new IPath[paths.size()]);
}
public String getJNDIName(String ejbName) {
if (!J2EEProjectUtilities.isEJBProject(component.getProject()))
return null;
EjbModuleExtensionHelper modHelper = null;
EJBJar jar = null;
ArtifactEdit ejbEdit = null;
try {
ejbEdit = ComponentUtilities.getArtifactEditForRead(component);
if (ejbEdit != null) {
jar = (EJBJar) ejbEdit.getContentModelRoot();
modHelper = IEJBModelExtenderManager.INSTANCE.getEJBModuleExtension(null);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ejbEdit != null)
ejbEdit.dispose();
}
return modHelper == null ? null : modHelper.getJNDIName(jar, jar.getEnterpriseBeanNamed(ejbName));
}
public String getURI(IModule module) {
IProject[] earProjects = J2EEProjectUtilities.getReferencingEARProjects(component.getProject());
List uriList = new ArrayList();
String aURI = null;
IVirtualComponent ear = null;
if (earProjects.length>0) {
for (int i=0; i<earProjects.length; i++) {
ear = ComponentCore.createComponent(earProjects[i]);
if (ear != null && component != null) {
EARArtifactEdit earEdit = null;
try {
earEdit = EARArtifactEdit.getEARArtifactEditForRead(ear);
if (earEdit != null) {
aURI = earEdit.getModuleURI(component);
if (aURI != null)
uriList.add(aURI);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (earEdit != null)
earEdit.dispose();
}
}
}
} else if (component!=null && J2EEProjectUtilities.isEARProject(component.getProject())) {
aURI = component.getDeployedName()+IJ2EEModuleConstants.EAR_EXT;
} else if (component!=null && J2EEProjectUtilities.isDynamicWebProject(component.getProject())) {
aURI = component.getDeployedName()+IJ2EEModuleConstants.WAR_EXT;
} else if (component!=null && (J2EEProjectUtilities.isEJBProject(component.getProject()) || J2EEProjectUtilities.isApplicationClientProject(component.getProject()))) {
aURI = component.getDeployedName()+IJ2EEModuleConstants.JAR_EXT;
} else if (component!=null && J2EEProjectUtilities.isJCAProject(component.getProject())) {
aURI = component.getDeployedName()+IJ2EEModuleConstants.RAR_EXT;
}
if (aURI !=null && aURI.length()>1 && aURI.startsWith("/")) //$NON-NLS-1$
aURI = aURI.substring(1);
return aURI;
}
public String getContextRoot() {
Properties props = component.getMetaProperties();
if(props.containsKey(J2EEConstants.CONTEXTROOT))
return props.getProperty(J2EEConstants.CONTEXTROOT);
return component.getName();
}
protected boolean isFileInSourceContainer(IFile file) {
boolean result = false;
if (file == null)
return false;
IPackageFragmentRoot[] srcContainers = J2EEProjectUtilities.getSourceContainers(getProject());
for (int i=0; i<srcContainers.length; i++) {
IPath srcPath = srcContainers[i].getPath();
result = srcPath.isPrefixOf(file.getFullPath());
if (result)
break;
}
return result;
}
}