[98766] Enabling Access to editmodel through adapter
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
index 8929ec5..4c903a8 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
@@ -151,7 +151,7 @@
 
 
 
-	private EditModel getExistingEditModel(String editModelID, Map params, boolean isReadOnly) {
+	public EditModel getExistingEditModel(String editModelID, Map params, boolean isReadOnly) {
 		EditModel editModel = null;
 		if (isReadOnly) {
 			editModel = (EditModel) this.readOnlyModels.get(getCacheID(editModelID, params));
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
index 4fb2f1f..3afb8f1 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
@@ -11,7 +11,9 @@
 import java.util.List;
 
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.emf.common.command.CommandStack;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
@@ -56,7 +58,7 @@
  * @see ArtifactEditModel
  * @since 1.0
  */
-public class ArtifactEdit implements IEditModelHandler {
+public class ArtifactEdit implements IEditModelHandler, IAdaptable{
 
 	public static final Class ADAPTER_TYPE = ArtifactEdit.class;
 	private final ArtifactEditModel artifactEditModel;
@@ -506,4 +508,8 @@
 	public Resource getResource(URI aUri) {
 		return getArtifactEditModel().getResource(aUri);
 	}
+
+	public Object getAdapter(Class adapterType) {
+		return Platform.getAdapterManager().getAdapter(this, adapterType);
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
index a4e4a74..2ac4784 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
@@ -38,6 +38,7 @@
 import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
 import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
 import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
 import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelNature;
 
 /**
@@ -523,5 +524,9 @@
 		return null;
 	}
 
+	public EditModel getExistingEditModel(String artifactEditModelId,Map params, boolean isReadOnly) {
+		return getEmfContext().getExistingEditModel(artifactEditModelId,params,isReadOnly);
+	}
+
 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
index 7d386d5..93248f0 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
@@ -17,6 +17,7 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
 import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
@@ -53,6 +54,7 @@
 
 public class ArtifactEditModel extends EditModel implements IAdaptable {
 
+	public static final Class ADAPTER_TYPE = ArtifactEditModel.class;
 	private final ComponentHandle componentHandle; 
 	private final IPath modulePath;
 	private final IVirtualComponent virtualComponent;
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java
index 9b343c4..eed6366 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java
@@ -6,6 +6,7 @@
 import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Plugin;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
 import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesInit;
 import org.eclipse.wst.common.componentcore.internal.util.ArtifactEditAdapterFactory;
@@ -40,6 +41,7 @@
 		
 		manager.registerAdapters(new ModuleCoreEclipseAdapterFactory(), ModuleStructuralModel.class);
 		manager.registerAdapters(new ArtifactEditAdapterFactory(), ArtifactEditModel.class);
+		manager.registerAdapters(new ArtifactEditAdapterFactory(), ArtifactEdit.class);
 		
 		PlatformURLModuleConnection.startup();
 		WTPModulesInit.init();
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
index df51e4f..7c0c63a 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
@@ -24,6 +24,7 @@
 import org.eclipse.wst.common.componentcore.internal.StructureEdit;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
 import org.eclipse.wst.common.componentcore.internal.util.IPathProvider;
+import org.eclipse.wst.common.internal.emf.utilities.EtoolsCopyUtility;
 
 /**
  * <p>
@@ -190,10 +191,9 @@
 						
 						if(newResource == null) {
 							// flesh out the tree
-							newResource = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createComponentResource();
 							if ((toCreateResourceAlways) || (foundResource = eclipseContainer.findMember(aPath)) != null) {
+								newResource = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createComponentResource();
 								newResource.setComponent(moduleResource.getComponent());		
-								
 								newResource.setRuntimePath(runtimeURI);
 								newResource.setSourcePath(eclipseContainer.getProjectRelativePath().append(aPath));
 								resultSet.add(newResource);
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.java
index 502bf1c..ed515d6 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.java
@@ -10,9 +10,22 @@
  *******************************************************************************/
 package org.eclipse.wst.common.componentcore.internal.util;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.emf.common.util.URI;
 import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ModuleCoreNature;
+import org.eclipse.wst.common.componentcore.UnresolveableURIException;
 import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.internal.impl.ArtifactEditModelFactory;
+import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
+import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory;
 
 /**
  * <p>
@@ -29,6 +42,7 @@
 public class ArtifactEditAdapterFactory implements IAdapterFactory {
 
 	private static final Class ARTIFACT_EDIT_MODEL_CLASS = ArtifactEditModel.class;
+	private static final Class ARTIFACT_EDIT_CLASS = ArtifactEdit.class;
 	
 	/**
 	 * <p>
@@ -37,18 +51,44 @@
 	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
 	 */
 	public Object getAdapter(Object anAdaptableObject, Class anAdapterType) {
+		if (anAdapterType == ArtifactEditModel.ADAPTER_TYPE) {
+			if (anAdaptableObject instanceof ArtifactEdit) {
+				ArtifactEdit edit = (ArtifactEdit)anAdaptableObject;
+				ComponentHandle aHandle = edit.getComponentHandle();
+				URI componentURI = ModuleURIUtil.fullyQualifyURI(aHandle);
+				ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(edit.getComponent().getProject());
+				Map params = new HashMap();
+				params.put(ArtifactEditModelFactory.PARAM_MODULE_URI, componentURI);
+				return nature.getExistingEditModel(getArtifactEditModelId(componentURI),params,edit.isReadOnly());
+			}
+		}
 		if (anAdapterType == ArtifactEdit.ADAPTER_TYPE) {
 			if (anAdaptableObject instanceof ArtifactEditModel)
 				return new ArtifactEdit((ArtifactEditModel) anAdaptableObject);
 		}
 		return null;
 	}
+	private String getArtifactEditModelId(URI aModuleURI) { 
+		StructureEdit editUtility = null;
+		try {
+			IProject project = StructureEdit.getContainingProject(aModuleURI);
+			editUtility = StructureEdit.getStructureEditForRead(project);
+			WorkbenchComponent module = editUtility.findComponentByName(ModuleURIUtil.getDeployedName(aModuleURI));
+			return module.getComponentType().getComponentTypeId();
+		} catch (UnresolveableURIException uurie) {
+			// Ignore
+		} finally {
+			if (editUtility != null)
+				editUtility.dispose();
+		}
+		return null;
+	}
 
 	/**  
 	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
 	 */
 	public Class[] getAdapterList() {
-		return new Class[]{ARTIFACT_EDIT_MODEL_CLASS};
+		return new Class[]{ARTIFACT_EDIT_MODEL_CLASS,ARTIFACT_EDIT_CLASS};
 	}
 
 }
\ No newline at end of file