Skip to content

Package: CompareControls

CompareControls

nameinstructionbranchcomplexitylinemethod
areEqual(VControl, EObject, VControl, EObject)
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%
areEqual(VDomainModelReference, EObject, VDomainModelReference, EObject)
M: 10 C: 51
84%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 2 C: 14
88%
M: 0 C: 1
100%
areValuesEqual(Object, EStructuralFeature, Object, EStructuralFeature)
M: 0 C: 48
100%
M: 0 C: 18
100%
M: 0 C: 10
100%
M: 0 C: 12
100%
M: 0 C: 1
100%
isMultiReference(EStructuralFeature)
M: 0 C: 12
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
isSingleReferences(EStructuralFeature)
M: 0 C: 12
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 2
100%
M: 0 C: 1
100%

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.diffmerge.internal.context;
15:
16: import java.util.List;
17:
18: import org.eclipse.core.databinding.observable.IObserving;
19: import org.eclipse.core.databinding.observable.value.IObservableValue;
20: import org.eclipse.emf.ecore.EObject;
21: import org.eclipse.emf.ecore.EStructuralFeature;
22: import org.eclipse.emf.ecore.EcorePackage;
23: import org.eclipse.emf.ecore.util.EcoreUtil;
24: import org.eclipse.emf.ecp.view.spi.model.VControl;
25: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
26: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
27: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedReport;
28:
29: /**
30: * Class to compare Controls for equality.
31: *
32: * @author Eugen Neufeld
33: *
34: */
35: public final class CompareControls {
36:
37:         private CompareControls() {
38:         }
39:
40:         /**
41:          * Compares to {@link VControl VControls}. This is just a convenience method which delegates to
42:          * {@link #areEqual(VDomainModelReference,EObject, VDomainModelReference,EObject)}.
43:          *
44:          * @param left the first VControl to compare
45:          * @param leftDomainModel The domain model of the left VControl
46:          * @param right the second VControl to compare
47:          * @param rightDomainModel The domain model of the right VControl
48:          * @return true if all values of the {@link VDomainModelReference VDomainModelReferences} are equal
49:          */
50:         public static boolean areEqual(VControl left, EObject leftDomainModel, VControl right, EObject rightDomainModel) {
51:                 return areEqual(left.getDomainModelReference(), leftDomainModel, right.getDomainModelReference(),
52:                         rightDomainModel);
53:         }
54:
55:         /**
56:          * Compares to {@link VDomainModelReference VDomainModelReferences} by comparing all values.
57:          *
58:          * @param left the first {@link VDomainModelReference}
59:          * @param leftDomainModel The domain model of the left VControl
60:          * @param right the second {@link VDomainModelReference}
61:          * @param rightDomainModel The domain model of the right VControl
62:          * @return true if all values of the {@link VDomainModelReference VDomainModelReferences} are equal
63:          */
64:         public static boolean areEqual(VDomainModelReference left, EObject leftDomainModel, VDomainModelReference right,
65:                 EObject rightDomainModel) {
66:                 @SuppressWarnings("rawtypes")
67:                 IObservableValue leftObservableValue;
68:                 @SuppressWarnings("rawtypes")
69:                 IObservableValue rightObservableValue;
70:
71:                 try {
72:                         leftObservableValue = Activator.getDefault().getEMFFormsDatabinding()
73:                                 .getObservableValue(left, leftDomainModel);
74:                         rightObservableValue = Activator.getDefault().getEMFFormsDatabinding()
75:                                 .getObservableValue(right, rightDomainModel);
76:                 } catch (final DatabindingFailedException ex) {
77:                         Activator.getDefault().getReportService().report(new DatabindingFailedReport(ex));
78:                         return false;
79:                 }
80:                 final EObject leftEObject = (EObject) ((IObserving) leftObservableValue).getObserved();
81:                 final EStructuralFeature leftStructuralFeature = (EStructuralFeature) leftObservableValue.getValueType();
82:                 final EObject rightEObject = (EObject) ((IObserving) rightObservableValue).getObserved();
83:                 final EStructuralFeature rightStructuralFeature = (EStructuralFeature) rightObservableValue.getValueType();
84:
85:                 leftObservableValue.dispose();
86:                 rightObservableValue.dispose();
87:
88:                 final Object leftValue = leftEObject.eGet(leftStructuralFeature, true);
89:                 final Object rightValue = rightEObject.eGet(rightStructuralFeature, true);
90:
91:                 return areValuesEqual(leftValue, leftStructuralFeature, rightValue, rightStructuralFeature);
92:         }
93:
94:         /**
95:          * Compares two {@link EStructuralFeature EStructuralFeatures} and their values.
96:          * If both are null, they are equal. For a single reference, the referenced EObjects are compare (equals). For a
97:          * "many" references, a list entries are compared.
98:          *
99:          * @param leftValue the value of the left {@link EStructuralFeature}
100:          * @param leftStructuralFeature the left EStructuralFeature
101:          * @param rightValue the value of the right EStructuralFeature
102:          * @param rightStructuralFeature the right EStructuralFeature
103:          * @return whether the values are equal
104:          */
105:         @SuppressWarnings("unchecked")
106:         public static boolean areValuesEqual(final Object leftValue, final EStructuralFeature leftStructuralFeature,
107:                 final Object rightValue,
108:                 final EStructuralFeature rightStructuralFeature) {
109:•                if (leftValue == null && rightValue == null) {
110:                         return true;
111:                 }
112:•                if (leftValue == null || rightValue == null) {
113:                         return false;
114:                 }
115:•                if (leftValue.equals(rightValue)) {
116:                         return true;
117:                 }
118:
119:•                if (isSingleReferences(leftStructuralFeature)
120:•                        && isSingleReferences(rightStructuralFeature)) {
121:                         return EcoreUtil.equals(EObject.class.cast(leftValue), EObject.class.cast(rightValue));
122:                 }
123:•                if (isMultiReference(leftStructuralFeature) && isMultiReference(rightStructuralFeature)) {
124:                         return EcoreUtil.equals((List<EObject>) leftValue, (List<EObject>) rightValue);
125:                 }
126:                 return false;
127:         }
128:
129:         /**
130:          * @param leftStructuralFeature
131:          * @return
132:          */
133:         private static boolean isMultiReference(EStructuralFeature leftStructuralFeature) {
134:•                return EcorePackage.eINSTANCE.getEReference().isInstance(leftStructuralFeature)
135:•                        && leftStructuralFeature.isMany();
136:         }
137:
138:         private static boolean isSingleReferences(final EStructuralFeature leftStructuralFeature) {
139:•                return EcorePackage.eINSTANCE.getEReference().isInstance(leftStructuralFeature)
140:•                        && !leftStructuralFeature.isMany();
141:         }
142:
143: }