[224185] Binary Java EE 5 IArchive support
diff --git a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java index 7aba15f..584f865 100644 --- a/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java +++ b/plugins/org.eclipse.jst.j2ee.core/archive/org/eclipse/jst/jee/archive/internal/ZipFileArchiveLoadAdapterImpl.java
@@ -121,6 +121,4 @@ throw new ArchiveModelLoadException("Simple Zip Archives have no model objects."); //$NON-NLS-1$ } - - }
diff --git a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java index e3e7d15..4405525 100644 --- a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java +++ b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java
@@ -24,14 +24,15 @@ import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit; import org.eclipse.jst.j2ee.internal.J2EEConstants; import org.eclipse.jst.j2ee.internal.common.XMLResource; -import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper; -import org.eclipse.jst.j2ee.internal.componentcore.JCABinaryComponentHelper; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper; import org.eclipse.jst.j2ee.internal.jca.archive.operations.ConnectorComponentLoadStrategyImpl; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.j2ee.jca.Connector; import org.eclipse.jst.j2ee.jca.ConnectorResource; import org.eclipse.jst.j2ee.jca.JcaFactory; import org.eclipse.jst.j2ee.model.IModelProvider; +import org.eclipse.jst.jee.archive.ArchiveOptions; +import org.eclipse.jst.jee.archive.IArchive; import org.eclipse.wst.common.componentcore.ArtifactEdit; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.ModuleCoreNature; @@ -75,7 +76,7 @@ } protected BinaryComponentHelper initBinaryComponentHelper(IVirtualComponent binaryModule) { - return new JCABinaryComponentHelper(binaryModule); + return new JavaEEBinaryComponentHelper(binaryModule); } /** @@ -388,7 +389,15 @@ public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException { if (isBinary()) { - return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive(); + JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper(); + IArchive iArchive = null; + try{ + iArchive = helper.accessArchive(); + IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH); + return CommonarchiveFactory.eINSTANCE.openRARFile(path.toOSString()); + } finally { + helper.releaseArchive(iArchive); + } } else { ConnectorComponentLoadStrategyImpl loader = new ConnectorComponentLoadStrategyImpl(getComponent(), includeClasspathComponents); loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java index 25ce696..038cf30 100644 --- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java +++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/provider/ModulesItemProvider.java
@@ -20,13 +20,9 @@ import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; import org.eclipse.jst.j2ee.application.Application; import org.eclipse.jst.j2ee.application.Module; -import org.eclipse.jst.j2ee.applicationclient.componentcore.util.AppClientArtifactEdit; -import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper; import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin; import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages; -import org.eclipse.jst.j2ee.jca.modulecore.util.ConnectorArtifactEdit; -import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit; -import org.eclipse.wst.common.componentcore.ArtifactEdit; import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; @@ -260,41 +256,17 @@ IVirtualComponent component = refs[j].getReferencedComponent(); if (component.isBinary()) { if (refs[j].getArchiveName().equals(moduleURI)) { - ArtifactEdit edit = null; + foundBinary = true; + JavaEEBinaryComponentHelper helper = null; try { - foundBinary = true; - Object binaryModule = null; - if (module.isWebModule()) { - WebArtifactEdit webEdit = WebArtifactEdit.getWebArtifactEditForRead(component); - if (webEdit != null) { - edit = webEdit; - binaryModule = webEdit.getWebApp(); - } - } else if (module.isJavaModule()) { - AppClientArtifactEdit appClientEdit = AppClientArtifactEdit.getAppClientArtifactEditForRead(component); - if (appClientEdit != null) { - edit = appClientEdit; - binaryModule = appClientEdit.getApplicationClient(); - } - } else if (module.isEjbModule()) { - EJBArtifactEdit ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(component); - if (ejbEdit != null) { - edit = ejbEdit; - binaryModule = ejbEdit.getEJBJar(); - } - } else if (module.isConnectorModule()) { - ConnectorArtifactEdit connectorEdit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(component); - if (connectorEdit != null) { - edit = connectorEdit; - binaryModule = connectorEdit.getConnector(); - } - } + helper = new JavaEEBinaryComponentHelper(component); + Object binaryModule = helper.getPrimaryRootObject(); if (binaryModule != null) { binaryModules.add(binaryModule); } } finally { - if (null != edit) { - edit.dispose(); + if(helper != null){ + helper.dispose(); } } }
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java index cfa1d75..db23587 100644 --- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java +++ b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java
@@ -31,8 +31,7 @@ import org.eclipse.jst.j2ee.internal.J2EEConstants; import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; import org.eclipse.jst.j2ee.internal.common.XMLResource; -import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper; -import org.eclipse.jst.j2ee.internal.componentcore.WebBinaryComponentHelper; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentLoadStrategyImpl; import org.eclipse.jst.j2ee.model.IModelProvider; @@ -41,6 +40,8 @@ import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory; import org.eclipse.jst.j2ee.webapplication.WelcomeFile; import org.eclipse.jst.j2ee.webapplication.WelcomeFileList; +import org.eclipse.jst.jee.archive.ArchiveOptions; +import org.eclipse.jst.jee.archive.IArchive; import org.eclipse.wst.common.componentcore.ArtifactEdit; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.ModuleCoreNature; @@ -96,7 +97,7 @@ } protected BinaryComponentHelper initBinaryComponentHelper(IVirtualComponent binaryModule) { - return new WebBinaryComponentHelper(binaryModule); + return new JavaEEBinaryComponentHelper(binaryModule); } /** @@ -649,7 +650,15 @@ public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException { verifyOperationSupported(); if (isBinary()) { - return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive(); + JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper(); + IArchive iArchive = null; + try{ + iArchive = helper.accessArchive(); + IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH); + return CommonarchiveFactory.eINSTANCE.openWARFile(path.toOSString()); + } finally { + helper.releaseArchive(iArchive); + } } else { WebComponentLoadStrategyImpl loader = new WebComponentLoadStrategyImpl(getComponent(), includeClasspathComponents); loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java index 88b8d92..9450445 100644 --- a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java +++ b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java
@@ -32,10 +32,11 @@ import org.eclipse.jst.j2ee.internal.J2EEConstants; import org.eclipse.jst.j2ee.internal.archive.operations.AppClientComponentLoadStrategyImpl; import org.eclipse.jst.j2ee.internal.common.XMLResource; -import org.eclipse.jst.j2ee.internal.componentcore.AppClientBinaryComponentHelper; -import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.j2ee.model.IModelProvider; +import org.eclipse.jst.jee.archive.ArchiveOptions; +import org.eclipse.jst.jee.archive.IArchive; import org.eclipse.wst.common.componentcore.ArtifactEdit; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.ModuleCoreNature; @@ -71,7 +72,7 @@ } protected BinaryComponentHelper initBinaryComponentHelper(IVirtualComponent binaryModule) { - return new AppClientBinaryComponentHelper(binaryModule); + return new JavaEEBinaryComponentHelper(binaryModule); } @@ -386,7 +387,15 @@ public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException{ if (isBinary()) { - return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive(); + JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper(); + IArchive iArchive = null; + try{ + iArchive = helper.accessArchive(); + IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH); + return CommonarchiveFactory.eINSTANCE.openApplicationClientFile(path.toOSString()); + } finally { + helper.releaseArchive(iArchive); + } } else { AppClientComponentLoadStrategyImpl loader = new AppClientComponentLoadStrategyImpl(getComponent()); loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java index 8fe9d88..5dfebad 100644 --- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java +++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEArchiveUtilities.java
@@ -10,7 +10,6 @@ *******************************************************************************/ package org.eclipse.jst.j2ee.internal.archive; -import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -31,6 +30,7 @@ import org.eclipse.jdt.core.util.IRuntimeVisibleAnnotationsAttribute; import org.eclipse.jst.j2ee.internal.J2EEConstants; import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentLoadAdapter; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.jee.archive.ArchiveModelLoadException; import org.eclipse.jst.jee.archive.ArchiveOpenFailureException; @@ -74,6 +74,13 @@ */ public static final String DISCRIMINATE_EJB_ANNOTATIONS = "DISCRIMINATE_EJB_ANNOTATIONS"; //$NON-NLS-1$ + /** + * Default value = null + * + * An ArchiveOption used to specify the original load adapter in the case it + * swapped out with an {@link #JavaEEWrappingLoadAdapter}. + */ + public static final String WRAPPED_LOAD_ADAPTER = "WRAPPED_LOAD_ADAPTER"; //$NON-NLS-1$ private JavaEEArchiveUtilities() { } @@ -105,14 +112,11 @@ public IArchive openArchive(IVirtualComponent virtualComponent) throws ArchiveOpenFailureException { if (virtualComponent.isBinary()) { VirtualArchiveComponent archiveComponent = (VirtualArchiveComponent) virtualComponent; - java.io.File diskFile = null; - diskFile = archiveComponent.getUnderlyingDiskFile(); - if (!diskFile.exists()) { - IFile wbFile = archiveComponent.getUnderlyingWorkbenchFile(); - diskFile = new File(wbFile.getLocation().toOSString()); - } - IPath path = new Path(diskFile.getAbsolutePath()); - return openArchive(path); + JavaEEBinaryComponentLoadAdapter loadAdapter = new JavaEEBinaryComponentLoadAdapter(archiveComponent); + ArchiveOptions archiveOptions = new ArchiveOptions(); + archiveOptions.setOption(ArchiveOptions.LOAD_ADAPTER, loadAdapter); + archiveOptions.setOption(ArchiveOptions.ARCHIVE_PATH, loadAdapter.getArchivePath()); + return openArchive(archiveOptions); } int type = J2EEVersionConstants.UNKNOWN; IArchiveLoadAdapter archiveLoadAdapter = null; @@ -197,8 +201,8 @@ private Map<IArchive, JavaEEQuickPeek> archiveToJavaEEQuickPeek = new WeakHashMap<IArchive, JavaEEQuickPeek>(); /** - * Returns a utility for getting the type of Java EE archive, the Java EE version, and the - * Module version + * Returns a utility for getting the type of Java EE archive, the Java EE + * version, and the Module version * * @param archive * @return @@ -261,18 +265,18 @@ public IArchive openArchive(ArchiveOptions archiveOptions) throws ArchiveOpenFailureException { IArchive simpleArchive = super.openArchive(archiveOptions); Object discriminateJavaEE = archiveOptions.getOption(DISCRIMINATE_JAVA_EE); - if(discriminateJavaEE != null && !((Boolean)discriminateJavaEE).booleanValue()){ + if (discriminateJavaEE != null && !((Boolean) discriminateJavaEE).booleanValue()) { return simpleArchive; } return refineForJavaEE(simpleArchive); } private static final String DOT_EAR = ".ear";//$NON-NLS-1$ - + private static final String DOT_WAR = ".war";//$NON-NLS-1$ - + private static final String DOT_JAR = ".jar";//$NON-NLS-1$ - + private IArchive refineForJavaEE(final IArchive simpleArchive) { String[] deploymentDescriptorsToCheck = new String[] { J2EEConstants.APPLICATION_DD_URI, J2EEConstants.APP_CLIENT_DD_URI, J2EEConstants.EJBJAR_DD_URI, J2EEConstants.WEBAPP_DD_URI, J2EEConstants.RAR_DD_URI }; @@ -308,36 +312,36 @@ } } IPath archivePath = simpleArchive.getPath(); - if(archivePath == null){ + if (archivePath == null) { Object obj = simpleArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH); - if(null != obj){ - archivePath = (IPath)obj; + if (null != obj) { + archivePath = (IPath) obj; } } - - if(archivePath != null){ + + if (archivePath != null) { String lastSegment = archivePath.lastSegment().toLowerCase(); - if(lastSegment.endsWith(DOT_EAR)){ + if (lastSegment.endsWith(DOT_EAR)) { JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.APPLICATION_TYPE, JavaEEQuickPeek.JEE_5_0_ID, JavaEEQuickPeek.JEE_5_0_ID); archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek); wrapArchive(simpleArchive, new Path(J2EEConstants.APPLICATION_DD_URI)); return simpleArchive; - } else if(lastSegment.endsWith(DOT_WAR)){ + } else if (lastSegment.endsWith(DOT_WAR)) { JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.WEB_TYPE, JavaEEQuickPeek.WEB_2_5_ID, JavaEEQuickPeek.JEE_5_0_ID); archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek); wrapArchive(simpleArchive, new Path(J2EEConstants.WEBAPP_DD_URI)); return simpleArchive; - } else if(lastSegment.endsWith(DOT_JAR)){ + } else if (lastSegment.endsWith(DOT_JAR)) { IPath manifestPath = new Path(J2EEConstants.MANIFEST_URI); - if(simpleArchive.containsArchiveResource(manifestPath)){ + if (simpleArchive.containsArchiveResource(manifestPath)) { InputStream in = null; - try{ + try { IArchiveResource manifestResource = simpleArchive.getArchiveResource(manifestPath); in = manifestResource.getInputStream(); Manifest manifest = new Manifest(in); Attributes attributes = manifest.getMainAttributes(); String mainClassName = attributes.getValue("Main-Class"); - if(mainClassName != null){ + if (mainClassName != null) { JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.APPLICATION_CLIENT_TYPE, JavaEEQuickPeek.JEE_5_0_ID, JavaEEQuickPeek.JEE_5_0_ID); archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek); wrapArchive(simpleArchive, new Path(J2EEConstants.APPLICATION_DD_URI)); @@ -358,83 +362,100 @@ } } Object discriminateEJB30 = simpleArchive.getArchiveOptions().getOption(DISCRIMINATE_EJB_ANNOTATIONS); - if(null == discriminateEJB30 || ((Boolean)discriminateEJB30).booleanValue()){ - if(isEJBArchive(simpleArchive)){ + if (null == discriminateEJB30 || ((Boolean) discriminateEJB30).booleanValue()) { + if (isEJBArchive(simpleArchive)) { JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(JavaEEQuickPeek.EJB_TYPE, JavaEEQuickPeek.EJB_3_0_ID, JavaEEQuickPeek.JEE_5_0_ID); archiveToJavaEEQuickPeek.put(simpleArchive, quickPeek); wrapArchive(simpleArchive, new Path(J2EEConstants.EJBJAR_DD_URI)); return simpleArchive; } } - + } } - + return simpleArchive; } + public static class JavaEEWrappingLoadAdapter implements IArchiveLoadAdapter { + + private IArchive simpleArchive; + private IArchiveLoadAdapter simpleLoadAdapter; + private IPath deploymentDescriptorPath; + private JavaEEEMFArchiveAdapterHelper emfHelper; + + public JavaEEWrappingLoadAdapter(IArchive simpleArchive, IPath deploymentDescriptorPath) { + this.simpleArchive = simpleArchive; + this.simpleLoadAdapter = this.simpleArchive.getLoadAdapter(); + this.deploymentDescriptorPath = deploymentDescriptorPath; + this.emfHelper = new JavaEEEMFArchiveAdapterHelper(this.simpleArchive); + } + + public void close() { + simpleLoadAdapter.close(); + } + + public boolean containsArchiveResource(IPath resourcePath) { + return simpleLoadAdapter.containsArchiveResource(resourcePath); + } + + public boolean containsModelObject(IPath modelObjectPath) { + if (simpleLoadAdapter.containsArchiveResource(modelObjectPath)) { + return true; + } + if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) { + modelObjectPath = deploymentDescriptorPath; + } + return emfHelper.containsModelObject(modelObjectPath); + } + + public IArchiveResource getArchiveResource(IPath resourcePath) throws FileNotFoundException { + return simpleLoadAdapter.getArchiveResource(resourcePath); + } + + public List<IArchiveResource> getArchiveResources() { + return simpleLoadAdapter.getArchiveResources(); + } + + public InputStream getInputStream(IArchiveResource archiveResource) throws IOException, FileNotFoundException { + return simpleLoadAdapter.getInputStream(archiveResource); + } + + public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException { + if (simpleLoadAdapter.containsModelObject(modelObjectPath)) { + return simpleLoadAdapter.getModelObject(modelObjectPath); + } + if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) { + modelObjectPath = deploymentDescriptorPath; + } + return emfHelper.getModelObject(modelObjectPath); + } + + public IArchive getArchive() { + return simpleLoadAdapter.getArchive(); + } + + public void setArchive(IArchive archive) { + simpleLoadAdapter.setArchive(archive); + } + + public IArchiveLoadAdapter getWrappedLoadAdatper() { + return simpleLoadAdapter; + } + + public String toString() { + StringBuffer buffer = new StringBuffer(JavaEEArchiveUtilities.class.getName()); + buffer.append(" wrapping: "); + buffer.append(simpleLoadAdapter.toString()); + return buffer.toString(); + } + + }; + private static void wrapArchive(final IArchive simpleArchive, final IPath deploymentDescriptorPath) { - final IArchiveLoadAdapter simpleLoadAdapter = simpleArchive.getLoadAdapter(); - - IArchiveLoadAdapter wrappingEMFLoadAdapter = new IArchiveLoadAdapter() { - private JavaEEEMFArchiveAdapterHelper emfHelper = new JavaEEEMFArchiveAdapterHelper(simpleArchive); - - public void close() { - simpleLoadAdapter.close(); - } - - public boolean containsArchiveResource(IPath resourcePath) { - return simpleLoadAdapter.containsArchiveResource(resourcePath); - } - - public boolean containsModelObject(IPath modelObjectPath) { - if (simpleLoadAdapter.containsArchiveResource(modelObjectPath)) { - return true; - } - if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) { - modelObjectPath = deploymentDescriptorPath; - } - return emfHelper.containsModelObject(modelObjectPath); - } - - public IArchiveResource getArchiveResource(IPath resourcePath) throws FileNotFoundException { - return simpleLoadAdapter.getArchiveResource(resourcePath); - } - - public List<IArchiveResource> getArchiveResources() { - return simpleLoadAdapter.getArchiveResources(); - } - - public InputStream getInputStream(IArchiveResource archiveResource) throws IOException, FileNotFoundException { - return simpleLoadAdapter.getInputStream(archiveResource); - } - - public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException { - if (simpleLoadAdapter.containsModelObject(modelObjectPath)) { - return simpleLoadAdapter.getModelObject(modelObjectPath); - } - if (IArchive.EMPTY_MODEL_PATH == modelObjectPath) { - modelObjectPath = deploymentDescriptorPath; - } - return emfHelper.getModelObject(modelObjectPath); - } - - public IArchive getArchive() { - return simpleLoadAdapter.getArchive(); - } - - public void setArchive(IArchive archive) { - simpleLoadAdapter.setArchive(archive); - } - - public String toString() { - StringBuffer buffer = new StringBuffer(JavaEEArchiveUtilities.class.getName()); - buffer.append(" wrapping: "); - buffer.append(simpleLoadAdapter.toString()); - return buffer.toString(); - } - }; + IArchiveLoadAdapter wrappingEMFLoadAdapter = new JavaEEWrappingLoadAdapter(simpleArchive, deploymentDescriptorPath); simpleArchive.getArchiveOptions().setOption(ArchiveOptions.LOAD_ADAPTER, wrappingEMFLoadAdapter); + simpleArchive.getArchiveOptions().setOption(WRAPPED_LOAD_ADAPTER, simpleArchive.getLoadAdapter()); ((ArchiveImpl) simpleArchive).setLoadAdapter(wrappingEMFLoadAdapter); } @@ -445,7 +466,7 @@ private static final char[] STATEFUL = "Ljavax/ejb/Stateful;".toCharArray();//$NON-NLS-1$ private static final char[] MESSAGEDRIVEN = "Ljavax/ejb/MessageDriven;".toCharArray();//$NON-NLS-1$ - + public boolean isEJBArchive(IArchive archive) { // first check for the deployment descriptor if (archiveToJavaEEQuickPeek.containsKey(archive)) { @@ -453,7 +474,7 @@ if (qp.getType() == JavaEEQuickPeek.EJB_TYPE) { return true; } - } + } List<IArchiveResource> archiveResources = archive.getArchiveResources(); for (IArchiveResource archiveResource : archiveResources) { @@ -496,4 +517,30 @@ } return false; } + + public Manifest getManifest(IArchive archive) { + Manifest manifest = null; + IPath manifestPath = new Path(J2EEConstants.MANIFEST_URI); + if (archive.containsArchiveResource(manifestPath)) { + InputStream in = null; + try { + IArchiveResource manifestResource = archive.getArchiveResource(manifestPath); + in = manifestResource.getInputStream(); + manifest = new Manifest(in); + } catch (FileNotFoundException e) { + ArchiveUtil.warn(e); + } catch (IOException e) { + ArchiveUtil.warn(e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + ArchiveUtil.warn(e); + } + } + } + } + return manifest; + } }
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java index 97b08ef..c97c58c 100644 --- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java +++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFArchiveAdapterHelper.java
@@ -97,9 +97,14 @@ return archiveURIConverter; } + public Resource getResource(IPath resourcePath) throws ArchiveModelLoadException { + URI uri = getArchiveURIConverter().getURI(resourcePath); + Resource resource = getResourceSet().getResource(uri, true); + return resource; + } + public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException { - URI uri = getArchiveURIConverter().getURI(modelObjectPath); - IRootObjectResource resource = (IRootObjectResource) getResourceSet().getResource(uri, true); + IRootObjectResource resource = (IRootObjectResource) getResource(modelObjectPath); return resource.getRootObject(); }
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java index d406b5d..36aa520 100644 --- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java +++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/JavaEEEMFZipFileLoadAdapterImpl.java
@@ -13,6 +13,8 @@ import java.util.zip.ZipFile; import org.eclipse.core.runtime.IPath; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; import org.eclipse.jst.jee.archive.ArchiveModelLoadException; import org.eclipse.jst.jee.archive.IArchive; import org.eclipse.jst.jee.archive.internal.ZipFileArchiveLoadAdapterImpl; @@ -34,6 +36,10 @@ emfHelper.setArchive(archive); } + public Resource getResource(IPath resourcePath) throws ArchiveModelLoadException { + return emfHelper.getResource(resourcePath); + } + public boolean containsModelObject(IPath modelObjectPath) { return emfHelper.containsModelObject(modelObjectPath); } @@ -41,4 +47,14 @@ public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException { return emfHelper.getModelObject(modelObjectPath); } + + @Override + public void close() { + super.close(); + WorkbenchResourceHelperBase.removeAndUnloadAll(emfHelper.getResourceSet().getResources(), emfHelper.getResourceSet()); + } + + protected JavaEEEMFArchiveAdapterHelper getEMFHelper() { + return emfHelper; + } }
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java index a498ad7..02ccd31 100644 --- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java +++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/classpath/J2EEComponentClasspathUpdater.java
@@ -47,7 +47,7 @@ import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent; import org.eclipse.jst.j2ee.componentcore.util.EARVirtualComponent; import org.eclipse.jst.j2ee.internal.J2EEConstants; -import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper; import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants; import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; @@ -269,7 +269,7 @@ } } if(null != earComponent){ - EnterpriseBinaryComponentHelper.ArchiveCache.getInstance().clearDisconnectedArchivesInEAR(earComponent); + JavaEEBinaryComponentHelper.clearDisconnectedArchivesInEAR(earComponent); } } } @@ -393,7 +393,7 @@ } forgetProject((IProject)resource); } - EnterpriseBinaryComponentHelper.ArchiveCache.getInstance().clearAllArchivesInProject((IProject)resource); + JavaEEBinaryComponentHelper.clearAllArchivesInProject((IProject)resource); } break; case IResourceChangeEvent.POST_CHANGE:
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java index 95a43c0..9d348e8 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java
@@ -14,9 +14,8 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; -import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest; -import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper; +import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent; import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; @@ -41,27 +40,8 @@ public String[] getManifestClasspath() { if (null == manifestClasspath) { - Archive archive = EnterpriseBinaryComponentHelper.ArchiveCache.getInstance().getArchive(this); - if (null == archive) { - EnterpriseBinaryComponentHelper helper = EnterpriseBinaryComponentHelper.getHelper(this); - try { - archive = helper.accessArchive(); - ArchiveManifest manifest = archive.getManifest(); - manifestClasspath = manifest.getClassPathTokenized(); - } catch (Exception e) { - } finally { - if (null != archive) { - archive.close(); - } - if (null != helper) { - helper.dispose(); - } - } - } else { - ArchiveManifest manifest = archive.getManifest(); - manifestClasspath = manifest.getClassPathTokenized(); - } - + ArchiveManifest manifest = J2EEProjectUtilities.readManifest(this); + manifestClasspath = manifest.getClassPathTokenized(); if (manifestClasspath == null) { manifestClasspath = new String[0]; }
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java index fb8134c..257e486 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java
@@ -22,6 +22,11 @@ import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +/** + * @deprecated see {@link JavaEEBinaryComponentHelper} + * @author jasholl + * + */ public class AppClientBinaryComponentHelper extends EnterpriseBinaryComponentHelper { public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java index efa0a2a..5b0e06a 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/ComponentArchiveOptions.java
@@ -13,6 +13,11 @@ import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +/** + * @deprecated see {@link JavaEEBinaryComponentHelper} + * @author jasholl + * + */ public class ComponentArchiveOptions extends ArchiveOptions { private IVirtualComponent component;
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java index 2a4885f..3a34a35 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java
@@ -22,6 +22,11 @@ import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +/** + * @deprecated see {@link JavaEEBinaryComponentHelper} + * @author jasholl + * + */ public class EJBBinaryComponentHelper extends EnterpriseBinaryComponentHelper { public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java index ca1a98b..9a07a24 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java
@@ -36,12 +36,16 @@ import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator; import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ZipFileLoadStrategyImpl; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; -import org.eclipse.wst.common.componentcore.ArtifactEdit; import org.eclipse.wst.common.componentcore.internal.BinaryComponentHelper; import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; +/** + * @deprecated see {@link JavaEEBinaryComponentHelper} + * @author jasholl + * + */ public abstract class EnterpriseBinaryComponentHelper extends BinaryComponentHelper { public static EnterpriseBinaryComponentHelper getHelper(IVirtualComponent aComponent){ @@ -166,7 +170,7 @@ return resource; } - public void releaseAccess(ArtifactEdit edit) { + public void releaseAccess() { dispose(); }
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java index 2fa77d9..4fdfdf0 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java
@@ -22,6 +22,11 @@ import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.RarImportStrategyImpl; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +/** + * @deprecated see {@link JavaEEBinaryComponentHelper} + * @author jasholl + * + */ public class JCABinaryComponentHelper extends EnterpriseBinaryComponentHelper { public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java new file mode 100644 index 0000000..7895f0a --- /dev/null +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java
@@ -0,0 +1,292 @@ +package org.eclipse.jst.j2ee.internal.componentcore; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.zip.ZipException; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.jem.util.logger.proxy.Logger; +import org.eclipse.jst.j2ee.internal.J2EEConstants; +import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities; +import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin; +import org.eclipse.jst.jee.archive.ArchiveModelLoadException; +import org.eclipse.jst.jee.archive.ArchiveOpenFailureException; +import org.eclipse.jst.jee.archive.ArchiveOptions; +import org.eclipse.jst.jee.archive.IArchive; +import org.eclipse.jst.jee.archive.IArchiveFactory; +import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek; +import org.eclipse.wst.common.componentcore.internal.BinaryComponentHelper; +import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualReference; + +public class JavaEEBinaryComponentHelper extends BinaryComponentHelper { + + private IArchive archive; + + private int localArchiveAccessCount = 0; + + public static JavaEEQuickPeek getJavaEEQuickPeek(IVirtualComponent aBinaryComponent) { + JavaEEBinaryComponentHelper helper = null; + try { + helper = new JavaEEBinaryComponentHelper(aBinaryComponent); + IArchive archive = helper.getArchive(); + JavaEEQuickPeek qp = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(archive); + return qp; + } finally { + if (helper != null) { + helper.dispose(); + } + } + } + + public JavaEEBinaryComponentHelper(IVirtualComponent aBinaryComponent) { + super(aBinaryComponent); + } + + @Override + public EObject getPrimaryRootObject() { + JavaEEQuickPeek qp = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(getArchive()); + IPath ddPath = null; + switch (qp.getType()) { + case JavaEEQuickPeek.APPLICATION_CLIENT_TYPE: + ddPath = new Path(J2EEConstants.APP_CLIENT_DD_URI); + break; + case JavaEEQuickPeek.EJB_TYPE: + ddPath = new Path(J2EEConstants.EJBJAR_DD_URI); + break; + case JavaEEQuickPeek.WEB_TYPE: + ddPath = new Path(J2EEConstants.WEBAPP_DD_URI); + break; + case JavaEEQuickPeek.CONNECTOR_TYPE: + ddPath = new Path(J2EEConstants.RAR_DD_URI); + break; + } + if (ddPath != null) { + try { + return (EObject) getArchive().getModelObject(ddPath); + } catch (ArchiveModelLoadException e) { + J2EEPlugin.logError(e); + } + } + return null; + } + + @Override + public Resource getResource(URI uri) { + IPath path = new Path(uri.toString()); + try { + return (Resource) ((JavaEEBinaryComponentLoadAdapter) getArchive().getLoadAdapter()).getModelObject(path); + } catch (ArchiveModelLoadException e) { + J2EEPlugin.logError(e); + } + return null; + } + + public IArchive accessArchive() { + IArchive archive = getArchive(); + if (null != archive) { + ArchiveCache cache = ArchiveCache.getInstance(); + cache.accessArchive(archive); + synchronized (this) { + localArchiveAccessCount++; + } + } + return archive; + } + + public void releaseArchive(IArchive archive) { + if (archive != this.archive) { + throw new RuntimeException("The IArchive parameter must be the same IArchive retrieved from accessArchive"); + } + if (null != archive) { + ArchiveCache cache = ArchiveCache.getInstance(); + cache.releaseArchive(archive); + synchronized (this) { + localArchiveAccessCount--; + } + } + } + + @Override + public void dispose() { + super.dispose(); + int count = 0; + synchronized (this) { + count = localArchiveAccessCount; + } + if (count > 0 && archive != null) { + ArchiveCache cache = ArchiveCache.getInstance(); + for (int i = 0; i < count; i++) { + cache.releaseArchive(archive); + synchronized (this) { + localArchiveAccessCount--; + } + } + } + } + + protected IArchive getArchive() { + if (archive == null) { + archive = getUniqueArchive(); + } + return archive; + } + + protected IArchive getUniqueArchive() { + try { + return openArchive(); + } catch (ArchiveOpenFailureException e) { + Logger.getLogger().logError(e); + } + return null; + } + + protected IArchive openArchive() throws ArchiveOpenFailureException { + ArchiveCache cache = ArchiveCache.getInstance(); + IArchive archive = cache.getArchive(getComponent()); + if (archive == null) { + archive = cache.openArchive(this); + } + if (archive != null) { + cache.accessArchive(archive); + synchronized (this) { + localArchiveAccessCount++; + } + } + return archive; + } + + public static void clearDisconnectedArchivesInEAR(IVirtualComponent earComponent) { + ArchiveCache.instance.clearDisconnectedArchivesInEAR(earComponent); + } + + public static void clearAllArchivesInProject(IProject earProject) { + ArchiveCache.instance.clearAllArchivesInProject(earProject); + } + + /** + * This cache manages IArchives across all + * {@link JavaEEBinaryComponentHelper} instances. If multiple + * {@link JavaEEBinaryComponentHelper} instances exist for the same + * underlying archive file (e.g. a jar file on disk) all will use the exact + * same IArchive instance. Care needs to be taken in managing the opening + * and closing of this IArchive which should only be done through internal + * methods within {@link JavaEEBinaryComponentHelper} + */ + private static class ArchiveCache { + + private static ArchiveCache instance = null; + + public static ArchiveCache getInstance() { + if (instance == null) { + instance = new ArchiveCache(); + } + return instance; + } + + protected Map<IVirtualComponent, IArchive> componentsToArchives = new Hashtable<IVirtualComponent, IArchive>(); + + protected Map<IArchive, Integer> archiveAccessCount = new Hashtable<IArchive, Integer>(); + + public synchronized void accessArchive(IArchive archive) { + Integer count = archiveAccessCount.get(archive); + Integer newCount = new Integer(count.intValue() + 1); + archiveAccessCount.put(archive, newCount); + if (newCount.intValue() == 1) { + JavaEEBinaryComponentLoadAdapter binaryAdapter = null; + if (archive.getArchiveOptions().hasOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER)) { + binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER); + } else { + binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(ArchiveOptions.LOAD_ADAPTER); + } + if (!binaryAdapter.isPhysicallyOpen()) { + try { + binaryAdapter.physicallyOpen(); + } catch (ZipException e) { + org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e); + } catch (IOException e) { + org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e); + } + } + } + } + + public synchronized void releaseArchive(IArchive archive) { + Integer count = archiveAccessCount.get(archive); + Integer newCount = new Integer(count.intValue() - 1); + archiveAccessCount.put(archive, newCount); + if (newCount.intValue() == 0) { + JavaEEBinaryComponentLoadAdapter binaryAdapter = null; + if (archive.getArchiveOptions().hasOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER)) { + binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(JavaEEArchiveUtilities.WRAPPED_LOAD_ADAPTER); + } else { + binaryAdapter = (JavaEEBinaryComponentLoadAdapter) archive.getArchiveOptions().getOption(ArchiveOptions.LOAD_ADAPTER); + } + if (binaryAdapter.isPhysicallyOpen()) { + binaryAdapter.physicallyClose(); + } + } + } + + public synchronized IArchive getArchive(IVirtualComponent component) { + IArchive archive = componentsToArchives.get(component); + return archive; + } + + public synchronized void clearDisconnectedArchivesInEAR(IVirtualComponent earComponent) { + if (componentsToArchives.isEmpty()) { + return; + } + Set<IVirtualComponent> liveBinaryComponnts = new HashSet<IVirtualComponent>(); + IVirtualReference[] refs = earComponent.getReferences(); + IVirtualComponent component = null; + for (int i = 0; i < refs.length; i++) { + component = refs[i].getReferencedComponent(); + if (component.isBinary()) { + liveBinaryComponnts.add(component); + } + } + clearArchivesInProject(earComponent.getProject(), liveBinaryComponnts); + } + + public synchronized void clearAllArchivesInProject(IProject earProject) { + if (componentsToArchives.isEmpty()) { + return; + } + clearArchivesInProject(earProject, null); + } + + private void clearArchivesInProject(IProject earProject, Set excludeSet) { + Iterator iterator = componentsToArchives.entrySet().iterator(); + IVirtualComponent component = null; + IArchive archive = null; + while (iterator.hasNext()) { + Map.Entry entry = (Map.Entry) iterator.next(); + component = (IVirtualComponent) entry.getKey(); + if (component.getProject().equals(earProject) && (excludeSet == null || !excludeSet.contains(component))) { + archive = (IArchive) entry.getValue(); + IArchiveFactory.INSTANCE.closeArchive(archive); + iterator.remove(); + archiveAccessCount.remove(archive); + } + } + } + + public synchronized IArchive openArchive(JavaEEBinaryComponentHelper helper) throws ArchiveOpenFailureException { + IArchive archive = JavaEEArchiveUtilities.INSTANCE.openArchive(helper.getComponent()); + componentsToArchives.put(helper.getComponent(), archive); + archiveAccessCount.put(archive, new Integer(0)); + return archive; + } + } + +}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentLoadAdapter.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentLoadAdapter.java new file mode 100644 index 0000000..34c4d5a --- /dev/null +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentLoadAdapter.java
@@ -0,0 +1,124 @@ +package org.eclipse.jst.j2ee.internal.componentcore; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipFile; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jst.j2ee.internal.archive.JavaEEEMFZipFileLoadAdapterImpl; +import org.eclipse.jst.jee.archive.ArchiveOpenFailureException; +import org.eclipse.jst.jee.archive.IArchiveResource; +import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent; + +public class JavaEEBinaryComponentLoadAdapter extends JavaEEEMFZipFileLoadAdapterImpl { + + private java.io.File file = null; + private IPath archivePath; + private boolean physicallyOpen = true; + + public JavaEEBinaryComponentLoadAdapter(VirtualArchiveComponent archiveComponent) throws ArchiveOpenFailureException { + super(); + java.io.File diskFile = null; + diskFile = archiveComponent.getUnderlyingDiskFile(); + if (!diskFile.exists()) { + IFile wbFile = archiveComponent.getUnderlyingWorkbenchFile(); + diskFile = new File(wbFile.getLocation().toOSString()); + } + IPath archivePath = new Path(diskFile.getAbsolutePath()); + file = new java.io.File(archivePath.toOSString()); + ZipFile zipFile; + try { + zipFile = new ZipFile(file); + } catch (ZipException e) { + ArchiveOpenFailureException openFailureException = new ArchiveOpenFailureException(e); + throw openFailureException; + } catch (IOException e) { + ArchiveOpenFailureException openFailureException = new ArchiveOpenFailureException(e); + throw openFailureException; + } + setZipFile(zipFile); + setArchivePath(archivePath); + } + + private void setArchivePath(IPath archivePath) { + this.archivePath = archivePath; + } + + public IPath getArchivePath() { + return archivePath; + } + + public boolean isPhysicallyOpen(){ + return physicallyOpen; + } + + public void physicallyOpen() throws ZipException, IOException{ + if(!isPhysicallyOpen()){ + physicallyOpen = true; + setZipFile(new ZipFile(file)); + System.err.println("PhysicallyOpen"); + Thread.dumpStack(); + } + } + + public void physicallyClose(){ + if(isPhysicallyOpen()){ + physicallyOpen = false; + try{ + zipFile.close(); + } + catch (Throwable t) { + //Ignore + } + System.err.println("PhysicallyClose"); + Thread.dumpStack(); + } + } + + public java.io.InputStream getInputStream(IArchiveResource aFile) throws IOException, FileNotFoundException { + final boolean isPhysciallyOpen = isPhysicallyOpen(); + Exception caughtException = null; + try { + if (!isPhysciallyOpen) { + physicallyOpen(); + } + IPath path = aFile.getPath(); + String uri = path.toString(); + ZipEntry entry = getZipFile().getEntry(uri); + if (entry == null) + throw new FileNotFoundException(uri); + + return new java.io.BufferedInputStream(getZipFile().getInputStream(entry)) { + public void close() throws IOException { + super.close(); + if (!isPhysciallyOpen ) { + physicallyClose(); + } + } + }; + } catch (FileNotFoundException e) { + caughtException = e; + throw e; + } catch (IllegalStateException zipClosed) { + caughtException = zipClosed; + throw new IOException(zipClosed.toString()); + } catch (Exception e) { + caughtException = e; + throw new IOException(e.toString()); + } finally { + if (caughtException != null) { + if (!isPhysciallyOpen) { + physicallyClose(); + } + } + } + } + + + +}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java index c7e8cf0..a5ea3dd 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java
@@ -22,6 +22,11 @@ import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +/** + * @deprecated see {@link JavaEEBinaryComponentHelper} + * @author jasholl + * + */ public class UtilityBinaryComponentHelper extends EnterpriseBinaryComponentHelper { public UtilityBinaryComponentHelper(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java index 7802d3b..a5b1296 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java
@@ -22,6 +22,11 @@ import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.War22ImportStrategyImpl; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +/** + * @deprecated see {@link JavaEEBinaryComponentHelper} + * @author jasholl + * + */ public class WebBinaryComponentHelper extends EnterpriseBinaryComponentHelper { public static boolean handlesComponent(IVirtualComponent component) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java index 6eccda9..051d71f 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/project/J2EEProjectUtilities.java
@@ -64,19 +64,24 @@ import org.eclipse.jst.j2ee.internal.archive.operations.JavaComponentLoadStrategyImpl; import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil; import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper; import org.eclipse.jst.j2ee.internal.moduleextension.EarModuleManager; +import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin; import org.eclipse.jst.j2ee.project.EarUtilities; import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities; import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants; import org.eclipse.jst.j2ee.project.facet.IJavaProjectMigrationDataModelProperties; import org.eclipse.jst.j2ee.project.facet.JavaProjectMigrationDataModelProvider; import org.eclipse.jst.j2ee.project.facet.JavaProjectMigrationOperation; +import org.eclipse.jst.jee.archive.IArchive; +import org.eclipse.jst.jee.archive.IArchiveResource; import org.eclipse.jst.server.core.FacetUtil; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil; 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.IVirtualFile; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; import org.eclipse.wst.common.componentcore.resources.IVirtualResource; @@ -276,7 +281,74 @@ } } } - + + public static ArchiveManifest readManifest(IVirtualComponent component) { + if (!component.isBinary()) { + IVirtualFile vManifest = component.getRootFolder().getFile(J2EEConstants.MANIFEST_URI); + if (vManifest.exists()) { + IFile manifestFile = vManifest.getUnderlyingFile(); + InputStream in = null; + try { + in = manifestFile.getContents(); + return new ArchiveManifestImpl(in); + } catch (IOException e) { + J2EEPlugin.logError(e); + } catch (CoreException e) { + J2EEPlugin.logError(e); + } finally { + if (in != null) { + try { + in.close(); + in = null; + } catch (IOException e) { + J2EEPlugin.logError(e); + } + } + } + } + } else { + JavaEEBinaryComponentHelper helper = null; + try{ + helper = new JavaEEBinaryComponentHelper(component); + if(helper != null){ + IArchive archive = null; + InputStream in = null; + try{ + archive = helper.accessArchive(); + if(null != archive){ + IArchiveResource manifestResource = archive.getArchiveResource(new Path(J2EEConstants.MANIFEST_URI)); + if(manifestResource != null){ + in = manifestResource.getInputStream(); + ArchiveManifest manifest = new ArchiveManifestImpl(in); + return manifest; + } + } + } catch (FileNotFoundException e) { + J2EEPlugin.logError(e); + } catch (IOException e) { + J2EEPlugin.logError(e); + } finally{ + if (in != null) { + try { + in.close(); + in = null; + } catch (IOException e) { + J2EEPlugin.logError(e); + } + } + if(archive != null){ + helper.releaseArchive(archive); + } + } + } + } finally{ + if(helper != null){ + helper.dispose(); + } + } + } + return null; + } /** * Keys are the EJB JAR files and the values are the respective client JARs; includes only key * value pairs for which EJB Client JARs are defined and exist.
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java index dcbfbdc..c4883a5 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java +++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/project/JavaEEProjectUtilities.java
@@ -24,10 +24,7 @@ import org.eclipse.jst.j2ee.internal.J2EEConstants; import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil; -import org.eclipse.jst.j2ee.internal.componentcore.AppClientBinaryComponentHelper; -import org.eclipse.jst.j2ee.internal.componentcore.EJBBinaryComponentHelper; -import org.eclipse.jst.j2ee.internal.componentcore.JCABinaryComponentHelper; -import org.eclipse.jst.j2ee.internal.componentcore.WebBinaryComponentHelper; +import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper; import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants; import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek; import org.eclipse.wst.common.componentcore.ComponentCore; @@ -103,7 +100,7 @@ public static boolean isDynamicWebComponent(IVirtualComponent component) { if (component.isBinary()) { - return WebBinaryComponentHelper.handlesComponent(component); + return isBinaryType(component, JavaEEQuickPeek.WEB_TYPE); } return isProjectOfType(component.getProject(), DYNAMIC_WEB); } @@ -118,7 +115,7 @@ public static boolean isEJBComponent(IVirtualComponent component) { if (component.isBinary()) { - return EJBBinaryComponentHelper.handlesComponent(component); + return isBinaryType(component, JavaEEQuickPeek.EJB_TYPE); } return isProjectOfType(component.getProject(), EJB); } @@ -129,7 +126,7 @@ public static boolean isJCAComponent(IVirtualComponent component) { if (component.isBinary()) { - return JCABinaryComponentHelper.handlesComponent(component); + return isBinaryType(component, JavaEEQuickPeek.CONNECTOR_TYPE); } return isProjectOfType(component.getProject(), JCA); } @@ -140,7 +137,7 @@ public static boolean isApplicationClientComponent(IVirtualComponent component) { if (component.isBinary()) { - return AppClientBinaryComponentHelper.handlesComponent(component); + return isBinaryType(component, JavaEEQuickPeek.APPLICATION_CLIENT_TYPE); } return isProjectOfType(component.getProject(), APPLICATION_CLIENT); } @@ -170,19 +167,30 @@ return (IProject[]) result.toArray(new IProject[result.size()]); } + private static boolean isBinaryType(IVirtualComponent aBinaryComponent, int quickPeekType){ + JavaEEQuickPeek qp = JavaEEBinaryComponentHelper.getJavaEEQuickPeek(aBinaryComponent); + int type = qp.getType(); + return quickPeekType == type; + } + public static String getJ2EEComponentType(IVirtualComponent component) { if (null != component) { if (component.isBinary()) { - if (isApplicationClientComponent(component)) + JavaEEQuickPeek qp = JavaEEBinaryComponentHelper.getJavaEEQuickPeek(component); + switch(qp.getType()){ + case JavaEEQuickPeek.APPLICATION_CLIENT_TYPE: return APPLICATION_CLIENT; - else if (isDynamicWebComponent(component)) + case JavaEEQuickPeek.WEB_TYPE: return DYNAMIC_WEB; - else if (isEJBComponent(component)) + case JavaEEQuickPeek.EJB_TYPE: return EJB; - else if (isJCAComponent(component)) + case JavaEEQuickPeek.CONNECTOR_TYPE: return JCA; - else + case JavaEEQuickPeek.APPLICATION_TYPE: + return ENTERPRISE_APPLICATION; + default: return UTILITY; + } } return getJ2EEProjectType(component.getProject()); } @@ -288,4 +296,5 @@ int retVal = 0; return retVal; } + }