[224185] Binary Java EE 5 IArchive support
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentArchiveLoadAdapter.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentArchiveLoadAdapter.java
deleted file mode 100644
index d1b6938..0000000
--- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/internal/web/archive/operations/WebComponentArchiveLoadAdapter.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.j2ee.internal.web.archive.operations;
-
-import java.io.File;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
-import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent;
-import org.eclipse.jst.j2ee.internal.archive.ComponentArchiveLoadAdapter;
-import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
-import org.eclipse.jst.j2ee.internal.project.ProjectSupportResourceHandler;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
-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;
-
-public class WebComponentArchiveLoadAdapter extends ComponentArchiveLoadAdapter {
-
-	public WebComponentArchiveLoadAdapter(IVirtualComponent vComponent) {
-		super(vComponent);
-	}
-	
-	public WebComponentArchiveLoadAdapter(IVirtualComponent vComponent, boolean includeClasspathComponents) {
-		super(vComponent, includeClasspathComponents);
-	}
-
-	public List getFiles() {
-		//super.getFiles();
-		addLooseLibJARsToFiles();
-		return filesHolder.getFiles();
-	}
-
-	public IVirtualReference[] getLibModules() {
-		WebArtifactEdit webArtifactEdit = null;
-		try {
-			webArtifactEdit = (WebArtifactEdit) ComponentUtilities.getArtifactEditForRead(getComponent());
-			if (webArtifactEdit != null)
-				return webArtifactEdit.getLibModules();
-		} finally {
-			if (webArtifactEdit != null)
-				webArtifactEdit.dispose();
-		}
-		return null;
-
-	}
-
-	public void addLooseLibJARsToFiles() {
-		IVirtualReference[] libModules = getLibModules();
-		for (int i = 0; i < libModules.length; i++) {
-			IVirtualReference iLibModule = libModules[i];
-			IVirtualComponent looseComponent = iLibModule.getReferencedComponent();
-			if (looseComponent.isBinary()) {
-				VirtualArchiveComponent archiveComp = (VirtualArchiveComponent) looseComponent;
-				java.io.File diskFile = archiveComp.getUnderlyingDiskFile();
-				if (!diskFile.exists()) {
-					IFile wbFile = archiveComp.getUnderlyingWorkbenchFile();
-					diskFile = new File(wbFile.getLocation().toOSString());
-				}
-				String uri = iLibModule.getRuntimePath().makeRelative().toString() + "/" + diskFile.getName(); //$NON-NLS-1$
-		//		addExternalFile(uri, diskFile);				
-			} else {
-				String name = null;
-				String archiveName = iLibModule.getArchiveName();
-				if (archiveName != null && archiveName.length() > 0) {
-					name = archiveName;
-				} else {
-					name = looseComponent.getName() + ".jar"; //$NON-NLS-1$
-				}
-				String prefix = iLibModule.getRuntimePath().makeRelative().toString();
-				if (prefix.length() > 0 && prefix.charAt(prefix.length() - 1)!= '/') {
-					prefix += "/"; //$NON-NLS-1$
-				}
-
-				addClasspathComponentDependencies(looseComponent);
-				
-				String uri = prefix + name;
-				try {
-					Archive utilJAR = J2EEProjectUtilities.asArchive(uri, looseComponent.getProject(), isExportSource());
-					if (utilJAR == null)
-						continue;
-			//		filesHolder.addFile(utilJAR);
-				} catch (OpenFailureException oe) {
-					String message = ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.UNABLE_TO_LOAD_MODULE_ERROR_, new Object[]{uri, getComponent().getProject().getName(), oe.getConcatenatedMessages()}); //$NON-NLS-1$
-					org.eclipse.jem.util.logger.proxy.Logger.getLogger().logTrace(message);
-				}
-			}
-		}
-	}
-	
-	private void addClasspathComponentDependencies(final IVirtualComponent referencedComponent) {
-		// retrieve all Java classpath component dependencies
-		if (includeClasspathComponents && referencedComponent instanceof J2EEModuleVirtualComponent) {
-			final IVirtualReference[] cpRefs = ((J2EEModuleVirtualComponent) referencedComponent).getJavaClasspathReferences();
-			for (int j = 0; j < cpRefs.length; j++) {
-				final IVirtualReference ref = cpRefs[j];
-				final IPath runtimePath = ref.getRuntimePath();
-				
-				// only process ../ mappings
-				if (ref.getReferencedComponent() instanceof VirtualArchiveComponent
-						&& runtimePath.equals(IClasspathDependencyConstants.RUNTIME_MAPPING_INTO_CONTAINER_PATH)) {
-					final VirtualArchiveComponent comp = (VirtualArchiveComponent) ref.getReferencedComponent();
-					File cpEntryFile = comp.getUnderlyingDiskFile();
-					if (!cpEntryFile.exists()) {
-						final IFile wbFile = comp.getUnderlyingWorkbenchFile();
-						cpEntryFile = new File(wbFile.getLocation().toOSString());
-					}
-			//		addExternalFile("WEB-INF/lib/" + ref.getArchiveName(), cpEntryFile);
-				}
-			}
-		}
-	}
-
-}
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 5dfebad..8520460 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
@@ -23,6 +23,7 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jdt.core.ToolFactory;
 import org.eclipse.jdt.core.util.IAnnotation;
 import org.eclipse.jdt.core.util.IClassFileAttribute;
@@ -376,6 +377,28 @@
 
 		return simpleArchive;
 	}
+	
+	public static IArchive findArchive(Object modelObject){
+		if(modelObject instanceof EObject){
+			EObject eObject = (EObject)modelObject;
+			return JavaEEEMFArchiveAdapterHelper.findArchive(eObject);
+		}
+		return null;
+	}
+	
+	public static IVirtualComponent findComponent(IArchive anArchive){
+		IArchiveLoadAdapter loadAdapter = null;
+		if(anArchive.getArchiveOptions().hasOption(WRAPPED_LOAD_ADAPTER)){
+			loadAdapter = (IArchiveLoadAdapter)anArchive.getArchiveOptions().getOption(WRAPPED_LOAD_ADAPTER);
+		} else {
+			loadAdapter = (IArchiveLoadAdapter)anArchive.getArchiveOptions().getOption(ArchiveOptions.LOAD_ADAPTER);
+		}
+		if(loadAdapter instanceof JavaEEBinaryComponentLoadAdapter){
+			return ((JavaEEBinaryComponentLoadAdapter)loadAdapter).getArchiveComponent();
+		}
+		return null;
+	}
+	
 
 	public static class JavaEEWrappingLoadAdapter implements IArchiveLoadAdapter {
 
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 c97c58c..3ae1139 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
@@ -21,8 +21,11 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.ContentHandler;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
@@ -40,8 +43,24 @@
 
 public class JavaEEEMFArchiveAdapterHelper {
 
-	// TODO may not need this
+	public static IArchive findArchive(EObject eObject){
+		EList <Adapter> adapters = eObject.eResource().getResourceSet().eAdapters();
+		for(Adapter adapter:adapters){
+			if(adapter instanceof EMFAddapter){
+				return ((EMFAddapter) adapter).getHelper().getArchive();
+			}
+		}
+		return null;
+	}
+	
 	private class EMFAddapter extends AdapterImpl {
+		private JavaEEEMFArchiveAdapterHelper helper;
+		public EMFAddapter(JavaEEEMFArchiveAdapterHelper helper){
+			this.helper = helper;
+		}
+		public JavaEEEMFArchiveAdapterHelper getHelper() {
+			return this.helper;
+		}
 	};
 
 	protected ResourceSet resourceSet;
@@ -118,7 +137,7 @@
 		if (resourceSet == null) {
 			initializeResourceSet();
 			if (null == adapter) {
-				adapter = new EMFAddapter();
+				adapter = new EMFAddapter(this);
 			}
 			resourceSet.eAdapters().add(adapter);
 		}
@@ -134,7 +153,7 @@
 			// add as adapter to new resource set if necessary
 			if (newResourceSet != null && !newResourceSet.eAdapters().contains(adapter)) {
 				if (adapter == null) {
-					adapter = new EMFAddapter();
+					adapter = new EMFAddapter(this);
 				}
 				newResourceSet.eAdapters().add(adapter);
 			}
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
index 438cbf3..2841dcc 100644
--- 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
@@ -15,14 +15,21 @@
 import org.eclipse.jst.jee.archive.IArchiveResource;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
 
+/**
+ * @author jsholl
+ *
+ */
 public class JavaEEBinaryComponentLoadAdapter extends JavaEEEMFZipFileLoadAdapterImpl {
 
 	private java.io.File file = null;
 	private IPath archivePath;
 	private boolean physicallyOpen = true;
 	
+	private VirtualArchiveComponent archiveComponent;
+	
 	public JavaEEBinaryComponentLoadAdapter(VirtualArchiveComponent archiveComponent) throws ArchiveOpenFailureException {
 		super();
+		this.archiveComponent = archiveComponent;
 		java.io.File diskFile = null;
 		diskFile = archiveComponent.getUnderlyingDiskFile();
 		if (!diskFile.exists()) {
@@ -115,6 +122,7 @@
 		}
 	}
 
-	
-	
-}
+	public VirtualArchiveComponent getArchiveComponent() {
+		return archiveComponent;
+	}	
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java
index 1e1a44e..0675ace 100644
--- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java
@@ -31,12 +31,14 @@
 import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
 import org.eclipse.jst.j2ee.internal.actions.AbstractOpenAction;
 import org.eclipse.jst.j2ee.internal.actions.ComponentEditorInput;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
 import org.eclipse.jst.j2ee.internal.componentcore.ComponentArchiveOptions;
 import org.eclipse.jst.j2ee.internal.ejb.provider.J2EEJavaClassProviderHelper;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
 import org.eclipse.jst.j2ee.webservice.wsdd.BeanLink;
 import org.eclipse.jst.javaee.core.JavaEEObject;
 import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.jst.jee.ui.internal.navigator.appclient.GroupAppClientProvider;
 import org.eclipse.jst.jee.ui.internal.navigator.ear.GroupEARProvider;
 import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanInterfaceNode;
@@ -205,6 +207,14 @@
 						.getComponent();
 						openAppropriateEditor(component);
 					}
+				} else {
+					IArchive archive = JavaEEArchiveUtilities.findArchive(ro);
+					if(archive != null){
+						IVirtualComponent component = JavaEEArchiveUtilities.findComponent(archive);
+						if(component != null){
+							openAppropriateEditor(component);
+						}
+					}
 				}
 			}
 		} else if (srcObject instanceof BeanInterfaceNode) {