Skip to content

Package: ViewProviderImpl

ViewProviderImpl

nameinstructionbranchcomplexitylinemethod
ViewProviderImpl()
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
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%
addProvider(IViewProvider)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getView(EObject, VViewModelProperties, Collection)
M: 5 C: 60
92%
M: 1 C: 11
92%
M: 1 C: 6
86%
M: 1 C: 17
94%
M: 0 C: 1
100%
loadClass(String, String)
M: 16 C: 9
36%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 2 C: 3
60%
M: 0 C: 1
100%
readViewProviders()
M: 55 C: 49
47%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 13 C: 13
50%
M: 0 C: 1
100%
removeProvider(IViewProvider)
M: 0 C: 11
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
report(AbstractReport)
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%
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: * Eugen Neufeld - initial API and implementation
13: * Edgar Mueller - refactorings
14: * Christian W. Damus - bug 547787
15: ******************************************************************************/
16: package org.eclipse.emf.ecp.view.internal.provider;
17:
18: import java.lang.reflect.Constructor;
19: import java.lang.reflect.InvocationTargetException;
20: import java.util.Collection;
21: import java.util.Set;
22: import java.util.concurrent.CopyOnWriteArraySet;
23:
24: import org.eclipse.core.runtime.IConfigurationElement;
25: import org.eclipse.core.runtime.Platform;
26: import org.eclipse.emf.ecore.EObject;
27: import org.eclipse.emf.ecp.view.spi.model.VView;
28: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
29: import org.eclipse.emf.ecp.view.spi.model.VViewModelProperties;
30: import org.eclipse.emf.ecp.view.spi.provider.EMFFormsFilteredViewService;
31: import org.eclipse.emf.ecp.view.spi.provider.EMFFormsViewService;
32: import org.eclipse.emf.ecp.view.spi.provider.IFilteredViewProvider;
33: import org.eclipse.emf.ecp.view.spi.provider.IViewProvider;
34: import org.eclipse.emf.ecp.view.spi.provider.reporting.NoViewProviderFoundReport;
35: import org.eclipse.emf.ecp.view.spi.provider.reporting.ViewModelIsNullReport;
36: import org.eclipse.emf.ecp.view.spi.provider.reporting.ViewProviderInitFailedReport;
37: import org.eclipse.emfforms.spi.common.report.AbstractReport;
38: import org.eclipse.emfforms.spi.common.report.ReportService;
39: import org.osgi.framework.Bundle;
40: import org.osgi.service.component.annotations.Activate;
41: import org.osgi.service.component.annotations.Component;
42: import org.osgi.service.component.annotations.Reference;
43: import org.osgi.service.component.annotations.ReferenceCardinality;
44: import org.osgi.service.component.annotations.ReferencePolicy;
45:
46: /**
47: * Implementation of the {@link EMFFormsViewService} which collects all known {@link IViewProvider} and finds the best
48: * fitting view.
49: *
50: * @author Eugen Neufeld
51: */
52: @Component(name = "EMFFormsViewService", service = { EMFFormsViewService.class, EMFFormsFilteredViewService.class })
53: public class ViewProviderImpl implements EMFFormsFilteredViewService {
54:
55:         private static final String CLASS_CANNOT_BE_RESOLVED = "%1$s cannot be loaded because bundle %2$s cannot be resolved."; //$NON-NLS-1$
56:         private static final String CLASS = "class"; //$NON-NLS-1$
57:         private static final String EXTENSION_POINT_ID = "org.eclipse.emf.ecp.ui.view.viewModelProviders"; //$NON-NLS-1$
58:         private final Set<IFilteredViewProvider> viewProviders = new CopyOnWriteArraySet<IFilteredViewProvider>();
59:         private ReportService reportService;
60:
61:         /**
62:          * Component activate method.
63:          */
64:         @Activate
65:         protected void activate() {
66:                 readViewProviders();
67:         }
68:
69:         private void readViewProviders() {
70:                 final IConfigurationElement[] controls = Platform.getExtensionRegistry()
71:                         .getConfigurationElementsFor(
72:                                 EXTENSION_POINT_ID);
73:
74:•                for (final IConfigurationElement e : controls) {
75:                         try {
76:                                 final String clazz = e.getAttribute(CLASS);
77:                                 final Class<? extends IViewProvider> resolvedClass = loadClass(e
78:                                         .getContributor().getName(), clazz);
79:                                 final Constructor<? extends IViewProvider> controlConstructor = resolvedClass
80:                                         .getConstructor();
81:                                 final IViewProvider viewProvider = controlConstructor.newInstance();
82:                                 viewProviders.add(FilteredViewProviderAdapter.adapt(viewProvider));
83:                         } catch (final ClassNotFoundException ex) {
84:                                 report(new ViewProviderInitFailedReport(ex));
85:                         } catch (final NoSuchMethodException ex) {
86:                                 report(new ViewProviderInitFailedReport(ex));
87:                         } catch (final SecurityException ex) {
88:                                 report(new ViewProviderInitFailedReport(ex));
89:                         } catch (final InstantiationException ex) {
90:                                 report(new ViewProviderInitFailedReport(ex));
91:                         } catch (final IllegalAccessException ex) {
92:                                 report(new ViewProviderInitFailedReport(ex));
93:                         } catch (final IllegalArgumentException ex) {
94:                                 report(new ViewProviderInitFailedReport(ex));
95:                         } catch (final InvocationTargetException ex) {
96:                                 report(new ViewProviderInitFailedReport(ex));
97:                         }
98:                 }
99:         }
100:
101:         private void report(AbstractReport reportEntity) {
102:                 reportService.report(reportEntity);
103:         }
104:
105:         @SuppressWarnings("unchecked")
106:         private static <T> Class<T> loadClass(String bundleName, String clazz)
107:                 throws ClassNotFoundException {
108:                 final Bundle bundle = Platform.getBundle(bundleName);
109:•                if (bundle == null) {
110:                         throw new ClassNotFoundException(String.format(
111:                                 CLASS_CANNOT_BE_RESOLVED, clazz, bundleName));
112:                 }
113:                 return (Class<T>) bundle.loadClass(clazz);
114:
115:         }
116:
117:         @Override
118:         public VView getView(EObject object, VViewModelProperties properties, Collection<String> requiredKeys) {
119:                 VView result = null;
120:
121:•                if (viewProviders.isEmpty()) {
122:                         report(new NoViewProviderFoundReport());
123:                         return result;
124:                 }
125:
126:                 double highestPrio = IViewProvider.NOT_APPLICABLE;
127:                 IFilteredViewProvider selectedProvider = null;
128:•                if (properties == null) {
129:                         properties = VViewFactory.eINSTANCE.createViewModelLoadingProperties();
130:                 }
131:
132:•                for (final IFilteredViewProvider viewProvider : viewProviders) {
133:                         final double prio = viewProvider.canProvideViewModel(object, properties, requiredKeys);
134:•                        if (prio > highestPrio) {
135:                                 highestPrio = prio;
136:                                 selectedProvider = viewProvider;
137:                         }
138:                 }
139:
140:•                if (selectedProvider != null) {
141:                         result = selectedProvider.provideViewModel(object, properties, requiredKeys);
142:•                        if (result == null) {
143:                                 report(new ViewModelIsNullReport());
144:                         }
145:                 }
146:
147:                 return result;
148:         }
149:
150:         @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
151:         @Override
152:         public void addProvider(IViewProvider viewProvider) {
153:                 viewProviders.add(FilteredViewProviderAdapter.adapt(viewProvider));
154:         }
155:
156:         @Override
157:         public void removeProvider(IViewProvider viewProvider) {
158:                 final IFilteredViewProvider filtered = FilteredViewProviderAdapter.adapt(viewProvider);
159:                 viewProviders.remove(filtered);
160:                 FilteredViewProviderAdapter.dispose(filtered);
161:         }
162:
163:         /**
164:          * Set the ReportService.
165:          *
166:          * @param reportService The {@link ReportService}
167:          */
168:         @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC, unbind = "-")
169:         protected void setReportService(ReportService reportService) {
170:                 this.reportService = reportService;
171:         }
172:
173: }