diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common')
3 files changed, 27 insertions, 60 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java index 106b05d438..8f2dc36fc5 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java @@ -20,7 +20,6 @@ import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; import org.eclipse.net4j.util.om.trace.ContextTracer; -import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EPackage; @@ -30,7 +29,7 @@ import java.text.MessageFormat; /** * @author Eike Stepper */ -public class CDOPackageInfoImpl extends AdapterImpl implements InternalCDOPackageInfo +public class CDOPackageInfoImpl implements InternalCDOPackageInfo { private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOPackageInfoImpl.class); @@ -40,6 +39,8 @@ public class CDOPackageInfoImpl extends AdapterImpl implements InternalCDOPackag private String parentURI; + private EPackage ePackage; + public CDOPackageInfoImpl() { } @@ -107,24 +108,12 @@ public class CDOPackageInfoImpl extends AdapterImpl implements InternalCDOPackag public EPackage getEPackage(boolean loadOnDemand) { - return doGetEPackage(loadOnDemand); - } - - public EPackage doGetEPackage(boolean loadOnDemand) - { - EPackage ePackage = (EPackage)getTarget(); - if (ePackage != null) - { - return ePackage; - } - - if (loadOnDemand) + if (ePackage == null && loadOnDemand) { - packageUnit.load(true); // TODO (CD) Dubious: is resolution-on-load really a good idea? - return (EPackage)getTarget(); + packageUnit.load(true); } - return null; + return ePackage; } public boolean isCorePackage() diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java index 67ee3803e9..c8dd79a8e7 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java @@ -16,7 +16,6 @@ import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.CDOPackageUnit.State; -import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.internal.common.bundle.OM; import org.eclipse.emf.cdo.internal.common.messages.Messages; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; @@ -33,8 +32,6 @@ import org.eclipse.net4j.util.lifecycle.LifecycleState; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.om.trace.ContextTracer; -import org.eclipse.emf.common.notify.Adapter; -import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.Enumerator; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; @@ -87,6 +84,8 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte private Set<CDOPackageInfo> visitedPackages = new HashSet<CDOPackageInfo>(); + private Map<EPackage, InternalCDOPackageInfo> packageInfoMap = new HashMap<EPackage, InternalCDOPackageInfo>(); + public CDOPackageRegistryImpl() { } @@ -193,7 +192,7 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte EPackage newValue = (EPackage)value; if (oldPackageInfo.getEPackage(false) == null) { - EMFUtil.addAdapter(newValue, oldPackageInfo); + registerPackageInfo(newValue, oldPackageInfo); oldPackageInfo.getPackageUnit().setState(CDOPackageUnit.State.LOADED); } } @@ -257,7 +256,7 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte EPackage ePackage = packageInfo.getEPackage(false); if (ePackage != null) { - EMFUtil.addAdapter(ePackage, packageInfo); + registerPackageInfo(ePackage, packageInfo); basicPut(ePackage.getNsURI(), ePackage); } else @@ -283,11 +282,16 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte } } + public synchronized void registerPackageInfo(EPackage ePackage, InternalCDOPackageInfo packageInfo) + { + packageInfoMap.put(ePackage, packageInfo); + } + public synchronized InternalCDOPackageInfo getPackageInfo(EPackage ePackage) { LifecycleUtil.checkActive(this); - // Looks in the registry + // Looks up a package descriptor in the registry Object object = get(ePackage.getNsURI()); if (object instanceof InternalCDOPackageInfo) { @@ -298,25 +302,8 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte } } - // Looks in the adapters - synchronized (ePackage) - { - EList<Adapter> adapters = ePackage.eAdapters(); - for (int i = 0, size = adapters.size(); i < size; ++i) - { - Adapter adapter = adapters.get(i); - if (adapter instanceof InternalCDOPackageInfo) - { - InternalCDOPackageInfo packageInfo = (InternalCDOPackageInfo)adapter; - if (packageInfo.getPackageUnit().getPackageRegistry() == this) - { - return packageInfo; - } - } - } - } - - return null; + // Looks up a package info in the packageInfoMap + return packageInfoMap.get(ePackage); } public synchronized InternalCDOPackageInfo[] getPackageInfos() @@ -612,6 +599,7 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte { try { + packageInfoMap.clear(); disposePackageUnits(); clear(); active = false; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java index db20245bf3..ca23110573 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java @@ -218,25 +218,14 @@ public class CDOPackageUnitImpl implements InternalCDOPackageUnit public void dispose() { - for (InternalCDOPackageInfo packageInfo : packageInfos) - { - EPackage ePackage = packageInfo.getEPackage(false); - if (ePackage != null) - { - synchronized (ePackage) - { - ePackage.eAdapters().remove(packageInfo); - } - } - } - packageInfos = null; setState(State.DISPOSED); } public synchronized void load(boolean resolve) { - load(packageRegistry.getPackageLoader(), resolve); + PackageLoader packageLoader = packageRegistry.getPackageLoader(); + load(packageLoader, resolve); } public synchronized void load(PackageLoader packageLoader, boolean resolve) @@ -254,10 +243,10 @@ public class CDOPackageUnitImpl implements InternalCDOPackageUnit { String packageURI = ePackage.getNsURI(); InternalCDOPackageInfo packageInfo = getPackageInfo(packageURI); - synchronized (ePackage) + packageRegistry.registerPackageInfo(ePackage, packageInfo); + if (resolve) { - EMFUtil.addAdapter(ePackage, packageInfo); - if (resolve) + synchronized (ePackage) { EcoreUtil.resolveAll(ePackage); } @@ -347,9 +336,10 @@ public class CDOPackageUnitImpl implements InternalCDOPackageUnit packageInfo.setPackageUnit(this); packageInfo.setPackageURI(ePackage.getNsURI()); packageInfo.setParentURI(ePackage.getESuperPackage() == null ? null : ePackage.getESuperPackage().getNsURI()); - EMFUtil.addAdapter(ePackage, packageInfo); + packageRegistry.registerPackageInfo(ePackage, packageInfo); packageRegistry.basicPut(ePackage.getNsURI(), ePackage); + result.add(packageInfo); for (EPackage subPackage : ePackage.getESubpackages()) { @@ -362,7 +352,7 @@ public class CDOPackageUnitImpl implements InternalCDOPackageUnit InternalCDOPackageInfo packageInfo = getPackageInfo(ePackage.getNsURI()); if (packageInfo != null) { - EMFUtil.addAdapter(ePackage, packageInfo); + packageRegistry.registerPackageInfo(ePackage, packageInfo); } for (EPackage subPackage : ePackage.getESubpackages()) |