Skip to content

Package: EMFFormsSpreadsheetMultiAttributeConverter

EMFFormsSpreadsheetMultiAttributeConverter

nameinstructionbranchcomplexitylinemethod
EMFFormsSpreadsheetMultiAttributeConverter()
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%
getCellValue(Cell, EStructuralFeature)
M: 54 C: 60
53%
M: 2 C: 6
75%
M: 2 C: 3
60%
M: 9 C: 13
59%
M: 0 C: 1
100%
isApplicable(EObject, VDomainModelReference)
M: 0 C: 25
100%
M: 0 C: 6
100%
M: 0 C: 4
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
isDecimalNumber(Class)
M: 0 C: 22
100%
M: 4 C: 6
60%
M: 4 C: 2
33%
M: 0 C: 5
100%
M: 0 C: 1
100%
setCellValue(Cell, Object, EStructuralFeature, ViewModelContext)
M: 0 C: 66
100%
M: 0 C: 6
100%
M: 0 C: 4
100%
M: 0 C: 14
100%
M: 0 C: 1
100%
setDatabinding(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: 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-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: * Johannes Faltermeier - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emfforms.internal.spreadsheet.core.converter;
15:
16: import java.math.BigDecimal;
17: import java.text.DecimalFormatSymbols;
18: import java.text.MessageFormat;
19: import java.util.ArrayList;
20: import java.util.Collections;
21: import java.util.List;
22:
23: import org.apache.poi.ss.usermodel.Cell;
24: import org.apache.poi.ss.usermodel.CellStyle;
25: import org.eclipse.emf.ecore.EAttribute;
26: import org.eclipse.emf.ecore.EDataType;
27: import org.eclipse.emf.ecore.EFactory;
28: import org.eclipse.emf.ecore.EObject;
29: import org.eclipse.emf.ecore.EStructuralFeature;
30: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
31: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
32: import org.eclipse.emfforms.spi.common.locale.EMFFormsLocaleProvider;
33: import org.eclipse.emfforms.spi.common.report.ReportService;
34: import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
35: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsCellStyleConstants;
36: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsConverterException;
37: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsSpreadsheetValueConverter;
38: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsSpreadsheetValueConverterHelper;
39: import org.osgi.service.component.annotations.Component;
40: import org.osgi.service.component.annotations.Reference;
41: import org.osgi.service.component.annotations.ReferenceCardinality;
42:
43: /**
44: * {@link EMFFormsSpreadsheetValueConverter Converter} for multi {@link EAttribute attributes}.
45: *
46: * @author Johannes Faltermeier
47: *
48: */
49: @Component(name = "EMFFormsSpreadsheetMultiAttributeConverter")
50: public class EMFFormsSpreadsheetMultiAttributeConverter implements EMFFormsSpreadsheetValueConverter {
51:
52:         private static final String SEPARATOR = " "; //$NON-NLS-1$
53:
54:         private EMFFormsDatabindingEMF databinding;
55:         private ReportService reportService;
56:
57:         private EMFFormsLocaleProvider localeProvider;
58:
59:         /**
60:          * Sets the databinding service.
61:          *
62:          * @param databinding the service
63:          */
64:         @Reference(cardinality = ReferenceCardinality.MANDATORY, unbind = "-")
65:         public void setDatabinding(EMFFormsDatabindingEMF databinding) {
66:                 this.databinding = databinding;
67:         }
68:
69:         /**
70:          * Sets the EMFFormsLocaleProvider service.
71:          *
72:          * @param localeProvider the service
73:          */
74:         @Reference(cardinality = ReferenceCardinality.MANDATORY, unbind = "-")
75:         protected void setEMFFormsLocaleProvider(EMFFormsLocaleProvider localeProvider) {
76:                 this.localeProvider = localeProvider;
77:         }
78:
79:         /**
80:          * Sets the report service.
81:          *
82:          * @param reportService the service
83:          */
84:         @Reference(cardinality = ReferenceCardinality.MANDATORY, unbind = "-")
85:         public void setReportService(ReportService reportService) {
86:                 this.reportService = reportService;
87:         }
88:
89:         @Override
90:         public double isApplicable(EObject domainObject, VDomainModelReference dmr) {
91:                 final EStructuralFeature feature = EMFFormsSpreadsheetValueConverterHelper.getFeature(domainObject, dmr,
92:                         databinding,
93:                         reportService);
94:•                if (feature == null) {
95:                         return NOT_APPLICABLE;
96:                 }
97:•                if (!EAttribute.class.isInstance(feature)) {
98:                         return NOT_APPLICABLE;
99:                 }
100:•                if (!feature.isMany()) {
101:                         return NOT_APPLICABLE;
102:                 }
103:                 return 0d;
104:         }
105:
106:         /**
107:          * {@inheritDoc}
108:          *
109:          * @see org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsSpreadsheetValueConverter#setCellValue(org.apache.poi.ss.usermodel.Cell,
110:          * java.lang.Object, org.eclipse.emf.ecore.EStructuralFeature,
111:          * org.eclipse.emf.ecp.view.spi.context.ViewModelContext)
112:          */
113:         @Override
114:         public void setCellValue(Cell cell, Object fromObject, EStructuralFeature eStructuralFeature,
115:                 ViewModelContext viewModelContext)
116:                 throws EMFFormsConverterException {
117:                 final EDataType eDataType = EAttribute.class.cast(eStructuralFeature).getEAttributeType();
118:                 final EFactory eFactory = eDataType.getEPackage().getEFactoryInstance();
119:                 final StringBuilder result = new StringBuilder();
120:•                for (final Object value : (List<?>) fromObject) {
121:•                        if (result.length() != 0) {
122:                                 result.append(SEPARATOR);
123:                         }
124:                         result.append(eFactory.convertToString(eDataType, value));
125:                 }
126:                 String valueString = result.toString();
127:•                if (isDecimalNumber(eDataType.getInstanceClass())) {
128:                         valueString = valueString.replace('.',
129:                                 DecimalFormatSymbols.getInstance(localeProvider.getLocale()).getDecimalSeparator());
130:                 }
131:                 cell.setCellValue(valueString);
132:                 cell.setCellStyle((CellStyle) viewModelContext.getContextValue(EMFFormsCellStyleConstants.TEXT));
133:         }
134:
135:         private boolean isDecimalNumber(final Class<?> clazz) {
136:•                return Double.TYPE == clazz
137:•                        || Double.class.isAssignableFrom(clazz)
138:•                        || Float.TYPE == clazz
139:•                        || Float.class.isAssignableFrom(clazz)
140:•                        || BigDecimal.class.isAssignableFrom(clazz);
141:         }
142:
143:         /**
144:          * {@inheritDoc}
145:          *
146:          * @see org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsSpreadsheetValueConverter#getCellValue(org.apache.poi.ss.usermodel.Cell,
147:          * org.eclipse.emf.ecore.EStructuralFeature)
148:          */
149:         @Override
150:         public Object getCellValue(Cell cell, EStructuralFeature eStructuralFeature) throws EMFFormsConverterException {
151:                 String string;
152:                 try {
153:                         string = cell.getStringCellValue();
154:                 } catch (final IllegalStateException e) {
155:                         throw new EMFFormsConverterException(
156:                                 String.format("Cell value of column %1$s in row %2$s on sheet %3$s must be a string.", //$NON-NLS-1$
157:                                         cell.getColumnIndex() + 1, cell.getRowIndex() + 1, cell.getSheet().getSheetName()),
158:                                 e);
159:                 }
160:
161:•                if (string == null || string.length() == 0) {
162:                         return Collections.emptyList();
163:                 }
164:                 final EAttribute eAttribute = EAttribute.class.cast(eStructuralFeature);
165:                 final EDataType eDataType = eAttribute.getEAttributeType();
166:•                if (isDecimalNumber(eDataType.getInstanceClass())) {
167:                         string = string.replace(DecimalFormatSymbols.getInstance(localeProvider.getLocale()).getDecimalSeparator(),
168:                                 '.');
169:                 }
170:
171:                 final List<Object> result = new ArrayList<Object>();
172:                 final EFactory eFactory = eDataType.getEPackage().getEFactoryInstance();
173:•                for (final String element : string.split(SEPARATOR)) {
174:                         try {
175:                                 result.add(eFactory.createFromString(eDataType, element));
176:                         } // BEGIN SUPRESS CATCH EXCEPTION
177:                         catch (final RuntimeException ex) {// END SUPRESS CATCH EXCEPTION
178:                                 throw new EMFFormsConverterException(
179:                                         MessageFormat.format("The cell value {0} could not converted to a model value.", string)); //$NON-NLS-1$
180:                         }
181:                 }
182:
183:                 return result;
184:         }
185:
186: }