Skip to content

Package: XmiTemplateProvider

XmiTemplateProvider

nameinstructionbranchcomplexitylinemethod
XmiTemplateProvider()
M: 0 C: 12
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
activate()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
addLoaderServiceProvider(TemplateLoaderService.Provider)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
addToTemplateMap(EClass, Template)
M: 0 C: 22
100%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 0 C: 4
100%
M: 0 C: 1
100%
canProvideTemplates(EObject, EReference)
M: 0 C: 31
100%
M: 0 C: 6
100%
M: 0 C: 4
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
getLoader(URI, String)
M: 0 C: 15
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
provideTemplates(EObject, EReference)
M: 0 C: 35
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
readExtensionPoint()
M: 9 C: 62
87%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 1 C: 12
92%
M: 0 C: 1
100%
registerTemplate(Template)
M: 15 C: 12
44%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 3 C: 4
57%
M: 0 C: 1
100%
registerTemplateCollection(TemplateCollection)
M: 0 C: 16
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
removeLoaderServiceProvider(TemplateLoaderService.Provider)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setExtensionRegistry(IExtensionRegistry)
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
setReportService(ReportService)
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2019 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Lucas Koehler - initial API and implementation
13: * Christian W. Damus - bugs 529138, 546974
14: ******************************************************************************/
15: package org.eclipse.emfforms.internal.core.services.datatemplate;
16:
17: import static org.osgi.service.component.annotations.ReferenceCardinality.MULTIPLE;
18: import static org.osgi.service.component.annotations.ReferencePolicy.DYNAMIC;
19:
20: import java.io.IOException;
21: import java.util.Collection;
22: import java.util.LinkedHashMap;
23: import java.util.LinkedHashSet;
24: import java.util.Map;
25: import java.util.Set;
26:
27: import org.eclipse.core.runtime.IConfigurationElement;
28: import org.eclipse.core.runtime.IExtensionRegistry;
29: import org.eclipse.emf.common.util.URI;
30: import org.eclipse.emf.ecore.EClass;
31: import org.eclipse.emf.ecore.EObject;
32: import org.eclipse.emf.ecore.EReference;
33: import org.eclipse.emfforms.bazaar.Bazaar;
34: import org.eclipse.emfforms.bazaar.BazaarContext;
35: import org.eclipse.emfforms.core.services.datatemplate.TemplateLoaderService;
36: import org.eclipse.emfforms.core.services.datatemplate.TemplateProvider;
37: import org.eclipse.emfforms.datatemplate.Template;
38: import org.eclipse.emfforms.datatemplate.TemplateCollection;
39: import org.eclipse.emfforms.spi.bazaar.BazaarUtil;
40: import org.eclipse.emfforms.spi.common.report.AbstractReport;
41: import org.eclipse.emfforms.spi.common.report.ReportService;
42: import org.osgi.service.component.annotations.Activate;
43: import org.osgi.service.component.annotations.Component;
44: import org.osgi.service.component.annotations.Reference;
45:
46: /**
47: * Template provider that reads in templates from an extension point.
48: *
49: * @author Lucas Koehler
50: *
51: */
52: @Component(name = "XmiTemplateProvider")
53: public class XmiTemplateProvider implements TemplateProvider {
54:
55:         private static final String FILE_ATTRIBUTE = "file"; //$NON-NLS-1$
56:         private static final String EXTENSION_POINT = "org.eclipse.emfforms.core.services.datatemplate.xmi"; //$NON-NLS-1$
57:
58:         private final Bazaar<TemplateLoaderService> templateLoaderBazaar = BazaarUtil.createBazaar(
59:                 TemplateLoaderService.DEFAULT);
60:
61:         private final Map<EClass, LinkedHashSet<Template>> templates = new LinkedHashMap<EClass, LinkedHashSet<Template>>();
62:         private ReportService reportService;
63:         private IExtensionRegistry extensionRegistry;
64:
65:         /**
66:          * Sets the {@link ReportService}.
67:          *
68:          * @param reportService The {@link ReportService} to set
69:          */
70:         @Reference
71:         void setReportService(ReportService reportService) {
72:                 this.reportService = reportService;
73:         }
74:
75:         /**
76:          * Sets the extension registry dependency.
77:          *
78:          * @param extensionRegistry the extension registry
79:          */
80:         @Reference
81:         void setExtensionRegistry(IExtensionRegistry extensionRegistry) {
82:                 this.extensionRegistry = extensionRegistry;
83:         }
84:
85:         /**
86:          * Reads the extension point on service activation.
87:          */
88:         @Activate
89:         void activate() {
90:                 readExtensionPoint();
91:         }
92:
93:         /**
94:          * Add a template loader service provider.
95:          *
96:          * @param provider the provider to add
97:          *
98:          * @since 1.21
99:          */
100:         @Reference(cardinality = MULTIPLE, policy = DYNAMIC)
101:         public void addLoaderServiceProvider(TemplateLoaderService.Provider provider) {
102:                 templateLoaderBazaar.addVendor(provider);
103:         }
104:
105:         /**
106:          * Remove a template loader service provider.
107:          *
108:          * @param provider the provider to remove
109:          */
110:         void removeLoaderServiceProvider(TemplateLoaderService.Provider provider) {
111:                 templateLoaderBazaar.removeVendor(provider);
112:         }
113:
114:         /**
115:          * Reads in the registered templates from the extension point.
116:          */
117:         void readExtensionPoint() {
118:                 final IConfigurationElement[] configurationElements = extensionRegistry
119:                         .getConfigurationElementsFor(EXTENSION_POINT);
120:
121:•                for (final IConfigurationElement configurationElement : configurationElements) {
122:                         try {
123:                                 final String contributor = configurationElement.getContributor().getName();
124:                                 final String path = configurationElement.getAttribute(FILE_ATTRIBUTE).replaceFirst("^/*", ""); //$NON-NLS-1$//$NON-NLS-2$
125:                                 final URI resourceURI = URI.createPlatformPluginURI(
126:                                         String.format("%s/%s", contributor, path), true); //$NON-NLS-1$
127:
128:                                 final TemplateLoaderService loader = getLoader(resourceURI, contributor);
129:                                 final Collection<? extends TemplateCollection> collections = loader.loadTemplates(resourceURI);
130:                                 collections.forEach(this::registerTemplateCollection);
131:                         } catch (final IOException ex) {
132:                                 reportService.report(new AbstractReport(ex, "An Exception occured while reading in a data template.")); //$NON-NLS-1$
133:                         }
134:                 }
135:         }
136:
137:         @Override
138:         public boolean canProvideTemplates(EObject owner, EReference reference) {
139:                 final EClass referenceType = reference.getEReferenceType();
140:
141:                 // if we have a key for the given template we surely have at least one template
142:•                if (templates.containsKey(referenceType)) {
143:                         return true;
144:                 }
145:
146:                 // otherwise we have to analyze all keys and see if our type is a super type (of at least one)
147:•                for (final EClass type : templates.keySet()) {
148:•                        if (referenceType.isSuperTypeOf(type)) {
149:                                 return true;
150:                         }
151:                 }
152:                 return false;
153:         }
154:
155:         @Override
156:         public Set<Template> provideTemplates(EObject owner, EReference reference) {
157:                 final Set<Template> matchingTemplates = new LinkedHashSet<Template>();
158:                 final EClass referenceType = reference.getEReferenceType();
159:
160:•                for (final EClass type : templates.keySet()) {
161:•                        if (!referenceType.isSuperTypeOf(type)) {
162:                                 continue;
163:                         }
164:                         matchingTemplates.addAll(templates.get(type));
165:                 }
166:                 return matchingTemplates;
167:         }
168:
169:         private TemplateLoaderService getLoader(URI uri, String contributorID) {
170:                 final BazaarContext context = BazaarContext.Builder.empty()
171:                         .put(URI.class, uri)
172:                         .put(TemplateLoaderService.Provider.CONTRIBUTOR_ID, contributorID)
173:                         .build();
174:                 return templateLoaderBazaar.createProduct(context);
175:         }
176:
177:         private void addToTemplateMap(EClass type, Template template) {
178:•                if (!templates.containsKey(type)) {
179:                         templates.put(type, new LinkedHashSet<Template>());
180:                 }
181:                 templates.get(type).add(template);
182:         }
183:
184:         private void registerTemplateCollection(TemplateCollection collection) {
185:•                for (final Template template : collection.getTemplates()) {
186:                         registerTemplate(template);
187:                 }
188:         }
189:
190:         /**
191:          * Register a template for its instance's type.
192:          *
193:          * @param template The template
194:          */
195:         void registerTemplate(Template template) {
196:•                if (template.getInstance() == null) {
197:                         reportService.report(new AbstractReport(
198:                                 "Ignoring template '{0}', as it does not contain a valid EObject instance", template.getName())); //$NON-NLS-1$
199:                         return;
200:                 }
201:
202:                 final EClass type = template.getInstance().eClass();
203:                 addToTemplateMap(type, template);
204:         }
205: }