1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.opencastproject.workflow.conditionparser;
22
23 import java.util.Objects;
24
25
26
27
28 public final class Atom implements Comparable<Atom> {
29 private final Double number;
30 private final String string;
31
32 private Atom(Double number, String string) {
33 this.number = number;
34 this.string = string;
35 }
36
37 @Override
38 public String toString() {
39 if (number != null) {
40 final String s = String.valueOf(number);
41
42
43 if (s.endsWith(".0")) {
44 return s.substring(0, s.length() - 2);
45 }
46 return s;
47 }
48 return string;
49 }
50
51 private static Atom fromNumber(double number) {
52 return new Atom(number, null);
53 }
54
55 static Atom fromString(String string) {
56 return new Atom(null, string);
57 }
58
59 static Atom parseNumber(String text) {
60 return new Atom(Double.parseDouble(text), null);
61 }
62
63 static Atom parseString(String text) {
64 return new Atom(null, text);
65 }
66
67 Atom reduce(Atom atom, NumericalOperator op) {
68 switch (op) {
69 case ADD:
70 if (number != null && atom.number != null) {
71 return Atom.fromNumber(number + atom.number);
72 }
73 return Atom.fromString(toString() + atom.toString());
74 case SUBTRACT:
75 if (number != null) {
76 return Atom.fromNumber(number - atom.number);
77 }
78 throw new IllegalArgumentException("Tried to subtract from string '" + string + "'");
79 case MULTIPLY:
80 if (number != null) {
81 return Atom.fromNumber(number * atom.number);
82 }
83 throw new IllegalArgumentException("Tried to multiply with string '" + string + "'");
84 default:
85 if (number != null) {
86 return Atom.fromNumber(number / atom.number);
87 }
88 throw new IllegalArgumentException("Tried to divide from string '" + string + "'");
89 }
90 }
91
92 @Override
93 public boolean equals(Object o) {
94 if (this == o) {
95 return true;
96 }
97 if (o == null || getClass() != o.getClass()) {
98 return false;
99 }
100 Atom atom = (Atom) o;
101 return Objects.equals(number, atom.number) && Objects.equals(string, atom.string);
102 }
103
104 @Override
105 public int hashCode() {
106 return Objects.hash(number, string);
107 }
108
109 @Override
110 public int compareTo(Atom o) {
111 if (number != null) {
112 if (o.number == null) {
113 return toString().compareTo(o.string);
114 }
115 return number.compareTo(o.number);
116 }
117 if (o.string == null) {
118 return string.compareTo(o.toString());
119 }
120 return string.compareTo(o.string);
121 }
122 }