### Eclipse Workspace Patch 1.0 #P org.eclipse.wst.common.modulecore Index: modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java,v retrieving revision 1.62 diff -u -r1.62 VirtualComponent.java --- modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java 4 Sep 2008 05:47:27 -0000 1.62 +++ modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java 1 Oct 2009 18:49:30 -0000 @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; @@ -24,18 +25,19 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; +import org.eclipse.emf.common.util.URI; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.ModuleCoreNature; import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory; import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage; -import org.eclipse.wst.common.componentcore.internal.DependencyType; import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin; import org.eclipse.wst.common.componentcore.internal.Property; import org.eclipse.wst.common.componentcore.internal.ReferencedComponent; import org.eclipse.wst.common.componentcore.internal.StructureEdit; import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent; -import org.eclipse.wst.common.componentcore.internal.builder.DependencyGraphManager; -import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil; +import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph; +import org.eclipse.wst.common.componentcore.resolvers.IReferenceResolver; +import org.eclipse.wst.common.componentcore.resolvers.ReferenceResolverUtil; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; @@ -286,9 +288,6 @@ if (referencedComponent==null) continue; IVirtualReference vReference = StructureEdit.createVirtualReference(this, referencedComponent); - if( vReference != null ){ - vReference.setArchiveName( referencedComponent.getArchiveName() ); - } if (vReference != null && vReference.getReferencedComponent() != null && vReference.getReferencedComponent().exists()) references.add(vReference); } @@ -312,21 +311,14 @@ WorkbenchComponent component = core.getComponent(); ReferencedComponent referencedComponent = null; ComponentcoreFactory factory = ComponentcorePackage.eINSTANCE.getComponentcoreFactory(); + IReferenceResolver resolver = null; for (int i=0; i projects = IDependencyGraph.INSTANCE.getReferencingComponents(getProject()); + IVirtualComponent[] result = new IVirtualComponent[projects.size()]; + Iterator i = projects.iterator(); + for (int j=0; j + Index: modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java =================================================================== RCS file: /cvsroot/webtools/common/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java,v retrieving revision 1.45 diff -u -r1.45 StructureEdit.java --- modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java 29 Sep 2009 19:43:18 -0000 1.45 +++ modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java 1 Oct 2009 18:49:30 -0000 @@ -32,15 +32,14 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.jem.util.UIContextDetermination; import org.eclipse.jem.util.emf.workbench.ProjectUtilities; -import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.IEditModelHandler; import org.eclipse.wst.common.componentcore.ModuleCoreNature; import org.eclipse.wst.common.componentcore.UnresolveableURIException; import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil; -import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection; import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode; -import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference; import org.eclipse.wst.common.componentcore.internal.util.EclipseResourceAdapter; +import org.eclipse.wst.common.componentcore.resolvers.IReferenceResolver; +import org.eclipse.wst.common.componentcore.resolvers.ReferenceResolverUtil; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil; @@ -282,38 +281,9 @@ return componentType; } - public static IVirtualReference createVirtualReference(IVirtualComponent context, ReferencedComponent referencedComponent) { - - IVirtualComponent targetComponent = null; - IProject targetProject = null; - URI uri = referencedComponent.getHandle(); - if (uri == null) - return null; - boolean isClassPathURI = ModuleURIUtil.isClassPathURI(uri); - if( !isClassPathURI ){ - try { - targetProject = StructureEdit.getContainingProject(uri); - } catch(UnresolveableURIException uurie) { - //Ignore - } - // if the project cannot be resolved, assume it's local - really it probably deleted - - targetComponent = ComponentCore.createComponent(targetProject); - - - }else{ - String archiveType = ""; //$NON-NLS-1$ - String archiveName = ""; //$NON-NLS-1$ - try { - archiveType = ModuleURIUtil.getArchiveType(uri); - archiveName = ModuleURIUtil.getArchiveName(uri); - - } catch (UnresolveableURIException e) { - //Ignore - } - targetComponent = ComponentCore.createArchiveComponent(context.getProject(), archiveType + IPath.SEPARATOR + archiveName ); - } - return new VirtualReference(context, targetComponent, referencedComponent.getRuntimePath(), referencedComponent.getDependencyType().getValue()); + public static IVirtualReference createVirtualReference(IVirtualComponent context, ReferencedComponent reference) { + IReferenceResolver resolver = ReferenceResolverUtil.getDefault().getResolver(context, reference); + return resolver.resolve(context, reference); } protected StructureEdit(ModuleCoreNature aNature, boolean toAccessAsReadOnly) { @@ -937,9 +907,8 @@ } public static URI createComponentURI(IProject aContainingProject, String aComponentName) { - return URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + IPath.SEPARATOR + PlatformURLModuleConnection.RESOURCE_MODULE + aContainingProject.getName() + IPath.SEPARATOR + aComponentName); + return ModuleURIUtil.fullyQualifyURI(aContainingProject, aComponentName); } - protected IProject getProject() { return aProject; Index: modulecore-src/org/eclipse/wst/common/componentcore/resolvers/ReferenceResolverUtil.java =================================================================== RCS file: modulecore-src/org/eclipse/wst/common/componentcore/resolvers/ReferenceResolverUtil.java diff -N modulecore-src/org/eclipse/wst/common/componentcore/resolvers/ReferenceResolverUtil.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modulecore-src/org/eclipse/wst/common/componentcore/resolvers/ReferenceResolverUtil.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,126 @@ +package org.eclipse.wst.common.componentcore.resolvers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.Platform; +import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin; +import org.eclipse.wst.common.componentcore.internal.ReferencedComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualReference; + +public class ReferenceResolverUtil { + public static ReferenceResolverUtil instance = null; + public static ReferenceResolverUtil getDefault() { + if( instance == null ) + instance = new ReferenceResolverUtil(); + return instance; + } + + private HashMap resolvers = null; + private ArrayList sorted = null; + private DefaultReferenceResolver defaultResolver = new DefaultReferenceResolver(); + public IReferenceResolver[] getResolvers() { + if( resolvers == null ) + loadResolvers(); + if (sorted.isEmpty()) return new IReferenceResolver[0]; + return (IReferenceResolver[]) sorted.toArray(new IReferenceResolver[sorted.size()]); + } + + public IReferenceResolver getResolver(IVirtualComponent context, ReferencedComponent reference) { + getResolvers(); + Iterator i = sorted.iterator(); + IReferenceResolver resolver; + while(i.hasNext()) { + resolver = i.next(); + if( resolver.canResolve(context, reference)) + return resolver; + } + return defaultResolver; + } + + public IReferenceResolver getResolver(IVirtualReference reference) { + getResolvers(); + Iterator i = sorted.iterator(); + IReferenceResolver resolver; + while(i.hasNext()) { + resolver = i.next(); + if( resolver.canResolve(reference)) + return resolver; + } + return defaultResolver; + } + + protected void loadResolvers() { + HashMap map = new HashMap(); + + IExtensionRegistry registry = Platform.getExtensionRegistry(); + IConfigurationElement[] cf = registry.getConfigurationElementsFor(ModulecorePlugin.PLUGIN_ID, "referenceResolver"); //$NON-NLS-1$ + String id = null; + for( int j = 0; j < cf.length; j++ ) { + id = cf[j].getAttribute("id"); + try { + map.put(id, new ReferenceResolverWrapper( + id, (IReferenceResolver) + cf[j].createExecutableExtension("class"), + cf[j].getAttribute("weight"))); + } catch( CoreException ce ) { + // TODO figure it out + } + } + resolvers = map; + + // Cache the sorted ones + List list = new ArrayList(resolvers.values()); + Comparator comparator = new Comparator() { + public int compare(Object o1, Object o2) { + if( !(o1 instanceof ReferenceResolverWrapper)) + return -1; + if( !(o2 instanceof ReferenceResolverWrapper)) + return 1; + return ((ReferenceResolverWrapper)o2).getWeight() + - ((ReferenceResolverWrapper)o1).getWeight(); + } + }; + + Collections.sort(list, comparator); + ArrayList sorted = new ArrayList(); + Iterator i = list.iterator(); + while(i.hasNext()) + sorted.add(((ReferenceResolverWrapper)i.next()).getResolver()); + this.sorted = sorted; + } + + + protected class ReferenceResolverWrapper { + private String id; + private IReferenceResolver resolver; + private int weight; + public ReferenceResolverWrapper(String id, IReferenceResolver resolver, String weight) { + this.id = id; + this.resolver = resolver; + try { + this.weight = Integer.parseInt(weight); + } catch( NumberFormatException nfe) { + this.weight = 1000; + } + } + public int getWeight() { + return weight; + } + public String getId() { + return id; + } + public IReferenceResolver getResolver() { + return resolver; + } + } + +} Index: modulecore-src/org/eclipse/wst/common/componentcore/resolvers/DefaultReferenceResolver.java =================================================================== RCS file: modulecore-src/org/eclipse/wst/common/componentcore/resolvers/DefaultReferenceResolver.java diff -N modulecore-src/org/eclipse/wst/common/componentcore/resolvers/DefaultReferenceResolver.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modulecore-src/org/eclipse/wst/common/componentcore/resolvers/DefaultReferenceResolver.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,81 @@ +package org.eclipse.wst.common.componentcore.resolvers; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IPath; +import org.eclipse.emf.common.util.URI; +import org.eclipse.wst.common.componentcore.ComponentCore; +import org.eclipse.wst.common.componentcore.UnresolveableURIException; +import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage; +import org.eclipse.wst.common.componentcore.internal.DependencyType; +import org.eclipse.wst.common.componentcore.internal.ReferencedComponent; +import org.eclipse.wst.common.componentcore.internal.StructureEdit; +import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil; +import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference; +import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualReference; + +public class DefaultReferenceResolver implements IReferenceResolver { + // Does not need to implement, + // default is always called as last resort + public boolean canResolve(IVirtualComponent context, + ReferencedComponent referencedComponent) { + return false; + } + + // Does not need to implement, + // default is always called as last resort + public boolean canResolve(IVirtualReference reference) { + return false; + } + + public IVirtualReference resolve(IVirtualComponent context, + ReferencedComponent referencedComponent) { + IVirtualComponent targetComponent = null; + IProject targetProject = null; + URI uri = referencedComponent.getHandle(); + if (uri == null) + return null; + boolean isClassPathURI = ModuleURIUtil.isClassPathURI(uri); + if( !isClassPathURI ){ + try { + targetProject = StructureEdit.getContainingProject(uri); + } catch(UnresolveableURIException uurie) { + //Ignore + } + // if the project cannot be resolved, assume it's local - really it probably deleted + + targetComponent = ComponentCore.createComponent(targetProject); + + + }else{ + String archiveType = ""; //$NON-NLS-1$ + String archiveName = ""; //$NON-NLS-1$ + try { + archiveType = ModuleURIUtil.getArchiveType(uri); + archiveName = ModuleURIUtil.getArchiveName(uri); + + } catch (UnresolveableURIException e) { + //Ignore + } + targetComponent = ComponentCore.createArchiveComponent(context.getProject(), archiveType + IPath.SEPARATOR + archiveName ); + } + return new VirtualReference(context, targetComponent, referencedComponent.getRuntimePath(), referencedComponent.getDependencyType().getValue()); + } + + public ReferencedComponent resolve(IVirtualReference reference) { + IVirtualComponent referencedComponent = reference.getReferencedComponent(); + ReferencedComponent refComp = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createReferencedComponent(); + refComp.setRuntimePath(reference.getRuntimePath()); + refComp.setDependencyType(DependencyType.get(reference.getDependencyType())); + refComp.setArchiveName(reference.getArchiveName()); + if( referencedComponent != null ) { + if( !referencedComponent.isBinary()) + refComp.setHandle(ModuleURIUtil.fullyQualifyURI(referencedComponent.getProject())); + else + refComp.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(referencedComponent.getName())); + } + return refComp; + } + + +} Index: schema/referenceResolver.exsd =================================================================== RCS file: schema/referenceResolver.exsd diff -N schema/referenceResolver.exsd --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ schema/referenceResolver.exsd 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,116 @@ + + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A required id which can be used to reference this resolver + + + + + + + The implementation class of this extension + + + + + + + + + + The weight used for sorting the resolvers. Lighter weights float to the top and are tried first. + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + Index: modulecore-src/org/eclipse/wst/common/componentcore/resolvers/IReferenceResolver.java =================================================================== RCS file: modulecore-src/org/eclipse/wst/common/componentcore/resolvers/IReferenceResolver.java diff -N modulecore-src/org/eclipse/wst/common/componentcore/resolvers/IReferenceResolver.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modulecore-src/org/eclipse/wst/common/componentcore/resolvers/IReferenceResolver.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,12 @@ +package org.eclipse.wst.common.componentcore.resolvers; + +import org.eclipse.wst.common.componentcore.internal.ReferencedComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualReference; + +public interface IReferenceResolver { + public boolean canResolve(IVirtualComponent context, ReferencedComponent referencedComponent); + public IVirtualReference resolve(IVirtualComponent context, ReferencedComponent referencedComponent); + public boolean canResolve(IVirtualReference reference); + public ReferencedComponent resolve(IVirtualReference reference); +}