1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.metapath;
28
29 import gov.nist.secauto.metaschema.core.metapath.function.FunctionUtils;
30 import gov.nist.secauto.metaschema.core.metapath.function.OperationFunctions;
31 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
32 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IDateItem;
33 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IDateTimeItem;
34 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IDayTimeDurationItem;
35 import gov.nist.secauto.metaschema.core.metapath.item.atomic.INumericItem;
36 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IYearMonthDurationItem;
37
38 import edu.umd.cs.findbugs.annotations.NonNull;
39
40 class Addition
41 extends AbstractBasicArithmeticExpression {
42
43
44
45
46
47
48
49
50
51 protected Addition(@NonNull IExpression left, @NonNull IExpression right) {
52 super(left, right);
53 }
54
55 @Override
56 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
57 return visitor.visitAddition(this, context);
58 }
59
60
61
62
63
64
65
66
67
68
69
70 @Override
71 protected IAnyAtomicItem operation(@NonNull IAnyAtomicItem left, @NonNull IAnyAtomicItem right) {
72 return sum(left, right);
73 }
74
75
76
77
78
79
80
81
82
83
84 @SuppressWarnings({ "PMD.CyclomaticComplexity", "PMD.CognitiveComplexity" })
85 @NonNull
86 public static IAnyAtomicItem sum(
87 @NonNull IAnyAtomicItem leftItem,
88 @NonNull IAnyAtomicItem rightItem) {
89 IAnyAtomicItem retval = null;
90 if (leftItem instanceof IDateItem) {
91 IDateItem left = (IDateItem) leftItem;
92 if (rightItem instanceof IYearMonthDurationItem) {
93 retval = OperationFunctions.opAddYearMonthDurationToDate(left, (IYearMonthDurationItem) rightItem);
94 } else if (rightItem instanceof IDayTimeDurationItem) {
95 retval = OperationFunctions.opAddDayTimeDurationToDate(left, (IDayTimeDurationItem) rightItem);
96 }
97 } else if (leftItem instanceof IDateTimeItem) {
98 IDateTimeItem left = (IDateTimeItem) leftItem;
99 if (rightItem instanceof IYearMonthDurationItem) {
100 retval = OperationFunctions.opAddYearMonthDurationToDateTime(left, (IYearMonthDurationItem) rightItem);
101 } else if (rightItem instanceof IDayTimeDurationItem) {
102 retval = OperationFunctions.opAddDayTimeDurationToDateTime(left, (IDayTimeDurationItem) rightItem);
103 }
104 } else if (leftItem instanceof IYearMonthDurationItem) {
105 IYearMonthDurationItem left = (IYearMonthDurationItem) leftItem;
106 if (rightItem instanceof IDateItem) {
107 retval = OperationFunctions.opAddYearMonthDurationToDate((IDateItem) rightItem, left);
108 } else if (rightItem instanceof IDateTimeItem) {
109 retval = OperationFunctions.opAddYearMonthDurationToDateTime((IDateTimeItem) rightItem, left);
110 } else if (rightItem instanceof IYearMonthDurationItem) {
111 retval = OperationFunctions.opSubtractYearMonthDurations(left, (IYearMonthDurationItem) rightItem);
112 }
113 } else if (leftItem instanceof IDayTimeDurationItem) {
114 IDayTimeDurationItem left = (IDayTimeDurationItem) leftItem;
115 if (rightItem instanceof IDateItem) {
116 retval = OperationFunctions.opAddDayTimeDurationToDate((IDateItem) rightItem, left);
117 } else if (rightItem instanceof IDateTimeItem) {
118 retval = OperationFunctions.opAddDayTimeDurationToDateTime((IDateTimeItem) rightItem, left);
119 } else if (rightItem instanceof IDayTimeDurationItem) {
120 retval = OperationFunctions.opAddDayTimeDurations(left, (IDayTimeDurationItem) rightItem);
121 }
122 } else {
123
124 INumericItem left = FunctionUtils.toNumeric(leftItem);
125 INumericItem right = FunctionUtils.toNumeric(rightItem);
126 retval = OperationFunctions.opNumericAdd(left, right);
127 }
128 if (retval == null) {
129 throw new UnsupportedOperationException(
130 String.format("The expression '%s + %s' is not supported", leftItem.getClass().getName(),
131 rightItem.getClass().getName()));
132 }
133 return retval;
134 }
135 }