Skip to content

Package: SWTRendererFactoryImpl

SWTRendererFactoryImpl

nameinstructionbranchcomplexitylinemethod
SWTRendererFactoryImpl()
M: 17 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 6 C: 0
0%
M: 1 C: 0
0%
createRenderer(VElement, ViewModelContext, ReportService, Class)
M: 78 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 16 C: 0
0%
M: 1 C: 0
0%
getAdditionalRenderer(VElement, ViewModelContext)
M: 47 C: 0
0%
M: 6 C: 0
0%
M: 4 C: 0
0%
M: 12 C: 0
0%
M: 1 C: 0
0%
getAdditionalRendererDescriptors()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getRenderer(VElement, ViewModelContext)
M: 108 C: 0
0%
M: 18 C: 0
0%
M: 10 C: 0
0%
M: 29 C: 0
0%
M: 1 C: 0
0%
getRendererDescriptors()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
loadClass(String, String)
M: 21 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
readAdditionalRenderer()
M: 85 C: 0
0%
M: 4 C: 0
0%
M: 3 C: 0
0%
M: 19 C: 0
0%
M: 1 C: 0
0%
readRenderer()
M: 142 C: 0
0%
M: 10 C: 0
0%
M: 6 C: 0
0%
M: 29 C: 0
0%
M: 1 C: 0
0%
report(AbstractReport)
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%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2014 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 - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.view.internal.swt;
15:
16: import java.lang.reflect.InvocationTargetException;
17: import java.util.Collection;
18: import java.util.LinkedHashSet;
19: import java.util.Set;
20:
21: import org.eclipse.core.runtime.CoreException;
22: import org.eclipse.core.runtime.IConfigurationElement;
23: import org.eclipse.core.runtime.IExtension;
24: import org.eclipse.core.runtime.IExtensionPoint;
25: import org.eclipse.core.runtime.InvalidRegistryObjectException;
26: import org.eclipse.core.runtime.Platform;
27: import org.eclipse.emf.ecp.view.model.common.ECPRendererTester;
28: import org.eclipse.emf.ecp.view.model.common.ECPStaticRendererTester;
29: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
30: import org.eclipse.emf.ecp.view.spi.model.VElement;
31: import org.eclipse.emf.ecp.view.spi.model.util.ViewModelUtil;
32: import org.eclipse.emf.ecp.view.spi.swt.ECPAdditionalRendererTester;
33: import org.eclipse.emf.ecp.view.spi.swt.SWTRendererFactory;
34: import org.eclipse.emf.ecp.view.spi.swt.UnknownVElementSWTRenderer;
35: import org.eclipse.emf.ecp.view.spi.swt.reporting.AmbiguousRendererPriorityReport;
36: import org.eclipse.emf.ecp.view.spi.swt.reporting.ECPRendererDescriptionInitFailedReport;
37: import org.eclipse.emf.ecp.view.spi.swt.reporting.NoRendererFoundReport;
38: import org.eclipse.emf.ecp.view.spi.swt.reporting.RendererInitFailedReport;
39: import org.eclipse.emfforms.spi.common.report.AbstractReport;
40: import org.eclipse.emfforms.spi.common.report.ReportService;
41: import org.eclipse.emfforms.spi.swt.core.AbstractAdditionalSWTRenderer;
42: import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
43: import org.osgi.framework.Bundle;
44:
45: /**
46: * @author Eugen
47: *
48: */
49: @Deprecated
50: public class SWTRendererFactoryImpl implements SWTRendererFactory {
51:
52:         private static final String TEST_DYNAMIC = "dynamicTest";//$NON-NLS-1$
53:         private static final String TEST_STATIC = "staticTest";//$NON-NLS-1$
54:         private static final String TESTER_PRIORITY = "priority";//$NON-NLS-1$
55:         private static final String TESTER_VELEMENT = "element"; //$NON-NLS-1$
56:         private static final String RENDERER_TESTER = "testClass"; //$NON-NLS-1$
57:
58:         private static final String RENDER_EXTENSION = "org.eclipse.emf.ecp.ui.view.swt.renderers"; //$NON-NLS-1$
59:         private static final String ADDITIONAL_RENDER_EXTENSION = "org.eclipse.emf.ecp.ui.view.swt.additionalRenderers"; //$NON-NLS-1$
60:         // private final Map<Class<? extends VElement>, AbstractSWTRenderer<VElement>> rendererMapping = new
61:         // LinkedHashMap<Class<? extends VElement>, AbstractSWTRenderer<VElement>>();
62:
63:         /**
64:          * A description of all available renderers.
65:          */
66:         private final Set<ECPRendererDescription> rendererDescriptors = new LinkedHashSet<ECPRendererDescription>();
67:
68:         /**
69:          * A description of all additionally available renderers.
70:          */
71:         private final Set<ECPAdditionalRendererDescription> additionalRendererDescriptors = new LinkedHashSet<ECPAdditionalRendererDescription>();
72:
73:         /**
74:          * Default constructor for the renderer factory.
75:          */
76:         public SWTRendererFactoryImpl() {
77:                 readRenderer();
78:                 readAdditionalRenderer();
79:         }
80:
81:         /**
82:          * Returns a set of descriptions of all additionally available renderers.
83:          *
84:          * @return a set of descriptions of all additionally available renderers.
85:          */
86:         protected Set<ECPAdditionalRendererDescription> getAdditionalRendererDescriptors() {
87:                 return additionalRendererDescriptors;
88:         }
89:
90:         /**
91:          * Returns a set of descriptions of all available renderers.
92:          *
93:          * @return a set of descriptions of all available renderers.
94:          */
95:         protected Set<ECPRendererDescription> getRendererDescriptors() {
96:                 return rendererDescriptors;
97:         }
98:
99:         private void readRenderer() {
100:                 final IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
101:                         .getExtensionPoint(RENDER_EXTENSION);
102:•                for (final IExtension extension : extensionPoint.getExtensions()) {
103:
104:•                        for (final IConfigurationElement configurationElement : extension
105:                                 .getConfigurationElements()) {
106:                                 try {
107:                                         final Class<AbstractSWTRenderer<VElement>> renderer = loadClass(configurationElement
108:                                                 .getContributor().getName(),
109:                                                 configurationElement
110:                                                         .getAttribute("renderer")); //$NON-NLS-1$
111:
112:                                         final Set<ECPRendererTester> tester = new LinkedHashSet<ECPRendererTester>();
113:•                                        for (final IConfigurationElement testerExtension : configurationElement.getChildren()) {
114:•                                                if (TEST_DYNAMIC.equals(testerExtension.getName())) {
115:                                                         tester.add((ECPRendererTester) testerExtension.createExecutableExtension(RENDERER_TESTER));
116:•                                                } else if (TEST_STATIC.equals(testerExtension.getName())) {
117:
118:                                                         final int priority = Integer.parseInt(testerExtension.getAttribute(TESTER_PRIORITY));
119:
120:                                                         final String vElement = testerExtension.getAttribute(TESTER_VELEMENT);
121:                                                         final Class<? extends VElement> supportedEObject = loadClass(testerExtension
122:                                                                 .getContributor()
123:                                                                 .getName(), vElement);
124:
125:                                                         tester.add(new ECPStaticRendererTester(priority,
126:                                                                 supportedEObject));
127:                                                 }
128:                                         }
129:
130:                                         rendererDescriptors.add(new ECPRendererDescription(renderer, tester));
131:                                 } catch (final CoreException ex) {
132:                                         report(new ECPRendererDescriptionInitFailedReport(ex));
133:                                 } catch (final ClassNotFoundException ex) {
134:                                         report(new ECPRendererDescriptionInitFailedReport(ex));
135:                                 } catch (final InvalidRegistryObjectException ex) {
136:                                         report(new ECPRendererDescriptionInitFailedReport(ex));
137:                                 }
138:                         }
139:                 }
140:         }
141:
142:         private void readAdditionalRenderer() {
143:                 final IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
144:                         .getExtensionPoint(ADDITIONAL_RENDER_EXTENSION);
145:
146:•                for (final IExtension extension : extensionPoint.getExtensions()) {
147:
148:•                        for (final IConfigurationElement configurationElement : extension
149:                                 .getConfigurationElements()) {
150:                                 try {
151:                                         final Class<AbstractAdditionalSWTRenderer<VElement>> renderer = loadClass(configurationElement
152:                                                 .getContributor().getName(),
153:                                                 configurationElement
154:                                                         .getAttribute("renderer")); //$NON-NLS-1$
155:                                         final ECPAdditionalRendererTester tester = (ECPAdditionalRendererTester) configurationElement
156:                                                 .createExecutableExtension("tester"); //$NON-NLS-1$
157:                                         // final Set<ECPAdditionalRendererTester> tester = new LinkedHashSet<ECPAdditionalRendererTester>();
158:                                         // final IConfigurationElement testerExtension = configurationElement.getChildren(TEST_DYNAMIC)[0];
159:                                         // only dynamic tester allowed
160:                                         // tester
161:                                         // .add((ECPAdditionalRendererTester) testerExtension.createExecutableExtension(RENDERER_TESTER));
162:
163:                                         additionalRendererDescriptors.add(new ECPAdditionalRendererDescription(renderer, tester));
164:                                 } catch (final CoreException ex) {
165:                                         report(new ECPRendererDescriptionInitFailedReport(ex));
166:                                 } catch (final ClassNotFoundException e) {
167:                                         report(new ECPRendererDescriptionInitFailedReport(e));
168:                                 } catch (final InvalidRegistryObjectException e) {
169:                                         report(new ECPRendererDescriptionInitFailedReport(e));
170:                                 }
171:                         }
172:                 }
173:         }
174:
175:         private void report(AbstractReport reportEntity) {
176:                 Activator.getDefault().getReportService().report(reportEntity);
177:         }
178:
179:         @SuppressWarnings("unchecked")
180:         private static <T> Class<T> loadClass(String bundleName, String clazz)
181:                 throws ClassNotFoundException {
182:                 final Bundle bundle = Platform.getBundle(bundleName);
183:•                if (bundle == null) {
184:                         throw new ClassNotFoundException(clazz + bundleName);
185:                 }
186:                 return (Class<T>) bundle.loadClass(clazz);
187:
188:         }
189:
190:         // /**
191:         // * Searches for a fitting renderer and then renders the passed {@link VElement}.
192:         // *
193:         // * @param parent the {@link Composite} to render on
194:         // * @param viewContext the {@link ViewModelContext} to use
195:         // * @param vElement the {@link VElement} to render
196:         // * @return the list for {@link RenderingResultRow} which can be empty if no fitting render could be found
197:         // * @throws NoPropertyDescriptorFoundExeption is thrown when the binded domain object does not have a property
198:         // * descriptor
199:         // * @throws NoRendererFoundException is thrown when no renderer could be found
200:         // */
201:         // public List<RenderingResultRow<Control>> render(Composite parent,
202:         // VElement vElement, ViewModelContext viewContext) throws NoRendererFoundException,
203:         // NoPropertyDescriptorFoundExeption {
204:         //
205:         // final AbstractSWTRenderer<VElement> renderer = getRenderer(vElement, viewContext);
206:         // if (renderer == null) {
207:         // throw new NoRendererFoundException(vElement);
208:         // }
209:         // return renderer.render(parent, vElement, viewContext);
210:         // }
211:         /**
212:          * {@inheritDoc}
213:          *
214:          * @see SWTRendererFactory#getRenderer(VElement, ViewModelContext)
215:          **/
216:         @Override
217:         public AbstractSWTRenderer<VElement> getRenderer(VElement vElement, ViewModelContext viewContext) {
218:
219:                 int highestPriority = -1;
220:                 AbstractSWTRenderer<VElement> bestCandidate = null;
221:                 final ReportService reportService = Activator.getDefault().getReportService();
222:
223:•                for (final ECPRendererDescription description : rendererDescriptors) {
224:
225:                         int currentPriority = -1;
226:
227:•                        for (final ECPRendererTester tester : description.getTester()) {
228:                                 final int testerPriority = tester.isApplicable(vElement, viewContext);
229:•                                if (testerPriority > currentPriority) {
230:                                         currentPriority = testerPriority;
231:                                 }
232:
233:                         }
234:
235:•                        if (currentPriority == highestPriority && highestPriority != -1) {
236:                                 reportService.report(
237:                                         new AmbiguousRendererPriorityReport(
238:                                                 currentPriority,
239:                                                 description.getRenderer().getClass().getCanonicalName(),
240:                                                 bestCandidate.getClass().getCanonicalName()));
241:                         }
242:
243:•                        if (currentPriority > highestPriority) {
244:                                 highestPriority = currentPriority;
245:                                 final AbstractSWTRenderer<VElement> renderer = createRenderer(vElement, viewContext, reportService,
246:                                         description.getRenderer());
247:•                                if (renderer != null) {
248:                                         bestCandidate = renderer;
249:
250:                                 }
251:                         }
252:                 }
253:
254:•                if (bestCandidate == null) {
255:                         reportService.report(new NoRendererFoundReport(vElement));
256:•                        if (ViewModelUtil.isDebugMode()) {
257:                                 bestCandidate = new UnknownVElementSWTRenderer(vElement, viewContext, reportService);
258:                         } else {
259:                                 bestCandidate = new EmptyVElementSWTRenderer(vElement, viewContext, reportService);
260:                         }
261:                 }
262:
263:                 bestCandidate.init();
264:
265:                 return bestCandidate;
266:         }
267:
268:         private AbstractSWTRenderer<VElement> createRenderer(VElement vElement, ViewModelContext viewContext,
269:                 final ReportService reportService,
270:                 final Class<? extends AbstractSWTRenderer<VElement>> rendererClass) {
271:                 try {
272:                         return rendererClass
273:                                 .getConstructor(vElement.getClass().getInterfaces()[0], ViewModelContext.class)
274:                                 .newInstance(vElement, viewContext);
275:                 } catch (final InstantiationException ex) {
276:                         reportService.report(new RendererInitFailedReport(ex));
277:                 } catch (final IllegalAccessException ex) {
278:                         reportService.report(new RendererInitFailedReport(ex));
279:                 } catch (final IllegalArgumentException ex) {
280:                         reportService.report(new RendererInitFailedReport(ex));
281:                 } catch (final InvocationTargetException ex) {
282:                         reportService.report(new RendererInitFailedReport(ex));
283:                 } catch (final NoSuchMethodException ex) {
284:                         reportService.report(new RendererInitFailedReport(ex));
285:                 } catch (final SecurityException ex) {
286:                         reportService.report(new RendererInitFailedReport(ex));
287:                 }
288:                 // TODO: Throw Exception
289:                 return null;
290:         }
291:
292:         /**
293:          *
294:          * {@inheritDoc}
295:          *
296:          * @see SWTRendererFactory#getAdditionalRenderer(org.eclipse.emf.ecp.view.spi.model.VElement,
297:          * org.eclipse.emf.ecp.view.spi.context.ViewModelContext)
298:          */
299:         @Override
300:         public Collection<AbstractAdditionalSWTRenderer<VElement>> getAdditionalRenderer(VElement vElement,
301:                 ViewModelContext viewModelContext) {
302:
303:                 final ReportService reportService = Activator.getDefault().getReportService();
304:                 final Set<AbstractAdditionalSWTRenderer<VElement>> renderers = new LinkedHashSet<AbstractAdditionalSWTRenderer<VElement>>();
305:
306:•                for (final ECPAdditionalRendererDescription description : additionalRendererDescriptors) {
307:                         final ECPAdditionalRendererTester tester = description.getTester();
308:•                        if (tester.isApplicable(vElement, viewModelContext)) {
309:                                 final AbstractSWTRenderer<VElement> renderer = createRenderer(vElement, viewModelContext,
310:                                         reportService, description.getRenderer());
311:•                                if (renderer == null) {
312:                                         continue;
313:                                 }
314:                                 renderer.init();
315:                                 renderers.add((AbstractAdditionalSWTRenderer<VElement>) renderer);
316:                         }
317:                 }
318:                 return renderers;
319:         }
320: }