Skip to content

Package: BlankTemplateProvider

BlankTemplateProvider

nameinstructionbranchcomplexitylinemethod
BlankTemplateProvider()
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
canProvideTemplates(EObject, EReference)
M: 0 C: 23
100%
M: 2 C: 4
67%
M: 2 C: 2
50%
M: 0 C: 4
100%
M: 0 C: 1
100%
createTemplate(EClass, EObject)
M: 0 C: 21
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
getDisplayName(EClass)
M: 0 C: 23
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
provideTemplates(EObject, EReference)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
provideTemplates(EObject, EReference, EClassSelectionStrategy)
M: 0 C: 89
100%
M: 2 C: 10
83%
M: 2 C: 5
71%
M: 0 C: 16
100%
M: 0 C: 1
100%
setBundleResolver(BundleResolver)
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%
setDefaultNewElementStrategyProvider(DefaultCreateNewModelElementStrategyProvider)
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%
setLocalizationService(EMFFormsLocalizationService)
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-2018 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 - bug 529138
14: ******************************************************************************/
15: package org.eclipse.emfforms.internal.core.services.datatemplate;
16:
17: import java.util.Collection;
18: import java.util.Collections;
19: import java.util.HashMap;
20: import java.util.LinkedHashSet;
21: import java.util.Map;
22: import java.util.Set;
23:
24: import org.eclipse.emf.ecore.EClass;
25: import org.eclipse.emf.ecore.EObject;
26: import org.eclipse.emf.ecore.EReference;
27: import org.eclipse.emf.ecore.util.EcoreUtil;
28: import org.eclipse.emf.ecp.common.spi.EMFUtils;
29: import org.eclipse.emf.ecp.ui.view.swt.reference.DefaultCreateNewModelElementStrategyProvider;
30: import org.eclipse.emf.ecp.ui.view.swt.reference.EClassSelectionStrategy;
31: import org.eclipse.emfforms.core.services.datatemplate.TemplateProvider;
32: import org.eclipse.emfforms.datatemplate.DataTemplateFactory;
33: import org.eclipse.emfforms.datatemplate.Template;
34: import org.eclipse.emfforms.spi.common.BundleResolver;
35: import org.eclipse.emfforms.spi.common.BundleResolver.NoBundleFoundException;
36: import org.eclipse.emfforms.spi.common.BundleResolverFactory;
37: import org.eclipse.emfforms.spi.localization.EMFFormsLocalizationService;
38: import org.eclipse.osgi.util.NLS;
39: import org.osgi.framework.Bundle;
40: import org.osgi.service.component.annotations.Component;
41: import org.osgi.service.component.annotations.Reference;
42:
43: /**
44: * {@link TemplateProvider} that provides a templates simply containing empty instances of the corresponding EClass and
45: * its concrete sub classes.
46: *
47: * @author Lucas Koehler
48: *
49: */
50: @Component(name = "BlankTemplateProvider")
51: public class BlankTemplateProvider implements TemplateProvider {
52:         private BundleResolver bundleResolver;
53:         private EMFFormsLocalizationService localizationService;
54:
55:         private DefaultCreateNewModelElementStrategyProvider defaultNewElementStrategyProvider;
56:
57:         /**
58:          * Creates a new {@link BlankTemplateProvider} instance.
59:          */
60:         public BlankTemplateProvider() {
61:                 setBundleResolver(BundleResolverFactory.createBundleResolver());
62:         }
63:
64:         /**
65:          * Sets the {@link EMFFormsLocalizationService}.
66:          *
67:          * @param localizationService The {@link EMFFormsLocalizationService}
68:          */
69:         @Reference
70:         void setLocalizationService(EMFFormsLocalizationService localizationService) {
71:                 this.localizationService = localizationService;
72:         }
73:
74:         /**
75:          * Sets the default new-element strategy provider for creation of "blank" template instances.
76:          *
77:          * @param defaultNewElementStrategyProvider the default new-element strategy provider
78:          */
79:         @Reference
80:         void setDefaultNewElementStrategyProvider(
81:                 DefaultCreateNewModelElementStrategyProvider defaultNewElementStrategyProvider) {
82:
83:                 this.defaultNewElementStrategyProvider = defaultNewElementStrategyProvider;
84:         }
85:
86:         @Override
87:         public boolean canProvideTemplates(EObject owner, EReference reference) {
88:                 // We can only provide a blank template if the type or at least one of its sub classes is concrete.
89:•                for (final EClass subClass : EMFUtils.getSubClasses(reference.getEReferenceType())) {
90:•                        if (!subClass.isAbstract() && !subClass.isInterface()) {
91:                                 return true;
92:                         }
93:                 }
94:
95:                 return false;
96:         }
97:
98:         @Override
99:         public Set<Template> provideTemplates(EObject owner, EReference reference) {
100:                 return provideTemplates(owner, reference, EClassSelectionStrategy.NULL);
101:         }
102:
103:         /**
104:          * The actual method which creates the templates. This Method uses the provided {@link EClassSelectionStrategy} to
105:          * filter possible templates.
106:          *
107:          * @param owner The {@link EObject} to which the templates should be added
108:          * @param reference The {@link EReference} to which the templates should be added
109:          * @param eClassSelectionStrategy The {@link EClassSelectionStrategy} to use for filtering
110:          * @return The Set of Templates created by this {@link TemplateProvider}
111:          */
112:         public Set<Template> provideTemplates(EObject owner, EReference reference,
113:                 EClassSelectionStrategy eClassSelectionStrategy) {
114:•                Map<EClass, EObject> descriptors = defaultNewElementStrategyProvider == null
115:                         ? Collections.<EClass, EObject> emptyMap()
116:                         : defaultNewElementStrategyProvider.getNewObjectsByDescriptors(owner, reference);
117:•                if (descriptors.isEmpty()) {
118:                         // Just create actually blank instances of all possible subtypes
119:                         descriptors = new HashMap<EClass, EObject>();
120:                         final Collection<EClass> subClasses = EMFUtils.getSubClasses(reference.getEReferenceType());
121:•                        for (final EClass subClass : subClasses) {
122:•                                if (!subClass.isAbstract() && !subClass.isInterface()) {
123:                                         descriptors.put(subClass, EcoreUtil.create(subClass));
124:                                 }
125:                         }
126:                 }
127:
128:                 final Collection<EClass> allowedEClasses = eClassSelectionStrategy.collectEClasses(owner, reference,
129:                         new LinkedHashSet<EClass>(descriptors.keySet()));
130:                 descriptors.keySet().retainAll(allowedEClasses);
131:                 final LinkedHashSet<Template> result = new LinkedHashSet<Template>();
132:•                for (final Map.Entry<EClass, EObject> next : descriptors.entrySet()) {
133:                         result.add(createTemplate(next.getKey(), next.getValue()));
134:                 }
135:                 return result;
136:         }
137:
138:         /**
139:          * Creates a blank template for the given type.
140:          *
141:          * @param type the type of the {@code instance} to wrap in a template
142:          * @param instance the instance of the template {@code type}
143:          * @return The blank {@link Template}
144:          */
145:         protected Template createTemplate(EClass type, EObject instance) {
146:                 final Template template = DataTemplateFactory.eINSTANCE.createTemplate();
147:                 template.setInstance(instance);
148:
149:                 final String nameTemplate = localizationService.getString(BlankTemplateProvider.class,
150:                         MessageKeys.BlankTemplateProvider_blankTemplateLabel);
151:                 template.setName(NLS.bind(nameTemplate, getDisplayName(type)));
152:
153:                 return template;
154:         }
155:
156:         /**
157:          * Set the {@link BundleResolver}.
158:          *
159:          * @param bundleResolver The {@link BundleResolver}
160:          */
161:         protected void setBundleResolver(BundleResolver bundleResolver) {
162:                 this.bundleResolver = bundleResolver;
163:         }
164:
165:         /**
166:          * Fetch the display name for the given {@link EClass}.
167:          *
168:          * @param type the {@link EClass} to get the display name for
169:          * @return the display name
170:          */
171:         protected String getDisplayName(EClass type) {
172:                 try {
173:                         final Bundle editBundle = bundleResolver.getEditBundle(type);
174:                         return localizationService.getString(editBundle, String.format("_UI_%s_type", type.getName())); //$NON-NLS-1$
175:                 } catch (final NoBundleFoundException ex) {
176:                         // Do nothing, the fall back of using the type's name will be used
177:                 }
178:
179:                 return type.getName();
180:
181:         }
182: }