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 Subtraction
41 extends AbstractBasicArithmeticExpression {
42
43
44
45
46
47
48
49
50
51 protected Subtraction(@NonNull IExpression minuend, @NonNull IExpression subtrahend) {
52 super(minuend, subtrahend);
53 }
54
55 @Override
56 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
57 return visitor.visitSubtraction(this, context);
58 }
59
60
61
62
63
64
65
66
67
68
69
70 @Override
71 @NonNull
72 protected IAnyAtomicItem operation(@NonNull IAnyAtomicItem minuend, @NonNull IAnyAtomicItem subtrahend) {
73 return subtract(minuend, subtrahend);
74 }
75
76
77
78
79
80
81
82
83
84
85 @NonNull
86 public static IAnyAtomicItem subtract(@NonNull IAnyAtomicItem minuend,
87 @NonNull IAnyAtomicItem subtrahend) {
88
89 IAnyAtomicItem retval = null;
90 if (minuend instanceof IDateItem) {
91 IDateItem left = (IDateItem) minuend;
92
93 if (subtrahend instanceof IDateItem) {
94 retval = OperationFunctions.opSubtractDates(left, (IDateItem) subtrahend);
95 } else if (subtrahend instanceof IYearMonthDurationItem) {
96 retval = OperationFunctions.opSubtractYearMonthDurationFromDate(left, (IYearMonthDurationItem) subtrahend);
97 } else if (subtrahend instanceof IDayTimeDurationItem) {
98 retval = OperationFunctions.opSubtractDayTimeDurationFromDate(left, (IDayTimeDurationItem) subtrahend);
99 }
100 } else if (minuend instanceof IDateTimeItem) {
101 IDateTimeItem left = (IDateTimeItem) minuend;
102 if (subtrahend instanceof IDateTimeItem) {
103 retval = OperationFunctions.opSubtractDateTimes(left, (IDateTimeItem) subtrahend);
104 } else if (subtrahend instanceof IYearMonthDurationItem) {
105 retval = OperationFunctions.opSubtractYearMonthDurationFromDateTime(left, (IYearMonthDurationItem) subtrahend);
106 } else if (subtrahend instanceof IDayTimeDurationItem) {
107 retval = OperationFunctions.opSubtractDayTimeDurationFromDateTime(left, (IDayTimeDurationItem) subtrahend);
108 }
109 } else if (minuend instanceof IYearMonthDurationItem) {
110 IYearMonthDurationItem left = (IYearMonthDurationItem) minuend;
111 if (subtrahend instanceof IYearMonthDurationItem) {
112 retval = OperationFunctions.opSubtractYearMonthDurations(left, (IYearMonthDurationItem) subtrahend);
113 }
114 } else if (minuend instanceof IDayTimeDurationItem) {
115 IDayTimeDurationItem left = (IDayTimeDurationItem) minuend;
116 if (subtrahend instanceof IDayTimeDurationItem) {
117 retval = OperationFunctions.opSubtractDayTimeDurations(left, (IDayTimeDurationItem) subtrahend);
118 }
119 } else {
120
121 INumericItem left = FunctionUtils.toNumeric(minuend);
122 INumericItem right = FunctionUtils.toNumeric(subtrahend);
123 retval = OperationFunctions.opNumericSubtract(left, right);
124 }
125 if (retval == null) {
126 throw new InvalidTypeMetapathException(
127 null,
128 String.format("The expression '%s - %s' is not supported", minuend.getClass().getName(),
129 subtrahend.getClass().getName()));
130 }
131 return retval;
132 }
133 }