Skip to content

Package: EMFFormsRendererFactoryImpl

EMFFormsRendererFactoryImpl

nameinstructionbranchcomplexitylinemethod
EMFFormsRendererFactoryImpl()
M: 0 C: 13
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
addEMFFormsAdditionalRendererService(EMFFormsAdditionalRendererService)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
addEMFFormsRendererService(EMFFormsRendererService)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
clearRenderers()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
getAdditionalRendererInstances(VElement, ViewModelContext)
M: 0 C: 45
100%
M: 0 C: 6
100%
M: 0 C: 4
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
getRendererInstance(VElement, ViewModelContext)
M: 0 C: 86
100%
M: 0 C: 10
100%
M: 0 C: 6
100%
M: 0 C: 21
100%
M: 0 C: 1
100%
removeEMFFormsAdditionalRendererService(EMFFormsAdditionalRendererService)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
removeEMFFormsRendererService(EMFFormsRendererService)
M: 0 C: 6
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-2015 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.swt.core;
15:
16: import java.util.Collection;
17: import java.util.LinkedHashSet;
18: import java.util.Set;
19: import java.util.concurrent.CopyOnWriteArraySet;
20:
21: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
22: import org.eclipse.emf.ecp.view.spi.model.VElement;
23: import org.eclipse.emfforms.spi.swt.core.AbstractAdditionalSWTRenderer;
24: import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
25: import org.eclipse.emfforms.spi.swt.core.EMFFormsAdditionalRendererService;
26: import org.eclipse.emfforms.spi.swt.core.EMFFormsNoRendererException;
27: import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererFactory;
28: import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererService;
29:
30: /**
31: * The default implementation of the EMFFormsRendererFactory.
32: *
33: * @author Eugen Neufeld
34: *
35: */
36: public class EMFFormsRendererFactoryImpl implements EMFFormsRendererFactory {
37:
38:         private final Set<EMFFormsRendererService<VElement>> rendererServices = new CopyOnWriteArraySet<EMFFormsRendererService<VElement>>();
39:         private final Set<EMFFormsAdditionalRendererService<VElement>> additionalRendererServices = new CopyOnWriteArraySet<EMFFormsAdditionalRendererService<VElement>>();
40:
41:         /**
42:          * Called by the initializer to add an {@link EMFFormsRendererService}.
43:          *
44:          * @param rendererService The EMFFormsRendererService to add
45:          */
46:         public void addEMFFormsRendererService(EMFFormsRendererService<VElement> rendererService) {
47:                 rendererServices.add(rendererService);
48:         }
49:
50:         /**
51:          * Called by the initializer to remove an {@link EMFFormsRendererService}.
52:          *
53:          * @param rendererService The EMFFormsRendererService to remove
54:          */
55:         public void removeEMFFormsRendererService(EMFFormsRendererService<VElement> rendererService) {
56:                 rendererServices.remove(rendererService);
57:         }
58:
59:         /**
60:          * Called by the initializer to add an {@link EMFFormsAdditionalRendererService}.
61:          *
62:          * @param rendererService The EMFFormsAdditionalRendererService to add
63:          */
64:         protected void addEMFFormsAdditionalRendererService(EMFFormsAdditionalRendererService<VElement> rendererService) {
65:                 additionalRendererServices.add(rendererService);
66:         }
67:
68:         /**
69:          * Called by the initializer to remove an {@link EMFFormsAdditionalRendererService}.
70:          *
71:          * @param rendererService The EMFFormsAdditionalRendererService to remove
72:          */
73:         protected void removeEMFFormsAdditionalRendererService(
74:                 EMFFormsAdditionalRendererService<VElement> rendererService) {
75:                 additionalRendererServices.remove(rendererService);
76:         }
77:
78:         /**
79:          * {@inheritDoc}
80:          *
81:          * @throws EMFFormsNoRendererException
82:          *
83:          * @see EMFFormsRendererFactory#getRendererInstance(VElement,ViewModelContext)
84:          */
85:         @Override
86:         public <VELEMENT extends VElement> AbstractSWTRenderer<VElement> getRendererInstance(VELEMENT vElement,
87:                 ViewModelContext viewModelContext) throws EMFFormsNoRendererException {
88:•                if (rendererServices.isEmpty()) {
89:                         throw new EMFFormsNoRendererException("No EMFFormsRendererService available!"); //$NON-NLS-1$
90:                 }
91:                 double highestPriority = -1;
92:                 EMFFormsRendererService<VElement> bestService = null;
93:•                for (final EMFFormsRendererService<VElement> rendererService : rendererServices) {
94:                         final double priority = rendererService.isApplicable(vElement, viewModelContext);
95:•                        if (priority > highestPriority) {
96:                                 highestPriority = priority;
97:                                 bestService = rendererService;
98:                         }
99:                 }
100:•                if (bestService == null) {
101:                         throw new EMFFormsNoRendererException(String.format(
102:                                 "No fitting EMFFormsRendererService for %1$s available!", vElement.eClass().getName())); //$NON-NLS-1$
103:                 }
104:                 final AbstractSWTRenderer<VElement> rendererInstance = bestService.getRendererInstance(vElement,
105:                         viewModelContext);
106:•                if (rendererInstance == null) {
107:                         throw new EMFFormsNoRendererException(String.format(
108:                                 "No fitting EMFFormsRendererService for %1$s available!", vElement.eClass().getName())); //$NON-NLS-1$
109:                 }
110:                 try {
111:                         rendererInstance.init();
112:                         // BEGIN SUPRESS CATCH EXCEPTION
113:                 } catch (final RuntimeException e) {
114:                         throw new EMFFormsNoRendererException(e);
115:                 }
116:                 // END SUPRESS CATCH EXCEPTION
117:                 return rendererInstance;
118:         }
119:
120:         /**
121:          * {@inheritDoc}
122:          *
123:          * @see EMFFormsRendererFactory#getAdditionalRendererInstances(VElement, ViewModelContext)
124:          */
125:         @Override
126:         public Collection<AbstractAdditionalSWTRenderer<VElement>> getAdditionalRendererInstances(VElement vElement,
127:                 ViewModelContext viewModelContext) {
128:                 final Set<AbstractAdditionalSWTRenderer<VElement>> renderers = new LinkedHashSet<AbstractAdditionalSWTRenderer<VElement>>();
129:
130:•                for (final EMFFormsAdditionalRendererService<VElement> rendererService : additionalRendererServices) {
131:•                        if (rendererService.isApplicable(vElement, viewModelContext)) {
132:                                 final Collection<AbstractAdditionalSWTRenderer<VElement>> rendererInstances = rendererService
133:                                         .getRendererInstances(
134:                                                 vElement, viewModelContext);
135:•                                for (final AbstractAdditionalSWTRenderer<VElement> rendererInstance : rendererInstances) {
136:                                         rendererInstance.init();
137:                                         renderers.add(rendererInstance);
138:                                 }
139:                         }
140:                 }
141:
142:                 return renderers;
143:         }
144:
145:         /**
146:          * Method for Tests to clear all services.
147:          */
148:         public void clearRenderers() {
149:                 rendererServices.clear();
150:         }
151: }