Skip to content

Package: EMFFormsSpreadsheetExporterImpl$1

EMFFormsSpreadsheetExporterImpl$1

nameinstructionbranchcomplexitylinemethod
getViewModel(EObject, VViewModelProperties)
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
{...}
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
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.spreadsheet.core.transfer;
15:
16: import java.util.Collection;
17: import java.util.LinkedHashMap;
18: import java.util.LinkedHashSet;
19: import java.util.LinkedList;
20: import java.util.Map;
21: import java.util.Queue;
22: import java.util.Set;
23:
24: import org.apache.poi.hssf.usermodel.HSSFWorkbook;
25: import org.apache.poi.ss.usermodel.BuiltinFormats;
26: import org.apache.poi.ss.usermodel.CellStyle;
27: import org.apache.poi.ss.usermodel.DataFormat;
28: import org.apache.poi.ss.usermodel.Workbook;
29: import org.eclipse.emf.ecore.EAttribute;
30: import org.eclipse.emf.ecore.EClass;
31: import org.eclipse.emf.ecore.EObject;
32: import org.eclipse.emf.ecore.EReference;
33: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
34: import org.eclipse.emf.ecp.view.spi.model.VElement;
35: import org.eclipse.emf.ecp.view.spi.model.VView;
36: import org.eclipse.emf.ecp.view.spi.model.VViewModelProperties;
37: import org.eclipse.emf.ecp.view.spi.provider.ViewProviderHelper;
38: import org.eclipse.emfforms.internal.spreadsheet.core.EMFFormsSpreadsheetViewModelContext;
39: import org.eclipse.emfforms.internal.spreadsheet.core.converter.NumberFormatHelper;
40: import org.eclipse.emfforms.spi.common.report.ReportService;
41: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsAbstractSpreadsheetRenderer;
42: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsNoRendererException;
43: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsSpreadsheetRenderTarget;
44: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsSpreadsheetRendererFactory;
45: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsSpreadsheetReport;
46: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsCellStyleConstants;
47: import org.eclipse.emfforms.spi.spreadsheet.core.transfer.EMFFormsSpreadsheetExporter;
48: import org.osgi.framework.BundleContext;
49: import org.osgi.framework.FrameworkUtil;
50: import org.osgi.framework.ServiceReference;
51:
52: /**
53: * Implementation of the {@link EMFFormsSpreadsheetExporter}.
54: *
55: * @author Eugen Neufeld
56: */
57: public class EMFFormsSpreadsheetExporterImpl implements EMFFormsSpreadsheetExporter {
58:
59:         private final ReportService reportService;
60:         private final ViewProvider viewProvider;
61:
62:         /**
63:          * Default Constructor.
64:          */
65:         public EMFFormsSpreadsheetExporterImpl() {
66:                 this(new ViewProvider() {
67:                         @Override
68:                         public VView getViewModel(EObject viewEobject, VViewModelProperties properties) {
69:                                 return ViewProviderHelper.getView(viewEobject, properties);
70:                         }
71:                 });
72:         }
73:
74:         /**
75:          * Constructor which offers a way to influence the view model retrieval.
76:          *
77:          * @param viewProvider the provider which will be used to find the view model that will be rendered
78:          */
79:         public EMFFormsSpreadsheetExporterImpl(ViewProvider viewProvider) {
80:                 final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
81:                 final ServiceReference<ReportService> reportServiceReference = bundleContext
82:                         .getServiceReference(ReportService.class);
83:                 reportService = bundleContext.getService(reportServiceReference);
84:                 this.viewProvider = viewProvider;
85:
86:         }
87:
88:         @Override
89:         public Workbook render(final Collection<? extends EObject> domainObjects, EObject viewEobject,
90:                 VViewModelProperties properties) {
91:                 final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
92:                 final ServiceReference<EMFFormsSpreadsheetRendererFactory> serviceReference = bundleContext
93:                         .getServiceReference(EMFFormsSpreadsheetRendererFactory.class);
94:                 final EMFFormsSpreadsheetRendererFactory emfFormsSpreadsheetRendererFactory = bundleContext
95:                         .getService(serviceReference);
96:
97:                 final Workbook workbook = new HSSFWorkbook();
98:
99:                 final VView viewModel = viewProvider.getViewModel(viewEobject, properties);
100:                 if (viewModel == null) {
101:                         reportService.report(
102:                                 new EMFFormsSpreadsheetReport("No view model could be found for the given EObject/ViewModelProperties", //$NON-NLS-1$
103:                                         EMFFormsSpreadsheetReport.ERROR));
104:                         return workbook;
105:                 }
106:
107:                 // analyze and retrieve
108:                 final Set<String> retrievedFormats = retrieveAllFormats(viewModel.getRootEClass());
109:                 final Map<String, CellStyle> keyStyleMap = new LinkedHashMap<String, CellStyle>(retrievedFormats.size());
110:                 addDefaultCellStyles(workbook, keyStyleMap);
111:                 prepareNumberCellStyles(workbook, retrievedFormats, keyStyleMap);
112:                 if (domainObjects == null) {
113:                         try {
114:                                 final ViewModelContext viewModelContext = new EMFFormsSpreadsheetViewModelContext(viewModel, null);
115:                                 prepareViewContext(keyStyleMap, viewModelContext);
116:
117:                                 final EMFFormsAbstractSpreadsheetRenderer<VElement> renderer = emfFormsSpreadsheetRendererFactory
118:                                         .getRendererInstance(
119:                                                 viewModelContext.getViewModel(), viewModelContext);
120:                                 renderer.render(workbook, viewModelContext.getViewModel(), viewModelContext,
121:                                         new EMFFormsSpreadsheetRenderTarget("root", 0, 0)); //$NON-NLS-1$
122:                                 viewModelContext.dispose();
123:                         } catch (final EMFFormsNoRendererException ex) {
124:                                 reportService.report(new EMFFormsSpreadsheetReport(ex, EMFFormsSpreadsheetReport.ERROR));
125:                         }
126:                 } else {
127:                         int i = 0;
128:                         for (final EObject domainObject : domainObjects) {
129:                                 if (!viewModel.getRootEClass().isInstance(domainObject)) {
130:                                         reportService
131:                                                 .report(new EMFFormsSpreadsheetReport(
132:                                                         String
133:                                                                 .format(
134:                                                                         "The provided view %1$s doesn't fit for the passed EObject %2$s", viewModel, //$NON-NLS-1$
135:                                                                         domainObject),
136:                                                         EMFFormsSpreadsheetReport.ERROR));
137:                                         continue;
138:                                 }
139:                                 try {
140:                                         final ViewModelContext viewModelContext = new EMFFormsSpreadsheetViewModelContext(viewModel,
141:                                                 domainObject);
142:                                         prepareViewContext(keyStyleMap, viewModelContext);
143:                                         final EMFFormsAbstractSpreadsheetRenderer<VElement> renderer = emfFormsSpreadsheetRendererFactory
144:                                                 .getRendererInstance(
145:                                                         viewModelContext.getViewModel(), viewModelContext);
146:                                         renderer.render(workbook, viewModelContext.getViewModel(), viewModelContext,
147:                                                 new EMFFormsSpreadsheetRenderTarget("root", //$NON-NLS-1$
148:                                                         i++, 0));
149:                                         viewModelContext.dispose();
150:                                 } catch (final EMFFormsNoRendererException ex) {
151:                                         reportService.report(new EMFFormsSpreadsheetReport(ex, EMFFormsSpreadsheetReport.ERROR));
152:                                 }
153:                         }
154:                 }
155:                 return workbook;
156:         }
157:
158:         private void addDefaultCellStyles(Workbook workbook, Map<String, CellStyle> keyStyleMap) {
159:                 final CellStyle cellStyle = workbook.createCellStyle();
160:                 cellStyle.setLocked(true);
161:                 keyStyleMap.put(EMFFormsCellStyleConstants.LOCKED, cellStyle);
162:                 final CellStyle cellStyle2 = workbook.createCellStyle();
163:                 cellStyle2.setLocked(true);
164:                 cellStyle2.setWrapText(true);
165:                 keyStyleMap.put(EMFFormsCellStyleConstants.LOCKED_AND_WRAPPED, cellStyle2);
166:                 final CellStyle cellStyle3 = workbook.createCellStyle();
167:                 cellStyle3.setDataFormat((short) BuiltinFormats.getBuiltinFormat("text")); //$NON-NLS-1$
168:                 keyStyleMap.put(EMFFormsCellStyleConstants.TEXT, cellStyle3);
169:                 final CellStyle cellStyle4 = workbook.createCellStyle();
170:                 cellStyle4.setDataFormat((short) BuiltinFormats.getBuiltinFormat("m/d/yy")); //$NON-NLS-1$
171:                 keyStyleMap.put(EMFFormsCellStyleConstants.DATE, cellStyle4);
172:         }
173:
174:         private void prepareNumberCellStyles(Workbook workbook, Set<String> retrievedFormats,
175:                 Map<String, CellStyle> keyStyleMap) {
176:                 final DataFormat dataFormat = workbook.createDataFormat();
177:                 for (final String format : retrievedFormats) {
178:                         final CellStyle cellStyleNumberFormat = workbook.createCellStyle();
179:                         cellStyleNumberFormat.setDataFormat(dataFormat.getFormat(format));
180:                         keyStyleMap.put(format, cellStyleNumberFormat);
181:                 }
182:         }
183:
184:         private void prepareViewContext(Map<String, CellStyle> formatStyleMap, ViewModelContext viewModelContext) {
185:                 for (final String key : formatStyleMap.keySet()) {
186:                         viewModelContext.putContextValue(key, formatStyleMap.get(key));
187:                 }
188:         }
189:
190:         private Set<String> retrieveAllFormats(EClass eClass) {
191:                 final Set<String> formats = new LinkedHashSet<String>();
192:                 final Set<EClass> checkedClasses = new LinkedHashSet<EClass>();
193:                 final Queue<EClass> uncheckedClasses = new LinkedList<EClass>();
194:                 uncheckedClasses.add(eClass);
195:                 while (!uncheckedClasses.isEmpty()) {
196:                         retrieveAllFormats(uncheckedClasses.poll(), formats, checkedClasses, uncheckedClasses);
197:                 }
198:                 return formats;
199:         }
200:
201:         private void retrieveAllFormats(EClass eClass, Set<String> formats, Set<EClass> checkedClasses,
202:                 Queue<EClass> uncheckedClasses) {
203:                 if (checkedClasses.contains(eClass)) {
204:                         return;
205:                 }
206:                 for (final EReference eReference : eClass.getEAllReferences()) {
207:                         uncheckedClasses.offer(eReference.getEReferenceType());
208:                 }
209:                 for (final EAttribute eAttribute : eClass.getEAllAttributes()) {
210:                         final String format = NumberFormatHelper.getNumberFormat(eAttribute);
211:                         if (format == null) {
212:                                 continue;
213:                         }
214:                         formats.add(format);
215:                 }
216:                 checkedClasses.add(eClass);
217:         }
218:
219:         /**
220:          * Interface which encapsulates the call to get a viewmodel for EObject + properties.
221:          *
222:          * @author Johannes Faltermeier
223:          *
224:          */
225:         public interface ViewProvider {
226:
227:                 /**
228:                  * Returns the view model for the given EObject/properties.
229:                  *
230:                  * @param viewEobject the object
231:                  * @param properties the {@link VViewModelProperties properties}
232:                  * @return the view
233:                  */
234:                 VView getViewModel(EObject viewEobject, VViewModelProperties properties);
235:         }
236: }