|
14 | 14 | import java.util.Collection; |
15 | 15 | import java.util.Collections; |
16 | 16 | import java.util.List; |
| 17 | + |
17 | 18 | import org.eclipse.emf.ecore.EPackage; |
| 19 | +import org.eclipse.emf.ecore.EPackage.Registry; |
18 | 20 | import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; |
19 | 21 | import org.eclipse.emf.ecore.resource.Resource; |
20 | | -import org.eclipse.emf.ecore.resource.ResourceSet; |
21 | 22 |
|
22 | 23 | public class InMemoryEmfModel extends EmfModel { |
23 | 24 |
|
| 25 | + protected Collection<EPackage> ePackages; |
| 26 | + |
24 | 27 | public InMemoryEmfModel(String name, Resource modelImpl, EPackage... ePackages) { |
25 | 28 | init(name, modelImpl, Arrays.asList(ePackages), true); |
26 | 29 | } |
@@ -65,72 +68,41 @@ public InMemoryEmfModel(String name, Resource modelImpl, Collection<EPackage> eP |
65 | 68 | protected void init(String name, Resource modelImpl, Collection<EPackage> ePackages, boolean isContainerListenerEnabled) { |
66 | 69 | setName(name); |
67 | 70 | this.modelImpl = modelImpl; |
| 71 | + this.ePackages = ePackages; |
68 | 72 |
|
69 | | - // If some packages are provided, create a registry and put them in it |
70 | | - if (!(ePackages == null || ePackages.isEmpty())) { |
71 | | - this.registry = new EPackageRegistryImpl(); |
72 | | - for (EPackage ePackage : ePackages) { |
73 | | - registry.put(ePackage.getNsURI(), ePackage); |
74 | | - List<EPackage> dependencies = new ArrayList<>(); |
75 | | - EmfUtil.collectDependencies(ePackage, dependencies); |
76 | | - for (EPackage dependency : dependencies) { |
77 | | - registry.put(dependency.getNsURI(), dependency); |
78 | | - } |
79 | | - } |
80 | | - } |
81 | | - else { |
82 | | - // If no packages are provided and registry is null, |
83 | | - // fall back to the global package registry |
84 | | - if (this.registry == null && modelImpl != null && modelImpl.getResourceSet() != null && modelImpl.getResourceSet().getPackageRegistry().isEmpty()) { |
85 | | - this.registry = EPackage.Registry.INSTANCE; |
86 | | - } |
87 | | - } |
88 | | - |
89 | | -// // If there is no ResourceSet we cannot register or call the resource creation factory |
90 | | -// // @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=540424 |
91 | | -// final ResourceSet resourceSet = modelImpl.getResourceSet(); |
92 | | -// if (resourceSet != null) { |
93 | | -// Resource.Factory.Registry rfReg = resourceSet.getResourceFactoryRegistry(); |
94 | | -// if (rfReg == null) { |
95 | | -// resourceSet.setResourceFactoryRegistry(Resource.Factory.Registry.INSTANCE); |
96 | | -// } |
97 | | -// } |
98 | | -// |
99 | | -// if (ePackages == null || ePackages.isEmpty()) { |
100 | | -// |
101 | | -// registry = EPackage.Registry.INSTANCE; |
102 | | -// |
103 | | -// // No additional packages are provided, so if the package registry of |
104 | | -// // the local resource registry is empty, use the global registry instead |
105 | | -// |
106 | | -// // If there is no ResourceSet available, AbstractEmfModel#getPackageRegistry() |
107 | | -// // already returns the global registry, so no need to worry about this |
108 | | -// //if (resourceSet != null && resourceSet.getPackageRegistry().isEmpty()) { |
109 | | -// // resourceSet.setPackageRegistry(EPackage.Registry.INSTANCE); |
110 | | -// //} |
111 | | -// } |
112 | | -// else { |
113 | | -// final EPackage.Registry epReg = getResource().getResourceSet().getPackageRegistry(); |
114 | | -// for (EPackage ePackage : ePackages) { |
115 | | -// epReg.put(ePackage.getNsURI(), ePackage); |
116 | | -// |
117 | | -// //Added : Collect dependencies |
118 | | -// |
119 | | -// List<EPackage> dependencies = new ArrayList<>(); |
120 | | -// EmfUtil.collectDependencies(ePackage, dependencies); |
121 | | -// for (EPackage dependency : dependencies) { |
122 | | -// epReg.put(dependency.getNsURI(), dependency); |
123 | | -// } |
124 | | -// } |
125 | | -// } |
126 | | - |
127 | 73 | // Since 1.6, having CachedContentsAdapter implies cached=true, otherwise it's inconsistent. |
128 | 74 | setCachingEnabled(true); |
129 | 75 |
|
130 | 76 | if (isContainerListenerEnabled) { |
131 | 77 | this.setupContainmentChangeListeners(); |
132 | 78 | } |
133 | 79 | } |
| 80 | + |
| 81 | + @Override |
| 82 | + protected Registry getPackageRegistry() { |
| 83 | + if (compositeRegistry == null) { |
| 84 | + // If some packages are provided, create a registry and put them in it |
| 85 | + if (!(ePackages == null || ePackages.isEmpty())) { |
| 86 | + this.registry = new EPackageRegistryImpl(); |
| 87 | + for (EPackage ePackage : ePackages) { |
| 88 | + registry.put(ePackage.getNsURI(), ePackage); |
| 89 | + List<EPackage> dependencies = new ArrayList<>(); |
| 90 | + EmfUtil.collectDependencies(ePackage, dependencies); |
| 91 | + for (EPackage dependency : dependencies) { |
| 92 | + registry.put(dependency.getNsURI(), dependency); |
| 93 | + } |
| 94 | + } |
| 95 | + } |
| 96 | + else { |
| 97 | + // If no packages are provided and registry is null, |
| 98 | + // fall back to the global package registry |
| 99 | + if (this.registry == null && modelImpl != null && modelImpl.getResourceSet() != null && modelImpl.getResourceSet().getPackageRegistry().isEmpty()) { |
| 100 | + this.registry = EPackage.Registry.INSTANCE; |
| 101 | + } |
| 102 | + } |
| 103 | + } |
| 104 | + return super.getPackageRegistry(); |
| 105 | + } |
134 | 106 |
|
135 | 107 | @Override |
136 | 108 | public void loadModel() { |
|
0 commit comments