blob: 26b7f7ff8871dd1638f628c8113d60bcc225158f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 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.commonarchivecore.internal.impl;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.jst.j2ee.application.Application;
import org.eclipse.jst.j2ee.application.ApplicationFactory;
import org.eclipse.jst.j2ee.application.ApplicationPackage;
import org.eclipse.jst.j2ee.application.ConnectorModule;
import org.eclipse.jst.j2ee.application.EjbModule;
import org.eclipse.jst.j2ee.application.JavaClientModule;
import org.eclipse.jst.j2ee.application.Module;
import org.eclipse.jst.j2ee.application.WebModule;
import org.eclipse.jst.j2ee.client.ApplicationClient;
import org.eclipse.jst.j2ee.client.internal.impl.ApplicationClientResourceFactory;
import org.eclipse.jst.j2ee.common.EjbRef;
import org.eclipse.jst.j2ee.common.SecurityRole;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonArchiveResourceHandler;
import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleRef;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ArchiveWrappedException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.EmptyResourceException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ObjectNotFoundException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ResourceLoadException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseArchive;
import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
import org.eclipse.jst.j2ee.ejb.EJBJar;
import org.eclipse.jst.j2ee.ejb.EJBResource;
import org.eclipse.jst.j2ee.ejb.EjbPackage;
import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
import org.eclipse.jst.j2ee.ejb.internal.impl.EJBJarResourceFactory;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.common.XMLResource;
import org.eclipse.jst.j2ee.jca.Connector;
import org.eclipse.jst.j2ee.jca.internal.impl.ConnectorResourceFactory;
import org.eclipse.jst.j2ee.webapplication.WebApp;
import org.eclipse.jst.j2ee.webapplication.internal.impl.WebAppResourceFactory;
import org.eclipse.wst.common.internal.emf.resource.FileNameResourceFactoryRegistry;
import org.eclipse.wst.common.internal.emf.utilities.EtoolsCopyUtility;
/**
* @generated
*/
public class EARFileImpl extends ModuleFileImpl implements EARFile {
/**
* Internal; clients should use {@link #getModuleRef(Module)}
*/
public ModuleFile getModuleFile(Module moduleDescriptor) {
ModuleRef ref = getModuleRef(moduleDescriptor);
return (ref == null) ? null : ref.getModuleFile();
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public ModuleFile addCopy(ModuleFile aModuleFile) throws DuplicateObjectException {
Object result = primAddCopyRef(aModuleFile);
if (result instanceof ModuleRef)
return ((ModuleRef) result).getModuleFile();
return (ModuleFile) result;
}
/**
* @generated This field/method will be replaced during code generation.
*/
/**
* @generated This field/method will be replaced during code generation.
*/
protected Application deploymentDescriptor = null;
/**
* @generated This field/method will be replaced during code generation.
*/
protected EList moduleRefs = null;
public EARFileImpl() {
super();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
protected EClass eStaticClass() {
return CommonarchivePackage.Literals.EAR_FILE;
}
public Archive addCopy(Archive anArchive) throws org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException {
if (anArchive.isModuleFile())
return addCopy((ModuleFile) anArchive);
Archive copy = super.addCopy(anArchive);
copy.initializeClassLoader();
return copy;
}
protected Object primAddCopyRef(ModuleFile aModuleFile) throws DuplicateObjectException {
//force this list to get initialized before the add
EList refs = getModuleRefs();
if (aModuleFile.isEARFile())
//If it's an ear then just treat it like any other archive
return (ModuleFile) super.addCopy(aModuleFile);
checkAddValid(aModuleFile);
ModuleFile copy = getCommonArchiveFactory().copy(aModuleFile);
Module newModule = createModuleForCopying(aModuleFile);
getFiles().add(copy);
copy.initializeClassLoader();
if (!copy.getURI().equals(newModule.getUri()))
copy.setURI(newModule.getUri());
getDeploymentDescriptor().getModules().add(newModule);
ModuleRef aRef = createModuleRef(newModule, copy);
refs.add(aRef);
return aRef;
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public ModuleRef addCopyRef(ModuleFile aModuleFile) throws DuplicateObjectException {
Object result = primAddCopyRef(aModuleFile);
if (result instanceof ModuleRef)
return (ModuleRef) result;
return null;
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public SecurityRole addCopy(SecurityRole aRole, Module aModule) throws DuplicateObjectException {
EObject dd = null;
try {
dd = getDeploymentDescriptor(aModule);
} catch (Exception e) {
throw new DeploymentDescriptorLoadException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dd_in_ear_load_EXC_, (new Object[]{aModule.getUri(), getURI()})), e); // = "Exception occurred loading deployment descriptor for module "{0}" in ear file "{1}""
}
String roleName = aRole.getRoleName();
SecurityRole copy = (SecurityRole) EtoolsCopyUtility.createCopy(aRole);
if (aModule.isEjbModule()) {
EJBJar ejbJar = (EJBJar) dd;
if (ejbJar.containsSecurityRole(roleName))
throw new DuplicateObjectException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dup_sec_role_module_EXC_, (new Object[]{aModule.getUri(), roleName})), ejbJar.getAssemblyDescriptor().getSecurityRoleNamed(roleName)); // = "Deployment descriptor for {0} already contains a security role named {1}"
getAssemblyDescriptorAddIfNecessary(ejbJar).getSecurityRoles().add(copy);
} else if (aModule.isWebModule()) {
WebApp webApp = (WebApp) dd;
if (webApp.containsSecurityRole(roleName))
throw new DuplicateObjectException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dup_sec_role_module_EXC_, (new Object[]{aModule.getUri(), roleName})), webApp.getSecurityRoleNamed(roleName));// = "Deployment descriptor for {0} already contains a security role named {1}"
webApp.getSecurityRoles().add(copy);
}
addCopyIfNotExists(aRole);
return copy;
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public SecurityRole addCopyIfNotExists(SecurityRole aRole) {
Application dd = getDeploymentDescriptor();
SecurityRole copy = null;
if (!dd.containsSecurityRole(aRole.getRoleName())) {
copy = (SecurityRole) EtoolsCopyUtility.createCopy(aRole);
dd.getSecurityRoles().add(copy);
}
return copy;
}
protected void checkDuplicate(String aUri) throws DuplicateObjectException {
if (isDuplicate(aUri))
throw new DuplicateObjectException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dup_resource_EXC_, (new Object[]{aUri, getURI()}))); // = "Resource named "{0}" already exists in archive "{1}""
}
protected Module createModuleForCopying(ModuleFile aModuleFile) {
Module aModule = null;
if (aModuleFile.isWARFile()) {
aModule = getApplicationFactory().createWebModule();
} else if (aModuleFile.isEJBJarFile()) {
aModule = getApplicationFactory().createEjbModule();
} else if (aModuleFile.isApplicationClientFile()) {
aModule = getApplicationFactory().createJavaClientModule();
} else if (aModuleFile.isRARFile()) {
aModule = getApplicationFactory().createConnectorModule();
}
aModule.setUri(aModuleFile.getURI());
return aModule;
}
/**
* Retrieves the deployment descriptor root element for the specified module. Takes into account
* altDD indirection.
*
* @return Only return null if an altDD is not defined.
*/
public EObject getAltDeploymentDescriptor(Module aModule) throws FileNotFoundException, ResourceLoadException, EmptyResourceException {
// Look for altDD
String altDD = aModule.getAltDD();
if (ArchiveUtil.isNullOrEmpty(altDD))
return null;
if (!isMofResourceLoaded(altDD.trim()))
registerResourceFactory(aModule, altDD);
XMLResource ddRes = (XMLResource) getMofResource(altDD.trim());
if (!ddRes.isAlt()) {
ddRes.setIsAlt(true);
ddRes.setApplication(getDeploymentDescriptor());
}
return ArchiveUtil.getRoot(ddRes);
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public java.util.List getApplicationClientFiles() {
List clientFiles = new ArrayList();
List fileList = getFiles();
for (int i = 0; i < fileList.size(); i++) {
File aFile = (File) fileList.get(i);
if (aFile.isApplicationClientFile()) {
clientFiles.add(aFile);
}
}
return clientFiles;
}
protected ApplicationFactory getApplicationFactory() {
return ((ApplicationPackage) EPackage.Registry.INSTANCE.getEPackage(ApplicationPackage.eNS_URI)).getApplicationFactory();
}
protected AssemblyDescriptor getAssemblyDescriptorAddIfNecessary(EJBJar ejbJar) {
AssemblyDescriptor ad = ejbJar.getAssemblyDescriptor();
if (ad == null) {
ad = ((EjbPackage) EPackage.Registry.INSTANCE.getEPackage(EjbPackage.eNS_URI)).getEjbFactory().createAssemblyDescriptor();
ejbJar.setAssemblyDescriptor(ad);
}
return ad;
}
/**
* @throws DeploymentDescriptorLoadException -
* is a runtime exception, because we can't override the signature of the generated
* methods
*/
public Application getDeploymentDescriptor() throws DeploymentDescriptorLoadException {
Application dd = this.getDeploymentDescriptorGen();
if (dd == null && canLazyInitialize()) {
try {
getImportStrategy().importMetaData();
} catch (Exception e) {
throw new DeploymentDescriptorLoadException(getDeploymentDescriptorUri(), e);
}
}
return this.getDeploymentDescriptorGen();
}
/**
* Retrieves the deployment descriptor root element for the specified module. Takes into account
* altDD indirection.
*/
public Connector getDeploymentDescriptor(ConnectorModule aModule) throws FileNotFoundException, ResourceLoadException, EmptyResourceException {
return (Connector) getDeploymentDescriptor((Module) aModule);
}
/**
* Retrieves the deployment descriptor root element for the specified module. Takes into account
* altDD indirection.
*/
public EJBJar getDeploymentDescriptor(EjbModule aModule) throws FileNotFoundException, ResourceLoadException, EmptyResourceException {
return (EJBJar) getDeploymentDescriptor((Module) aModule);
}
/**
* Retrieves the deployment descriptor root element for the specified module. Takes into account
* altDD indirection.
*/
public ApplicationClient getDeploymentDescriptor(JavaClientModule aModule) throws FileNotFoundException, ResourceLoadException, EmptyResourceException {
return (ApplicationClient) getDeploymentDescriptor((Module) aModule);
}
/**
* Retrieves the deployment descriptor root element for the specified module. Takes into account
* altDD indirection.
*/
public EObject getDeploymentDescriptor(Module aModule) throws FileNotFoundException, ResourceLoadException, EmptyResourceException {
EObject dd = getAltDeploymentDescriptor(aModule);
if (dd == null)
dd = getModuleFile(aModule).getStandardDeploymentDescriptor();
return dd;
}
/**
* Retrieves the deployment descriptor root element for the specified module. Takes into account
* altDD indirection.
*/
public WebApp getDeploymentDescriptor(WebModule aModule) throws FileNotFoundException, ResourceLoadException, EmptyResourceException {
return (WebApp) getDeploymentDescriptor((Module) aModule);
}
/**
* @see com.ibm.etools.commonarchive.ModuleFile
*/
public java.lang.String getDeploymentDescriptorUri() {
return J2EEConstants.APPLICATION_DD_URI;
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public java.util.List getEJBJarFiles() {
List ejbJarFiles = new ArrayList();
List fileList = getFiles();
for (int i = 0; i < fileList.size(); i++) {
File aFile = (File) fileList.get(i);
if (aFile.isEJBJarFile()) {
ejbJarFiles.add(aFile);
}
}
return ejbJarFiles;
}
/**
* Return an enterprise bean referenced by the EjbRef, if one exists. The ejb-link value of the
* ref must equate to a named enterprise bean contained in the jar; otherwise return null.
* Returns the first hit found; assumption that the ejb names are unique within the scope of the
* ear file. This will likely be replaced with a better way for dereferencing ejb refs.
*
* Can be used with ejb 1.1 references only.
*
* @deprecated {@link#getEnterpiseBeanFromRef(EjbRef ref, String moduleUri )
* @param EjbRef
* ref - An ejb reference
* @return EnterpriseBean
*/
public EnterpriseBean getEnterpiseBeanFromRef(EjbRef ref) {
String link = ref.getLink();
if (link == null) {
return null;
}
List jarFiles = getEJBJarFiles();
for (int i = 0; i < jarFiles.size(); i++) {
EnterpriseBean bean = ((EJBJarFile) jarFiles.get(i)).getDeploymentDescriptor().getEnterpriseBeanNamed(link);
if (bean != null) {
return bean;
}
}
return null;
}
/**
* Return an enterprise bean referenced by the EjbRef, if one exists. The ejb-link value of the
* ref must equate to a named enterprise bean contained in the jar; otherwise return null.
* Returns the first hit found; assumption that the ejb names are unique within the scope of the
* ear file. This will likely be replaced with a better way for dereferencing ejb refs
*
* Can be used with ejb 1.1 & ejb 2.0 references.
*
* @param EjbRef
* ref - An ejb reference
* @param String
* moduleUri - The module uri
* @return EnterpriseBean
*/
public EnterpriseBean getEnterpiseBeanFromRef(EjbRef ref, String moduleUri) {
String link = ref.getLink();
if (link == null) {
return null;
}// if
if (link.indexOf('#') == -1) {
EnterpriseBean linkedEJB = null;
XMLResource res = (XMLResource) ref.eResource();
if (res instanceof EJBResource) {
//Must be in an EJB JAR to be here
EJBJar jar = ((EJBResource) res).getEJBJar();
if (jar != null)
linkedEJB = jar.getEnterpiseBeanFromRef(ref);
}
if (linkedEJB == null) {
List jarFiles = getEJBJarFiles();
for (int i = 0; i < jarFiles.size(); i++) {
linkedEJB = ((EJBJarFile) jarFiles.get(i)).getDeploymentDescriptor().getEnterpriseBeanNamed(link);
if (linkedEJB != null) {
return linkedEJB;
}// if
}// for
} else
return linkedEJB;
} else {
//Grab the ejb name and ejb jar name from the link
String ejbBeanName = link.substring(link.indexOf("#") + 1, link.length()); //$NON-NLS-1$
String ejbJarName = link.substring(0, link.indexOf("#")); //$NON-NLS-1$
if (ejbBeanName != null && ejbJarName != null) {
//Get the uri of the jar name.
String ejbJarUri = ArchiveUtil.deriveEARRelativeURI(ejbJarName, moduleUri);
if (ejbJarUri != null) {
try {
//Get the actual jar file
File aFile = getFile(ejbJarUri);
if (aFile == null || !aFile.isEJBJarFile())
return null;
EJBJarFile jarFile = (EJBJarFile) getFile(ejbJarUri);
List ejbs = jarFile.getDeploymentDescriptor().getEnterpriseBeans();
//Check if any of the beans in the list match the given ejb bean name give
// in
//the link
if (ejbs != null && !ejbs.isEmpty()) {
Iterator it = ejbs.iterator();
while (it.hasNext()) {
EnterpriseBean ejbBean = (EnterpriseBean) it.next();
if (ejbBean != null && ejbBean.getName().equals(ejbBeanName)) {
return ejbBean;
}// if
}// while
}// if
} catch (FileNotFoundException fe) {
return null;
}// try
}// if
}// if
}// if
return null;
}// getEnterpiseBeanFromRef
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public Module getModule(String aUri, String altDD) {
return getDeploymentDescriptor().getModule(aUri, altDD);
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public ModuleRef getModuleRef(Module moduleDescriptor) {
List refs = getModuleRefs();
for (int i = 0; i < refs.size(); i++) {
ModuleRef ref = (ModuleRef) refs.get(i);
if (ref.getModule() == moduleDescriptor)
return ref;
}
return null;
}
/**
* Return a filtered list of the archives
*/
public List getModuleFiles() {
List moduleFiles = new ArrayList();
List fileList = getFiles();
for (int i = 0; i < fileList.size(); i++) {
File aFile = (File) fileList.get(i);
if (aFile.isModuleFile()) {
moduleFiles.add(aFile);
}
}
return moduleFiles;
}
protected ArchiveOptions getOptionsForOpening(String aUri) throws IOException {
LoadStrategy strategy = getCommonArchiveFactory().createChildLoadStrategy(aUri, getLoadStrategy());
return getOptions().cloneWith(strategy, aUri);
}
protected ArchiveOptions getOptionsForOpening(LooseArchive loose) throws IOException, OpenFailureException{
if(loose.getBinariesPath() == null){
throw new OpenFailureException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.open_nested_EXC_, (new Object[] {loose.getUri(), getURI()})), null); // = "Could not open the nested archive "{0}" in "{1}""
}
LoadStrategy strategy = getCommonArchiveFactory().createLoadStrategy(loose.getBinariesPath());
strategy.setLooseArchive(loose);
return getOptions().cloneWith(strategy, loose.getUri());
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public java.util.List getRARFiles() {
List rarFiles = new ArrayList();
List fileList = getFiles();
for (int i = 0; i < fileList.size(); i++) {
File aFile = (File) fileList.get(i);
if (aFile.isRARFile()) {
rarFiles.add(aFile);
}
}
return rarFiles;
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public EList getRolesFromAllModules() {
EList roleList = new org.eclipse.emf.common.util.BasicEList();
List modules = getDeploymentDescriptor().getModules();
for (int i = 0, n = modules.size(); i < n; i++) {
Module aModule = (Module) modules.get(i);
EList roles = getRolesFromModule(aModule);
for (int j = 0, m = roles.size(); j < m; j++) {
roleList.add(roles.get(j));
}
}
return roleList;
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public EList getRolesFromModule(Module aModule) {
EList roleList = new org.eclipse.emf.common.util.BasicEList();
try {
if (aModule.isWebModule())
roleList = getDeploymentDescriptor((WebModule) aModule).getSecurityRoles();
else if (aModule.isEjbModule())
roleList = getAssemblyDescriptorAddIfNecessary(getDeploymentDescriptor((EjbModule) aModule)).getSecurityRoles();
} catch (Exception e) {
throw new DeploymentDescriptorLoadException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dd_in_ear_load_EXC_, (new Object[]{aModule.getUri(), getURI()})), e); // = "Exception occurred loading deployment descriptor for module "{0}" in ear file "{1}""
}
return roleList;
}
/**
* Return the DeployementDescriptor.
*/
public EObject getStandardDeploymentDescriptor() throws DeploymentDescriptorLoadException {
return getDeploymentDescriptor();
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public java.util.List getWARFiles() {
List warFiles = new ArrayList();
List fileList = getFiles();
for (int i = 0; i < fileList.size(); i++) {
File aFile = (File) fileList.get(i);
if (aFile.isWARFile()) {
warFiles.add(aFile);
}
}
return warFiles;
}
public void initializeAfterOpen() {
super.initializeAfterOpen();
}
public boolean isDeploymentDescriptorSet() {
return deploymentDescriptor != null;
}
/**
* @see com.ibm.etools.commonarchive.File
*/
public boolean isEARFile() {
return true;
}
/**
* Return true if super returns true, or return whether the app dd contains a module having the
* uri
*/
public boolean isNestedArchive(String aUri) {
if (super.isNestedArchive(aUri))
return true;
return getDeploymentDescriptor().getFirstModule(aUri) != null;
}
/**
* @see com.ibm.etools.commonarchive.impl.ModuleFileImpl
*/
public org.eclipse.emf.ecore.EObject makeDeploymentDescriptor(XMLResource resource) {
Application appl = ((ApplicationPackage) EPackage.Registry.INSTANCE.getEPackage(ApplicationPackage.eNS_URI)).getApplicationFactory().createApplication();
resource.setID(appl, J2EEConstants.APPL_ID);
setDeploymentDescriptorGen(appl);
resource.getContents().add(appl);
return appl;
}
/**
* @see com.ibm.etools.commonarchive.Archive
*/
public Archive openNestedArchive(LooseArchive loose) throws OpenFailureException {
Module m = getDeploymentDescriptor().getFirstModule(loose.getUri());
if (m == null)
return super.openNestedArchive(loose);
try {
ArchiveOptions archiveOptions = getOptionsForOpening(loose);
return openNestedArchive(m, archiveOptions);
} catch (java.io.IOException ex) {
//Probably the file did not exist; silently fail, per request from WS runtime
//More than likely a failure is going to occur down the road when a ModuleFile for a
// Module
//in the dd is requested
}
return null;
}
/**
* @see com.ibm.etools.commonarchive.Archive
*/
public Archive openNestedArchive(String aUri) throws OpenFailureException {
Module m = getDeploymentDescriptor().getFirstModule(aUri);
if (m == null)
return super.openNestedArchive(aUri);
try {
ArchiveOptions archiveOptions = getOptionsForOpening(aUri);
return openNestedArchive(m, archiveOptions);
} catch (java.io.IOException ex) {
//Probably the file did not exist; silently fail, per request from WS runtime
//More than likely a failure is going to occur down the road when a ModuleFile for a
// Module
//in the dd is requested
}
return null;
}
protected Archive openNestedArchive(Module m, ArchiveOptions archiveOptions) throws OpenFailureException {
String aUri = m.getUri();
try {
/*
* Since we have a clue about the type of archive to open Use the appropriate open
* method, so if a failure occurrs, we can get a more specific message
*/
if (m.isWebModule())
return getCommonArchiveFactory().openWARFile(archiveOptions, aUri);
else if (m.isEjbModule())
return getCommonArchiveFactory().openEJBJarFile(archiveOptions, aUri);
else if (m.isJavaModule())
return getCommonArchiveFactory().openApplicationClientFile(archiveOptions, aUri);
else if (m.isConnectorModule())
return getCommonArchiveFactory().openRARFile(archiveOptions, aUri);
} catch (OpenFailureException ex) {
throw new OpenFailureException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.nested_open_fail_EXC_, (new Object[]{aUri, getURI()})), ex); // = "Unable to open module file "{0}" in EAR file "{1}""
}
//Should never reach the code below
return null;
}
/**
* @see EARFile
*/
public void pushDownRole(SecurityRole role) {
if (role == null)
throw new IllegalArgumentException(CommonArchiveResourceHandler.Parameter_should_not_be_nu_EXC_); // = "Parameter should not be null"
List modules = getDeploymentDescriptor().getModules();
for (int i = 0; i < modules.size(); i++) {
Module m = (Module) modules.get(i);
pushDownRole(role, m);
}
}
/**
* @see EARFile
*/
public void pushDownRole(SecurityRole role, Module aModule) {
try {
if (aModule.isWebModule()) {
WebApp dd = getDeploymentDescriptor((WebModule) aModule);
if (dd.getSecurityRoleNamed(role.getRoleName()) == null)
dd.getSecurityRoles().add(EtoolsCopyUtility.createCopy(role));
} else if (aModule.isEjbModule()) {
AssemblyDescriptor assembly = getAssemblyDescriptorAddIfNecessary(getDeploymentDescriptor((EjbModule) aModule));
if (assembly.getSecurityRoleNamed(role.getRoleName()) == null)
assembly.getSecurityRoles().add(EtoolsCopyUtility.createCopy(role));
}
} catch (Exception e) {
throw new DeploymentDescriptorLoadException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dd_in_ear_load_EXC_, (new Object[]{aModule.getUri(), getURI()})), e); // = "Exception occurred loading deployment descriptor for module "{0}" in ear file "{1}""
}
}
/**
* An alt-dd is about to be loaded; register the appropriate resource factory for the uri so it
* will get loaded correctly.
*/
protected void registerResourceFactory(Module aModule, String aUri) {
org.eclipse.emf.ecore.resource.Resource.Factory factory = null;
if (aModule.isEjbModule())
factory = EJBJarResourceFactory.getRegisteredFactory();
else if (aModule.isWebModule())
factory = WebAppResourceFactory.getRegisteredFactory();
else if (aModule.isJavaModule())
factory = ApplicationClientResourceFactory.getRegisteredFactory();
else if (aModule.isConnectorModule())
factory = ConnectorResourceFactory.getRegisteredFactory();
if (factory != null) {
ResourceSet set = getResourceSet();
((FileNameResourceFactoryRegistry) set.getResourceFactoryRegistry()).registerLastFileSegment(aUri, factory);
}
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public void remove(ModuleRef aModuleRef) {
if (aModuleRef == null)
return;
Module aModule = aModuleRef.getModule();
if (aModule != null)
getDeploymentDescriptor().getModules().remove(aModule);
getModuleRefs().remove(aModuleRef);
if (getModuleRefs(aModuleRef.getModuleFile()).isEmpty())
getFiles().remove(aModuleRef.getModuleFile());
}
/**
* @see EARFile
*/
public List getModuleRefs(ModuleFile aModuleFile) {
List refs = getModuleRefs();
List result = new ArrayList(1);
for (int i = 0; i < refs.size(); i++) {
ModuleRef ref = (ModuleRef) refs.get(i);
if (ref.getModuleFile() == aModuleFile)
result.add(ref);
}
return result;
}
protected void renameRolesInModuleDDs(String existingRoleName, String newRoleName) {
List modules = getDeploymentDescriptor().getModules();
for (int i = 0; i < modules.size(); i++) {
Module m = (Module) modules.get(i);
try {
if (m.isEjbModule())
getDeploymentDescriptor((EjbModule) m).renameSecurityRole(existingRoleName, newRoleName);
else if (m.isWebModule())
getDeploymentDescriptor((WebModule) m).renameSecurityRole(existingRoleName, newRoleName);
} catch (Exception e) {
throw new DeploymentDescriptorLoadException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dd_in_ear_load_EXC_, (new Object[]{m.getUri(), getURI()})), e); // = "Exception occurred loading deployment descriptor for module "{0}" in ear file "{1}""
}
}
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public void renameSecurityRole(String existingRoleName, String newRoleName) throws ObjectNotFoundException, DuplicateObjectException {
Application app = getDeploymentDescriptor();
SecurityRole aRole = app.getSecurityRoleNamed(existingRoleName);
if (aRole == null)
throw new ObjectNotFoundException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.no_sec_role_EXC_, (new Object[]{getURI(), existingRoleName}))); // = ": EAR File deployment descriptor does not contain a security role named "
if (app.getSecurityRoleNamed(newRoleName) != null)
throw new DuplicateObjectException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dup_sec_role_EXC_, (new Object[]{getURI(), newRoleName})), app.getSecurityRoleNamed(newRoleName)); // = ": EAR File deployment descriptor already contains a security role named "
aRole.setRoleName(newRoleName);
renameRolesInModuleDDs(existingRoleName, newRoleName);
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public void rollUpRoles() {
List modules = getDeploymentDescriptor().getModules();
for (int i = 0; i < modules.size(); i++) {
Module aModule = (Module) modules.get(i);
rollUpRoles(aModule);
}
}
/**
* @see com.ibm.etools.commonarchive.EARFile
*/
public void rollUpRoles(Module aModule) {
List securityRoles = null;
try {
if (aModule.isWebModule())
securityRoles = getDeploymentDescriptor((WebModule) aModule).getSecurityRoles();
else if (aModule.isEjbModule())
securityRoles = getAssemblyDescriptorAddIfNecessary(getDeploymentDescriptor((EjbModule) aModule)).getSecurityRoles();
} catch (Exception e) {
throw new DeploymentDescriptorLoadException(CommonArchiveResourceHandler.getString(CommonArchiveResourceHandler.dd_in_ear_load_EXC_, (new Object[]{aModule.getUri(), getURI()})), e); // = "Exception occurred loading deployment descriptor for module "{0}" in ear file "{1}""
}
if (securityRoles == null)
return;
for (int i = 0; i < securityRoles.size(); i++) {
addCopyIfNotExists((SecurityRole) securityRoles.get(i));
}
}
public void setDeploymentDescriptor(Application l) {
this.setDeploymentDescriptorGen(l);
replaceRoot(getMofResourceMakeIfNecessary(getDeploymentDescriptorUri()), l);
}
/**
* @generated This field/method will be replaced during code generation
*/
public Application getDeploymentDescriptorGen() {
if (deploymentDescriptor != null && deploymentDescriptor.eIsProxy()) {
InternalEObject oldDeploymentDescriptor = (InternalEObject)deploymentDescriptor;
deploymentDescriptor = (Application)eResolveProxy(oldDeploymentDescriptor);
if (deploymentDescriptor != oldDeploymentDescriptor) {
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, CommonarchivePackage.EAR_FILE__DEPLOYMENT_DESCRIPTOR, oldDeploymentDescriptor, deploymentDescriptor));
}
}
return deploymentDescriptor;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Application basicGetDeploymentDescriptor() {
return deploymentDescriptor;
}
/**
* @generated This field/method will be replaced during code generation.
*/
public void setDeploymentDescriptorGen(Application newDeploymentDescriptor) {
Application oldDeploymentDescriptor = deploymentDescriptor;
deploymentDescriptor = newDeploymentDescriptor;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, CommonarchivePackage.EAR_FILE__DEPLOYMENT_DESCRIPTOR, oldDeploymentDescriptor, deploymentDescriptor));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case CommonarchivePackage.EAR_FILE__MODULE_REFS:
return ((InternalEList)getModuleRefs()).basicAdd(otherEnd, msgs);
}
return super.eInverseAdd(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case CommonarchivePackage.EAR_FILE__MODULE_REFS:
return ((InternalEList)getModuleRefs()).basicRemove(otherEnd, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case CommonarchivePackage.EAR_FILE__MODULE_REFS:
return getModuleRefs();
case CommonarchivePackage.EAR_FILE__DEPLOYMENT_DESCRIPTOR:
if (resolve) return getDeploymentDescriptor();
return basicGetDeploymentDescriptor();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case CommonarchivePackage.EAR_FILE__MODULE_REFS:
getModuleRefs().clear();
getModuleRefs().addAll((Collection)newValue);
return;
case CommonarchivePackage.EAR_FILE__DEPLOYMENT_DESCRIPTOR:
setDeploymentDescriptor((Application)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void eUnset(int featureID) {
switch (featureID) {
case CommonarchivePackage.EAR_FILE__MODULE_REFS:
getModuleRefs().clear();
return;
case CommonarchivePackage.EAR_FILE__DEPLOYMENT_DESCRIPTOR:
setDeploymentDescriptor((Application)null);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean eIsSet(int featureID) {
switch (featureID) {
case CommonarchivePackage.EAR_FILE__MODULE_REFS:
return moduleRefs != null && !moduleRefs.isEmpty();
case CommonarchivePackage.EAR_FILE__DEPLOYMENT_DESCRIPTOR:
return deploymentDescriptor != null;
}
return super.eIsSet(featureID);
}
/**
* @generated This field/method will be replaced during code generation
*/
public EList getModuleRefsGen() {
if (moduleRefs == null) {
moduleRefs = new EObjectContainmentWithInverseEList(ModuleRef.class, this, CommonarchivePackage.EAR_FILE__MODULE_REFS, CommonarchivePackage.MODULE_REF__EAR_FILE);
}
return moduleRefs;
}
public EList getModuleRefs() {
EList refs = getModuleRefsGen();
if (refs.isEmpty())
initRefs(refs);
return refs;
}
public void initRefs(EList refs) {
List modules = getDeploymentDescriptor().getModules();
for (int i = 0; i < modules.size(); i++) {
Module module = (Module) modules.get(i);
refs.add(createModuleRef(module, null));
}
}
protected ModuleRef createModuleRef(Module aModule, ModuleFile aFile) {
ModuleRef newRef = null;
if (aModule.isEjbModule())
newRef = getCommonArchiveFactory().createEJBModuleRef();
else if (aModule.isWebModule())
newRef = getCommonArchiveFactory().createWebModuleRef();
else if (aModule.isConnectorModule())
newRef = getCommonArchiveFactory().createConnectorModuleRef();
else if (aModule.isJavaModule())
newRef = getCommonArchiveFactory().createClientModuleRef();
newRef.setModule(aModule);
newRef.setModuleFile(aFile);
return newRef;
}
/*
* @see EARFile#getClientModuleRefs()
*/
public List getClientModuleRefs() {
List result = new ArrayList();
List refs = getModuleRefs();
for (int i = 0; i < refs.size(); i++) {
ModuleRef ref = (ModuleRef) refs.get(i);
if (ref.isClient())
result.add(ref);
}
return result;
}
/*
* @see EARFile#getConnectorModuleRefs()
*/
public List getConnectorModuleRefs() {
List result = new ArrayList();
List refs = getModuleRefs();
for (int i = 0; i < refs.size(); i++) {
ModuleRef ref = (ModuleRef) refs.get(i);
if (ref.isConnector())
result.add(ref);
}
return result;
}
/*
* @see EARFile#getEJBModuleRefs()
*/
public List getEJBModuleRefs() {
List result = new ArrayList();
List refs = getModuleRefs();
for (int i = 0; i < refs.size(); i++) {
ModuleRef ref = (ModuleRef) refs.get(i);
if (ref.isEJB())
result.add(ref);
}
return result;
}
/*
* @see EARFile#getWebModuleRefs()
*/
public List getWebModuleRefs() {
List result = new ArrayList();
List refs = getModuleRefs();
for (int i = 0; i < refs.size(); i++) {
ModuleRef ref = (ModuleRef) refs.get(i);
if (ref.isWeb())
result.add(ref);
}
return result;
}
/*
* @see EARFile#getFARFiles()
*/
public List getFARFiles() {
List farFiles = new ArrayList();
List fileList = getFiles();
for (int i = 0; i < fileList.size(); i++) {
File aFile = (File) fileList.get(i);
if (aFile.isFARFile()) {
farFiles.add(aFile);
}
}
return farFiles;
}
/*
* (non-Javadoc)
*
* @see com.ibm.etools.commonarchive.EARFile#getArchivesOfType(java.lang.String)
*/
public List getArchivesOfType(String type) {
return Collections.EMPTY_LIST;
}
public Map getEJBReferences(boolean filterLinkedReferences, boolean filterNonLinkedReferences) throws ArchiveWrappedException {
if (!filterLinkedReferences || !filterNonLinkedReferences) {
Application app = getDeploymentDescriptor();
if (app != null) {
List modules = app.getModules();
Module module;
Map references = null;
for (int i = 0; i < modules.size(); i++) {
module = (Module) modules.get(i);
try {
references = collectEJBReferences(module, filterLinkedReferences, filterNonLinkedReferences, references);
} catch (ResourceLoadException e) {
throw new ArchiveWrappedException(e);
} catch (FileNotFoundException e) {
throw new ArchiveWrappedException(e);
} catch (EmptyResourceException e) {
throw new ArchiveWrappedException(e);
}
}
return references;
}
}
return Collections.EMPTY_MAP;
}
/**
* @param module
* @param filterLinkedReferences
* @param filterNonLinkedReferences
* @param references
* @return
*/
private Map collectEJBReferences(Module module, boolean filterLinkedReferences, boolean filterNonLinkedReferences, Map references) throws ResourceLoadException, FileNotFoundException, EmptyResourceException {
Map myReferences = references;
List moduleReferences = getEJBReferneces(module);
if (moduleReferences != null && !moduleReferences.isEmpty()) {
EjbRef ref = null;
List filteredRefs = null;
String link = null;
for (int i = 0; i < moduleReferences.size(); i++) {
ref = (EjbRef) moduleReferences.get(i);
link = ref.getLink();
if ((link != null && link.length() > 0 && !filterLinkedReferences) || ((link == null || link.length() == 0) && !filterNonLinkedReferences)) {
if (filteredRefs == null)
filteredRefs = new ArrayList(moduleReferences.size());
filteredRefs.add(ref);
}
}
if (filteredRefs != null) {
if (myReferences == null)
myReferences = new HashMap();
myReferences.put(module, filteredRefs);
}
}
return myReferences;
}
/**
* @param module
* @return
*/
private List getEJBReferneces(Module module) throws ResourceLoadException, FileNotFoundException, EmptyResourceException {
if (module != null) {
if (module.isEjbModule()) {
EJBJar ejbJar = getDeploymentDescriptor((EjbModule) module);
return getEJBReferences(ejbJar);
} else if (module.isWebModule()) {
WebApp webApp = getDeploymentDescriptor((WebModule) module);
if (webApp != null)
return webApp.getEjbRefs();
} else if (module.isJavaModule()) {
ApplicationClient appClient = getDeploymentDescriptor((JavaClientModule) module);
if (appClient != null)
return appClient.getEjbReferences();
}
}
return Collections.EMPTY_LIST;
}
/**
* @param ejbJar
* @return
*/
private List getEJBReferences(EJBJar ejbJar) {
if (ejbJar != null) {
List ejbs = ejbJar.getEnterpriseBeans();
List refs = null;
EnterpriseBean ejb = null;
for (int i = 0; i < ejbs.size(); i++) {
ejb = (EnterpriseBean) ejbs.get(i);
if (refs == null)
refs = new ArrayList();
refs.addAll(ejb.getEjbRefs());
}
if (refs != null)
return refs;
}
return Collections.EMPTY_LIST;
}
}