diff options
author | cbridgha | 2006-07-28 20:59:49 +0000 |
---|---|---|
committer | cbridgha | 2006-07-28 20:59:49 +0000 |
commit | 544363864c91c8dd750d6e5c3985fa0c4ca8a311 (patch) | |
tree | 3fe8777293cedefb0a6bb9e854b102044d0d7e4d | |
parent | 62b142c37ff667059caf36aad86916a052d3466b (diff) | |
download | webtools.javaee-544363864c91c8dd750d6e5c3985fa0c4ca8a311.tar.gz webtools.javaee-544363864c91c8dd750d6e5c3985fa0c4ca8a311.tar.xz webtools.javaee-544363864c91c8dd750d6e5c3985fa0c4ca8a311.zip |
[nobug] JS binary components should share archives
11 files changed, 336 insertions, 80 deletions
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 b19269a24..4ec25776e 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 @@ -382,7 +382,7 @@ public class ConnectorArtifactEdit extends EnterpriseArtifactEdit implements IAr public Archive asArchive(boolean includeSource) throws OpenFailureException { if (isBinary()) { - return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).getArchive(); + return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive(); } else { ConnectorComponentLoadStrategyImpl loader = new ConnectorComponentLoadStrategyImpl(getComponent()); loader.setExportSource(includeSource); 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 ae5db4245..ad3605197 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 @@ -630,7 +630,7 @@ public class WebArtifactEdit extends EnterpriseArtifactEdit implements IArtifact public Archive asArchive(boolean includeSource) throws OpenFailureException { if (isBinary()) { - return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).getArchive(); + return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive(); } else { WebComponentLoadStrategyImpl loader = new WebComponentLoadStrategyImpl(getComponent()); 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 b43d371fc..1a22bcbfc 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 @@ -376,7 +376,7 @@ public class AppClientArtifactEdit extends EnterpriseArtifactEdit implements IAr public Archive asArchive(boolean includeSource) throws OpenFailureException{ if (isBinary()) { - return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).getArchive(); + return ((EnterpriseBinaryComponentHelper) getBinaryComponentHelper()).accessArchive(); } else { AppClientComponentLoadStrategyImpl loader = new AppClientComponentLoadStrategyImpl(getComponent()); loader.setExportSource(includeSource); diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactExportOperation.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactExportOperation.java index 360dee880..af30a3443 100644 --- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactExportOperation.java +++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactExportOperation.java @@ -70,11 +70,12 @@ public abstract class J2EEArtifactExportOperation extends AbstractDataModelOpera } export(); } catch (Exception e) { - throw new ExecutionException(EJBArchiveOpsResourceHandler.Error_exporting__UI_ + archiveString(), e); - } finally{ if(moduleFile != null){ - moduleFile.close(); + //The module fil will be closed if the export succeeds + //Need to be careful not to close the archive twice because of ReferenceCounted Archives + moduleFile.close(); } + throw new ExecutionException(EJBArchiveOpsResourceHandler.Error_exporting__UI_ + archiveString(), e); } return OK_STATUS; } @@ -125,18 +126,6 @@ public abstract class J2EEArtifactExportOperation extends AbstractDataModelOpera moduleFile = newModuleFile; } - //TODO delete this method - public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { - // TODO Auto-generated method stub - return null; - } - - //TODO delete this method - public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { - // TODO Auto-generated method stub - return null; - } - protected void runNecessaryBuilders(IVirtualComponent component, IProgressMonitor monitor) throws CoreException { if(!component.isBinary()){ IProject project = component.getProject(); 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 865208bd9..8b961e5dd 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 @@ -4,6 +4,7 @@ import java.util.List; 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.UtilityBinaryComponentHelper; import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent; @@ -30,12 +31,17 @@ public class J2EEModuleVirtualArchiveComponent extends VirtualArchiveComponent { public String [] getManifestClasspath() { if(null == manifestClasspath){ UtilityBinaryComponentHelper helper = null; + Archive archive = null; try{ helper = new UtilityBinaryComponentHelper(this); - ArchiveManifest manifest = helper.getArchive().getManifest(); + archive = helper.accessArchive(); + ArchiveManifest manifest = archive.getManifest(); manifestClasspath = manifest.getClassPathTokenized(); } catch (Exception e){ } finally { + if(null != archive){ + archive.close(); + } helper.dispose(); } if(manifestClasspath == null){ 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 46b030779..dcfa98cea 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 @@ -13,11 +13,9 @@ package org.eclipse.jst.j2ee.internal.componentcore; import org.eclipse.emf.ecore.EObject; import org.eclipse.jst.j2ee.commonarchivecore.internal.ApplicationClientFile; import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive; -import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory; -import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator; +import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ApplicationClientFileImpl; import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.AppClient12ImportStrategyImpl; -import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; public class AppClientBinaryComponentHelper extends EnterpriseBinaryComponentHelper { @@ -34,20 +32,55 @@ public class AppClientBinaryComponentHelper extends EnterpriseBinaryComponentHel } } - public AppClientBinaryComponentHelper(IVirtualComponent component) { - super(component); - } + protected static class Discriminator extends AppClient12ImportStrategyImpl.Discriminator { + + private static Discriminator instance; + + public static Discriminator getInstance() { + if (instance == null) { + instance = new Discriminator(); + } + return instance; + } - protected Archive openArchive(String archiveURI) throws OpenFailureException { - return CommonarchiveFactory.eINSTANCE.openApplicationClientFile(getArchiveOptions(), archiveURI); + public Archive createConvertedArchive() { + ReferenceCountedApplicationClientFileImpl archive = new ReferenceCountedApplicationClientFileImpl(); + return archive; + } } - public EObject getPrimaryRootObject() { - return ((ApplicationClientFile) getArchive()).getDeploymentDescriptor(); + protected static class ReferenceCountedApplicationClientFileImpl extends ApplicationClientFileImpl implements IReferenceCountedArchive { + + private int count = 0; + + public void access() { + synchronized (this) { + count++; + } + } + + public void close() { + synchronized (this) { + count--; + if (count > 0) { + return; + } + } + ArchiveCache.getInstance().removeArchive(this); + super.close(); + } } protected ArchiveTypeDiscriminator getDiscriminator() { - return AppClient12ImportStrategyImpl.getDiscriminator(); + return Discriminator.getInstance(); + } + + public AppClientBinaryComponentHelper(IVirtualComponent component) { + super(component); + } + + public EObject getPrimaryRootObject() { + return ((ApplicationClientFile) getArchive()).getDeploymentDescriptor(); } -} +}
\ No newline at end of file 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 d3d1f21a3..06abd1919 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 @@ -12,11 +12,10 @@ package org.eclipse.jst.j2ee.internal.componentcore; import org.eclipse.emf.ecore.EObject; import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive; -import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory; import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile; -import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator; -import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.RootEJBJarDescriminatorImpl; +import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.EJBJarFileImpl; +import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.EjbJar11ImportStrategyImpl; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; public class EJBBinaryComponentHelper extends EnterpriseBinaryComponentHelper { @@ -33,20 +32,55 @@ public class EJBBinaryComponentHelper extends EnterpriseBinaryComponentHelper { } } - public EJBBinaryComponentHelper(IVirtualComponent component) { - super(component); - } + protected static class Discriminator extends EjbJar11ImportStrategyImpl.Discriminator { + + private static Discriminator instance; + + public static Discriminator getInstance() { + if (instance == null) { + instance = new Discriminator(); + } + return instance; + } - protected Archive openArchive(String archiveURI) throws OpenFailureException { - return CommonarchiveFactory.eINSTANCE.openEJBJarFile(getArchiveOptions(), archiveURI); + public Archive createConvertedArchive() { + ReferenceCountedEJBJarFileImpl archive = new ReferenceCountedEJBJarFileImpl(); + return archive; + } } - public EObject getPrimaryRootObject() { - return ((EJBJarFile) getArchive()).getDeploymentDescriptor(); + protected static class ReferenceCountedEJBJarFileImpl extends EJBJarFileImpl implements IReferenceCountedArchive { + + private int count = 0; + + public void access() { + synchronized (this) { + count++; + } + } + + public void close() { + synchronized (this) { + count--; + if (count > 0) { + return; + } + } + ArchiveCache.getInstance().removeArchive(this); + super.close(); + } } protected ArchiveTypeDiscriminator getDiscriminator() { - return RootEJBJarDescriminatorImpl.singleton(); + return Discriminator.getInstance(); + } + + public EJBBinaryComponentHelper(IVirtualComponent component) { + super(component); + } + + public EObject getPrimaryRootObject() { + return ((EJBJarFile) getArchive()).getDeploymentDescriptor(); } -} +}
\ No newline at end of file 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 942a7b97c..bdc4178db 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 @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.jst.j2ee.internal.componentcore; +import java.util.Hashtable; + import org.eclipse.core.resources.IFile; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; @@ -26,7 +28,7 @@ import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; public abstract class EnterpriseBinaryComponentHelper extends BinaryComponentHelper { - private Archive archive = null; + private IReferenceCountedArchive archive = null; protected EnterpriseBinaryComponentHelper(IVirtualComponent component) { super(component); @@ -39,7 +41,7 @@ public abstract class EnterpriseBinaryComponentHelper extends BinaryComponentHel return options; } - protected Archive getUniqueArchive() { + protected IReferenceCountedArchive getUniqueArchive() { String archiveURI = getArchiveURI(); try { return openArchive(archiveURI); @@ -49,7 +51,13 @@ public abstract class EnterpriseBinaryComponentHelper extends BinaryComponentHel return null; } - public Archive getArchive() { + public Archive accessArchive() { + IReferenceCountedArchive archive = getArchive(); + archive.access(); + return archive; + } + + protected IReferenceCountedArchive getArchive() { if (archive == null) { archive = getUniqueArchive(); } @@ -91,14 +99,24 @@ public abstract class EnterpriseBinaryComponentHelper extends BinaryComponentHel if (archive != null) { if (archive.isOpen()) { archive.close(); + } else { + System.out.println("Somebody else closed this before it should have."); } archive = null; } } - + protected abstract ArchiveTypeDiscriminator getDiscriminator(); - - protected abstract Archive openArchive(String archiveURI) throws OpenFailureException; + + protected IReferenceCountedArchive openArchive(String archiveURI) throws OpenFailureException { + ArchiveCache cache = ArchiveCache.getInstance(); + IReferenceCountedArchive archive = cache.getArchive(archiveURI); + if(archive != null){ + archive.access(); + return archive; + } + return cache.openArchive(this, archiveURI); + } public Resource getResource(URI uri) { return getArchive().getResourceSet().getResource(uri, true); @@ -107,5 +125,62 @@ public abstract class EnterpriseBinaryComponentHelper extends BinaryComponentHel public void releaseAccess(ArtifactEdit edit) { dispose(); } + + protected static class ArchiveCache { + + private static ArchiveCache instance = null; + + public static ArchiveCache getInstance() { + if(instance == null) { + instance = new ArchiveCache(); + } + return instance; + } + //necessary to contain two mappings in case the archive changes its URI + protected Hashtable keysToArchives = new Hashtable(); + protected Hashtable archivesToKeys = new Hashtable(); + + public synchronized IReferenceCountedArchive getArchive(String archiveURI) { + IReferenceCountedArchive archive = null; + if(keysToArchives.containsKey(archiveURI)){ + archive = (IReferenceCountedArchive)keysToArchives.get(archiveURI); + } + return archive; + } + + public synchronized IReferenceCountedArchive openArchive(EnterpriseBinaryComponentHelper helper, String archiveURI) throws OpenFailureException { + ArchiveOptions options = helper.getArchiveOptions(); + Archive anArchive = CommonarchiveFactory.eINSTANCE.primOpenArchive(options, archiveURI); + + ArchiveTypeDiscriminator discriminator = helper.getDiscriminator(); + + if (!discriminator.canImport(anArchive)) { + anArchive.close(); + throw new OpenFailureException(discriminator.getUnableToOpenMessage()); + } + IReferenceCountedArchive specificArchive = (IReferenceCountedArchive)discriminator.openArchive(anArchive); + specificArchive.initializeAfterOpen(); + specificArchive.access(); + keysToArchives.put(archiveURI, specificArchive); + archivesToKeys.put(specificArchive, archiveURI); + return specificArchive; + } + + public synchronized void removeArchive(IReferenceCountedArchive archive) { + Object uri = archivesToKeys.remove(archive); + keysToArchives.remove(uri); + } + } + + + protected interface IReferenceCountedArchive extends Archive { + + /** + * Increases the reference count by one. A call to close will decriment the count by one. If after decrimenting the count the count is 0 + * + */ + public void access(); + + } } 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 efe9ebbb0..4c85bf033 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 @@ -12,10 +12,9 @@ package org.eclipse.jst.j2ee.internal.componentcore; import org.eclipse.emf.ecore.EObject; import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive; -import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory; import org.eclipse.jst.j2ee.commonarchivecore.internal.RARFile; -import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator; +import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.RARFileImpl; import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.RarImportStrategyImpl; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; @@ -33,20 +32,55 @@ public class JCABinaryComponentHelper extends EnterpriseBinaryComponentHelper { } } - public JCABinaryComponentHelper(IVirtualComponent component) { - super(component); - } + protected static class Discriminator extends RarImportStrategyImpl.Discriminator { + + private static Discriminator instance; + + public static Discriminator getInstance() { + if (instance == null) { + instance = new Discriminator(); + } + return instance; + } - protected Archive openArchive(String archiveURI) throws OpenFailureException { - return CommonarchiveFactory.eINSTANCE.openRARFile(getArchiveOptions(), archiveURI); + public Archive createConvertedArchive() { + ReferenceCountedRARFileImpl archive = new ReferenceCountedRARFileImpl(); + return archive; + } } - public EObject getPrimaryRootObject() { - return ((RARFile) getArchive()).getDeploymentDescriptor(); + protected static class ReferenceCountedRARFileImpl extends RARFileImpl implements IReferenceCountedArchive { + + private int count = 0; + + public void access() { + synchronized (this) { + count++; + } + } + + public void close() { + synchronized (this) { + count--; + if (count > 0) { + return; + } + } + ArchiveCache.getInstance().removeArchive(this); + super.close(); + } } protected ArchiveTypeDiscriminator getDiscriminator() { - return RarImportStrategyImpl.getDiscriminator(); + return Discriminator.getInstance(); + } + + public JCABinaryComponentHelper(IVirtualComponent component) { + super(component); + } + + public EObject getPrimaryRootObject() { + return ((RARFile) getArchive()).getDeploymentDescriptor(); } } 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 9ebe0155e..637a328e6 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 @@ -2,9 +2,11 @@ package org.eclipse.jst.j2ee.internal.componentcore; import org.eclipse.emf.ecore.EObject; import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive; -import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory; import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator; +import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminatorImpl; +import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ArchiveImpl; +import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ImportStrategy; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; public class UtilityBinaryComponentHelper extends EnterpriseBinaryComponentHelper { @@ -12,8 +14,65 @@ public class UtilityBinaryComponentHelper extends EnterpriseBinaryComponentHelpe public UtilityBinaryComponentHelper(IVirtualComponent component) { super(component); } + + protected static class Discriminator extends ArchiveTypeDiscriminatorImpl { + + private static Discriminator instance; + + public static Discriminator getInstance() { + if (instance == null) { + instance = new Discriminator(); + } + return instance; + } + + public Archive createConvertedArchive() { + ReferenceCountedArchiveImpl archive = new ReferenceCountedArchiveImpl(); + return archive; + } + + public boolean canImport(Archive anArchive) { + return true; + } + + public ImportStrategy createImportStrategy(Archive old, Archive newArchive) { + return null; + } + + public String getUnableToOpenMessage() { + return "";//$NON-NLS-1$ + } + } + + protected static class ReferenceCountedArchiveImpl extends ArchiveImpl implements IReferenceCountedArchive { + + private int count = 0; + + public void access() { + synchronized (this) { + count++; + } + } + + public void close() { + synchronized (this) { + count--; + if (count > 0) { + return; + } + } + ArchiveCache.getInstance().removeArchive(this); + super.close(); + } + } + + protected ArchiveTypeDiscriminator getDiscriminator() { + return Discriminator.getInstance(); + } + - protected Archive getUniqueArchive() { + + protected IReferenceCountedArchive getUniqueArchive() { String archiveURI = getArchiveURI(); try { return openArchive(archiveURI); @@ -22,14 +81,6 @@ public class UtilityBinaryComponentHelper extends EnterpriseBinaryComponentHelpe return null; } - protected ArchiveTypeDiscriminator getDiscriminator() { - return null; - } - - protected Archive openArchive(String archiveURI) throws OpenFailureException { - return CommonarchiveFactory.eINSTANCE.openArchive(getArchiveOptions(), archiveURI); - } - public EObject getPrimaryRootObject() { return null; } 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 c0d3d2aba..ab7cac039 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 @@ -12,10 +12,9 @@ package org.eclipse.jst.j2ee.internal.componentcore; import org.eclipse.emf.ecore.EObject; import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive; -import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory; import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile; -import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator; +import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.WARFileImpl; import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.War22ImportStrategyImpl; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; @@ -33,20 +32,55 @@ public class WebBinaryComponentHelper extends EnterpriseBinaryComponentHelper { } } - public WebBinaryComponentHelper(IVirtualComponent component) { - super(component); - } + protected static class Discriminator extends War22ImportStrategyImpl.Discriminator { + + private static Discriminator instance; + + public static Discriminator getInstance() { + if (instance == null) { + instance = new Discriminator(); + } + return instance; + } - public Archive openArchive(String archiveURI) throws OpenFailureException { - return CommonarchiveFactory.eINSTANCE.openWARFile(getArchiveOptions(), archiveURI); + public Archive createConvertedArchive() { + ReferenceCountedWARFileImpl archive = new ReferenceCountedWARFileImpl(); + return archive; + } } - public EObject getPrimaryRootObject() { - return ((WARFile) getArchive()).getDeploymentDescriptor(); + protected static class ReferenceCountedWARFileImpl extends WARFileImpl implements IReferenceCountedArchive { + + private int count = 0; + + public void access() { + synchronized (this) { + count++; + } + } + + public void close() { + synchronized (this) { + count--; + if (count > 0) { + return; + } + } + ArchiveCache.getInstance().removeArchive(this); + super.close(); + } } protected ArchiveTypeDiscriminator getDiscriminator() { - return War22ImportStrategyImpl.getDiscriminator(); + return Discriminator.getInstance(); + } + + public WebBinaryComponentHelper(IVirtualComponent component) { + super(component); + } + + public EObject getPrimaryRootObject() { + return ((WARFile) getArchive()).getDeploymentDescriptor(); } -} +}
\ No newline at end of file |