Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbridgha2006-07-28 20:59:49 +0000
committercbridgha2006-07-28 20:59:49 +0000
commit544363864c91c8dd750d6e5c3985fa0c4ca8a311 (patch)
tree3fe8777293cedefb0a6bb9e854b102044d0d7e4d
parent62b142c37ff667059caf36aad86916a052d3466b (diff)
downloadwebtools.javaee-544363864c91c8dd750d6e5c3985fa0c4ca8a311.tar.gz
webtools.javaee-544363864c91c8dd750d6e5c3985fa0c4ca8a311.tar.xz
webtools.javaee-544363864c91c8dd750d6e5c3985fa0c4ca8a311.zip
[nobug] JS binary components should share archives
-rw-r--r--plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java2
-rw-r--r--plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java2
-rw-r--r--plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java2
-rw-r--r--plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/J2EEArtifactExportOperation.java19
-rw-r--r--plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualArchiveComponent.java8
-rw-r--r--plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java57
-rw-r--r--plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java58
-rw-r--r--plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java87
-rw-r--r--plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java54
-rw-r--r--plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java71
-rw-r--r--plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java56
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

Back to the top