Skip to content

Package: EMFFormsLabelProviderImpl

EMFFormsLabelProviderImpl

nameinstructionbranchcomplexitylinemethod
EMFFormsLabelProviderImpl()
M: 0 C: 16
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
createDescriptionObservableValue(EStructuralFeature, Bundle)
M: 0 C: 27
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
getDescription(String, String, Bundle)
M: 0 C: 75
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 11
100%
M: 0 C: 1
100%
getDescription(VDomainModelReference)
M: 6 C: 62
91%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 1 C: 15
94%
M: 0 C: 1
100%
getDescription(VDomainModelReference, EClass)
M: 13 C: 38
75%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 2 C: 9
82%
M: 0 C: 1
100%
getDescription(VDomainModelReference, EObject)
M: 0 C: 51
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 11
100%
M: 0 C: 1
100%
getDisplayBundleKeyResultWrapper(EStructuralFeature)
M: 0 C: 38
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
getDisplayName(Bundle, String)
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%
getDisplayName(EStructuralFeature)
M: 8 C: 5
38%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 2 C: 1
33%
M: 0 C: 1
100%
getDisplayName(VDomainModelReference)
M: 6 C: 47
89%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 1 C: 11
92%
M: 0 C: 1
100%
getDisplayName(VDomainModelReference, EClass)
M: 0 C: 58
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 13
100%
M: 0 C: 1
100%
getDisplayName(VDomainModelReference, EObject)
M: 0 C: 14
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
getObservableValue(String)
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%
notifyLocaleChange()
M: 2 C: 67
97%
M: 2 C: 6
75%
M: 2 C: 3
60%
M: 2 C: 12
86%
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%
setEMFFormsDatabinding(EMFFormsDatabindingEMF)
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%
setEMFFormsLocaleProvider(EMFFormsLocaleProvider)
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
setEMFFormsLocalizationService(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%
setLabelProviderDefault(EMFFormsLabelProviderDefaultImpl)
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-2016 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: * Eugen Neufeld - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emfforms.internal.core.services.label;
15:
16: import java.text.MessageFormat;
17: import java.util.Map;
18: import java.util.Map.Entry;
19: import java.util.WeakHashMap;
20:
21: import org.eclipse.core.databinding.observable.value.IObservableValue;
22: import org.eclipse.core.databinding.observable.value.WritableValue;
23: import org.eclipse.core.databinding.property.value.IValueProperty;
24: import org.eclipse.emf.ecore.EClass;
25: import org.eclipse.emf.ecore.EObject;
26: import org.eclipse.emf.ecore.EStructuralFeature;
27: import org.eclipse.emf.ecp.common.spi.asserts.Assert;
28: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
29: import org.eclipse.emfforms.spi.common.BundleResolver;
30: import org.eclipse.emfforms.spi.common.BundleResolver.NoBundleFoundException;
31: import org.eclipse.emfforms.spi.common.BundleResolverFactory;
32: import org.eclipse.emfforms.spi.common.locale.EMFFormsLocaleChangeListener;
33: import org.eclipse.emfforms.spi.common.locale.EMFFormsLocaleProvider;
34: import org.eclipse.emfforms.spi.common.report.ReportService;
35: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
36: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedReport;
37: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
38: import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
39: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
40: import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
41: import org.eclipse.emfforms.spi.localization.EMFFormsLocalizationService;
42: import org.osgi.framework.Bundle;
43:
44: /**
45: * Implementation of {@link EMFFormsLabelProvider}. It provides a label service that delivers the display name and
46: * description for a domain model reference and optionally an EObject.
47: *
48: * @author Eugen Neufeld
49: *
50: */
51: public class EMFFormsLabelProviderImpl implements EMFFormsLabelProvider, EMFFormsLocaleChangeListener {
52:
53:         /**
54:          * Key for the map of description observables.
55:          *
56:          * @author Eugen Neufeld
57:          */
58:         private static class DescriptionKey {
59:                 private final String eClassName;
60:                 private final String featureName;
61:                 private final Bundle bundle;
62:
63:                 DescriptionKey(String eClassName, String featureName, Bundle bundle) {
64:                         super();
65:                         this.eClassName = eClassName;
66:                         this.featureName = featureName;
67:                         this.bundle = bundle;
68:                 }
69:
70:                 Bundle getBundle() {
71:                         return bundle;
72:                 }
73:
74:                 String geteClassName() {
75:                         return eClassName;
76:                 }
77:
78:                 String getFeatureName() {
79:                         return featureName;
80:                 }
81:
82:                 @Override
83:                 public int hashCode() {
84:                         final int prime = 31;
85:                         int result = 1;
86:                         result = prime * result + (bundle == null ? 0 : bundle.hashCode());
87:                         result = prime * result + (eClassName == null ? 0 : eClassName.hashCode());
88:                         result = prime * result + (featureName == null ? 0 : featureName.hashCode());
89:                         return result;
90:                 }
91:
92:                 // BEGIN COMPLEX CODE
93:                 // path complexity check does not take returns into account
94:                 @Override
95:                 public boolean equals(Object obj) {
96:                         if (this == obj) {
97:                                 return true;
98:                         }
99:                         if (obj == null) {
100:                                 return false;
101:                         }
102:                         if (!(obj instanceof DescriptionKey)) {
103:                                 return false;
104:                         }
105:                         final DescriptionKey other = (DescriptionKey) obj;
106:                         if (bundle == null) {
107:                                 if (other.bundle != null) {
108:                                         return false;
109:                                 }
110:                         } else if (!bundle.equals(other.bundle)) {
111:                                 return false;
112:                         }
113:                         if (eClassName == null) {
114:                                 if (other.eClassName != null) {
115:                                         return false;
116:                                 }
117:                         } else if (!eClassName.equals(other.eClassName)) {
118:                                 return false;
119:                         }
120:                         if (featureName == null) {
121:                                 if (other.featureName != null) {
122:                                         return false;
123:                                 }
124:                         } else if (!featureName.equals(other.featureName)) {
125:                                 return false;
126:                         }
127:                         return true;
128:                 }
129:                 // END COMPLEX CODE
130:         }
131:
132:         private static final String DISPLAY_NAME = "_UI_%1$s_%2$s_feature"; //$NON-NLS-1$
133:         private static final String DESCRIPTION = "_UI_%1$s_%2$s_description"; //$NON-NLS-1$
134:         private static final String DESCRIPTION_COMPOSITE = "_UI_PropertyDescriptor_description"; //$NON-NLS-1$
135:         private static final String TYPE = "_UI_%1$s_type"; //$NON-NLS-1$
136:
137:         private EMFFormsDatabindingEMF emfFormsDatabinding;
138:         private EMFFormsLocalizationService localizationService;
139:         private ReportService reportService;
140:         private BundleResolver bundleResolver = BundleResolverFactory.createBundleResolver();
141:
142:         private final Map<WritableValue, BundleKeyWrapper> displayKeyObservableMap = new WeakHashMap<WritableValue, BundleKeyWrapper>();
143:         private final Map<WritableValue, DescriptionKey> descriptionKeyObservableMap = new WeakHashMap<WritableValue, DescriptionKey>();
144:         private EMFFormsLocaleProvider localeProvider;
145:         private EMFFormsLabelProviderDefaultImpl labelProviderDefault;
146:
147:         /**
148:          * Sets the {@link ReportService} service.
149:          *
150:          * @param reportService The ReportService service.
151:          */
152:         protected void setReportService(ReportService reportService) {
153:                 this.reportService = reportService;
154:         }
155:
156:         /**
157:          * Sets the {@link EMFFormsDatabinding} service.
158:          *
159:          * @param emfFormsDatabinding The databinding service.
160:          */
161:         protected void setEMFFormsDatabinding(EMFFormsDatabindingEMF emfFormsDatabinding) {
162:                 this.emfFormsDatabinding = emfFormsDatabinding;
163:         }
164:
165:         /**
166:          * Sets the {@link EMFFormsLocalizationService}.
167:          *
168:          * @param localizationService The {@link EMFFormsLocalizationService}
169:          */
170:         protected void setEMFFormsLocalizationService(EMFFormsLocalizationService localizationService) {
171:                 this.localizationService = localizationService;
172:         }
173:
174:         /**
175:          * Sets the {@link EMFFormsLocaleProvider}.
176:          *
177:          * @param localeProvider The {@link EMFFormsLocaleProvider}
178:          */
179:         protected void setEMFFormsLocaleProvider(EMFFormsLocaleProvider localeProvider) {
180:                 this.localeProvider = localeProvider;
181:                 this.localeProvider.addEMFFormsLocaleChangeListener(this);
182:         }
183:
184:         /**
185:          * Sets the {@link BundleResolver}.
186:          *
187:          * @param bundleResolver The {@link BundleResolver}
188:          */
189:         protected void setBundleResolver(BundleResolver bundleResolver) {
190:                 this.bundleResolver = bundleResolver;
191:         }
192:
193:         /**
194:          * Sets the default {@link EMFFormsLabelProviderDefaultImpl}.
195:          *
196:          * @param labelProviderDefault the labelProviderDefault to set
197:          */
198:         protected void setLabelProviderDefault(EMFFormsLabelProviderDefaultImpl labelProviderDefault) {
199:                 this.labelProviderDefault = labelProviderDefault;
200:         }
201:
202:         private BundleKeyResultWrapper getDisplayBundleKeyResultWrapper(EStructuralFeature structuralFeature)
203:                 throws NoBundleFoundException {
204:                 final EClass eContainingClass = structuralFeature.getEContainingClass();
205:                 final Bundle bundle = bundleResolver.getEditBundle(eContainingClass);
206:                 final String key = String.format(DISPLAY_NAME, eContainingClass.getName(),
207:                         structuralFeature.getName());
208:                 final String displayName = getDisplayName(bundle, key);
209:                 return new BundleKeyResultWrapper(new BundleKeyWrapper(key, bundle), displayName);
210:         }
211:
212:         /**
213:          * Returns the display name of the {@link EStructuralFeature}.
214:          *
215:          * @param structuralFeature The {@link EStructuralFeature}
216:          * @return The localized feature name
217:          */
218:         public String getDisplayName(EStructuralFeature structuralFeature) {
219:                 try {
220:                         return getDisplayBundleKeyResultWrapper(structuralFeature).getResult();
221:                 } catch (final NoBundleFoundException ex) {
222:                         return (String) labelProviderDefault.getDisplayName(structuralFeature).getValue();
223:                 }
224:         }
225:
226:         @Deprecated
227:         @Override
228:         public IObservableValue getDisplayName(VDomainModelReference domainModelReference) throws NoLabelFoundException {
229:                 Assert.create(domainModelReference).notNull();
230:
231:                 IValueProperty valueProperty;
232:                 try {
233:                         valueProperty = emfFormsDatabinding.getValueProperty(domainModelReference, (EObject) null);
234:                 } catch (final DatabindingFailedException ex) {
235:                         reportService.report(new DatabindingFailedReport(ex));
236:                         throw new NoLabelFoundException(ex);
237:                 }
238:                 final EStructuralFeature structuralFeature = (EStructuralFeature) valueProperty.getValueType();
239:                 BundleKeyResultWrapper bundleKeyResultWrapper;
240:                 try {
241:                         bundleKeyResultWrapper = getDisplayBundleKeyResultWrapper(structuralFeature);
242:                 } catch (final NoBundleFoundException ex) {
243:                         return labelProviderDefault.getDisplayName(domainModelReference);
244:                 }
245:
246:                 final WritableValue value = getObservableValue(bundleKeyResultWrapper.getResult());
247:                 displayKeyObservableMap.put(value, bundleKeyResultWrapper.getBundleKeyWrapper());
248:                 return value;
249:         }
250:
251:         @Override
252:         public IObservableValue getDisplayName(VDomainModelReference domainModelReference, EClass rootEClass)
253:                 throws NoLabelFoundException {
254:                 Assert.create(domainModelReference).notNull();
255:                 Assert.create(rootEClass).notNull();
256:
257:                 IValueProperty valueProperty;
258:                 try {
259:                         valueProperty = emfFormsDatabinding.getValueProperty(domainModelReference, rootEClass);
260:                 } catch (final DatabindingFailedException ex) {
261:                         reportService.report(new DatabindingFailedReport(ex));
262:                         throw new NoLabelFoundException(ex);
263:                 }
264:                 final EStructuralFeature structuralFeature = (EStructuralFeature) valueProperty.getValueType();
265:
266:                 BundleKeyResultWrapper displayBundleKeyResultWrapper;
267:                 try {
268:                         displayBundleKeyResultWrapper = getDisplayBundleKeyResultWrapper(structuralFeature);
269:                 } catch (final NoBundleFoundException ex) {
270:                         return labelProviderDefault.getDisplayName(domainModelReference, rootEClass);
271:                 }
272:
273:                 final WritableValue displayObserveValue = getObservableValue(displayBundleKeyResultWrapper.getResult());
274:                 displayKeyObservableMap.put(displayObserveValue, displayBundleKeyResultWrapper.getBundleKeyWrapper());
275:                 return displayObserveValue;
276:         }
277:
278:         @Override
279:         public IObservableValue getDisplayName(VDomainModelReference domainModelReference, EObject rootObject)
280:                 throws NoLabelFoundException {
281:                 Assert.create(domainModelReference).notNull();
282:                 Assert.create(rootObject).notNull();
283:
284:                 return getDisplayName(domainModelReference, rootObject.eClass());
285:         }
286:
287:         @Deprecated
288:         @Override
289:         public IObservableValue getDescription(VDomainModelReference domainModelReference) throws NoLabelFoundException {
290:                 Assert.create(domainModelReference).notNull();
291:
292:                 IValueProperty valueProperty;
293:                 try {
294:                         valueProperty = emfFormsDatabinding.getValueProperty(domainModelReference, (EObject) null);
295:                 } catch (final DatabindingFailedException ex) {
296:                         reportService.report(new DatabindingFailedReport(ex));
297:                         throw new NoLabelFoundException(ex);
298:                 }
299:                 final EStructuralFeature structuralFeature = (EStructuralFeature) valueProperty.getValueType();
300:                 final EClass eContainingClass = structuralFeature.getEContainingClass();
301:                 Bundle bundle;
302:                 try {
303:                         bundle = bundleResolver.getEditBundle(eContainingClass);
304:                 } catch (final NoBundleFoundException ex) {
305:                         return labelProviderDefault.getDescription(domainModelReference);
306:                 }
307:                 final WritableValue writableValue = getObservableValue(getDescription(eContainingClass
308:                         .getName(),
309:                         structuralFeature.getName(), bundle));
310:                 descriptionKeyObservableMap.put(writableValue, new DescriptionKey(eContainingClass.getName(),
311:                         structuralFeature.getName(), bundle));
312:                 return writableValue;
313:         }
314:
315:         @Override
316:         public IObservableValue getDescription(VDomainModelReference domainModelReference, EClass rootEClass)
317:                 throws NoLabelFoundException {
318:                 Assert.create(domainModelReference).notNull();
319:                 Assert.create(rootEClass).notNull();
320:
321:                 IValueProperty valueProperty;
322:                 try {
323:                         valueProperty = emfFormsDatabinding.getValueProperty(domainModelReference, rootEClass);
324:                 } catch (final DatabindingFailedException ex) {
325:                         reportService.report(new DatabindingFailedReport(ex));
326:                         throw new NoLabelFoundException(ex);
327:                 }
328:                 final EStructuralFeature structuralFeature = (EStructuralFeature) valueProperty.getValueType();
329:                 Bundle bundle;
330:                 try {
331:                         bundle = bundleResolver.getEditBundle(structuralFeature.getEContainingClass());
332:                 } catch (final NoBundleFoundException ex) {
333:                         return labelProviderDefault.getDescription(domainModelReference, rootEClass);
334:                 }
335:                 return createDescriptionObservableValue(structuralFeature, bundle);
336:         }
337:
338:         @Override
339:         public IObservableValue getDescription(VDomainModelReference domainModelReference, EObject rootObject)
340:                 throws NoLabelFoundException {
341:                 Assert.create(domainModelReference).notNull();
342:                 Assert.create(rootObject).notNull();
343:
344:                 IValueProperty valueProperty;
345:                 try {
346:                         valueProperty = emfFormsDatabinding.getValueProperty(domainModelReference, rootObject);
347:                 } catch (final DatabindingFailedException ex) {
348:                         reportService.report(new DatabindingFailedReport(ex));
349:                         throw new NoLabelFoundException(ex);
350:                 }
351:                 final EStructuralFeature structuralFeature = (EStructuralFeature) valueProperty.getValueType();
352:                 Bundle bundle;
353:                 try {
354:                         bundle = bundleResolver.getEditBundle(structuralFeature.getEContainingClass());
355:                 } catch (final NoBundleFoundException ex) {
356:                         return labelProviderDefault.getDescription(domainModelReference, rootObject);
357:                 }
358:                 return createDescriptionObservableValue(structuralFeature, bundle);
359:         }
360:
361:         private IObservableValue createDescriptionObservableValue(final EStructuralFeature structuralFeature,
362:                 Bundle bundle) {
363:                 final WritableValue writableValue = getObservableValue(getDescription(structuralFeature.getEContainingClass()
364:                         .getName(), structuralFeature.getName(), bundle));
365:                 descriptionKeyObservableMap.put(writableValue,
366:                         new DescriptionKey(structuralFeature.getEContainingClass().getName(),
367:                                 structuralFeature.getName(), bundle));
368:                 return writableValue;
369:         }
370:
371:         private WritableValue getObservableValue(String value) {
372:                 return new WritableValue(value, String.class);
373:         }
374:
375:         private String getDisplayName(Bundle bundle, String key) {
376:                 return localizationService.getString(bundle, key);
377:         }
378:
379:         private String getDescription(String eClassName, String featureName, Bundle bundle) {
380:                 final String keyDefault = String.format(DESCRIPTION, eClassName, featureName);
381:•                if (localizationService.hasKey(bundle, keyDefault)) {
382:                         return localizationService.getString(bundle,
383:                                 keyDefault);
384:                 }
385:                 final String descriptionWithSubstitution = localizationService.getString(bundle,
386:                         DESCRIPTION_COMPOSITE);
387:                 final String key = String.format(DISPLAY_NAME, eClassName, featureName);
388:                 final String featureSubstitution = getDisplayName(bundle, key);
389:                 final String eObjectSubstitution = localizationService.getString(bundle,
390:                         String.format(TYPE, eClassName));
391:                 return MessageFormat.format(descriptionWithSubstitution, featureSubstitution, eObjectSubstitution);
392:         }
393:
394:         /**
395:          * {@inheritDoc}
396:          *
397:          * @see org.eclipse.emfforms.spi.common.locale.EMFFormsLocaleChangeListener#notifyLocaleChange()
398:          */
399:         @Override
400:         public void notifyLocaleChange() {
401:•                for (final Entry<WritableValue, BundleKeyWrapper> entry : displayKeyObservableMap.entrySet()) {
402:                         final WritableValue writableValue = entry.getKey();
403:•                        if (writableValue.isDisposed()) {
404:                                 continue;
405:                         }
406:                         final BundleKeyWrapper displayNameKey = entry.getValue();
407:                         writableValue.setValue(getDisplayName(displayNameKey.getBundle(), displayNameKey.getKey()));
408:                 }
409:•                for (final Entry<WritableValue, DescriptionKey> entry : descriptionKeyObservableMap.entrySet()) {
410:                         final WritableValue writableValue = entry.getKey();
411:•                        if (writableValue.isDisposed()) {
412:                                 continue;
413:                         }
414:                         final DescriptionKey descriptionKey = entry.getValue();
415:                         writableValue.setValue(getDescription(descriptionKey.geteClassName(), descriptionKey.getFeatureName(),
416:                                 descriptionKey.getBundle()));
417:                 }
418:         }
419: }