|
|
@@ -3,6 +3,7 @@ package se.citerus.dddsample.tracking.core.domain.model.cargo;
|
|
3
|
3
|
import org.apache.commons.lang.Validate;
|
|
4
|
4
|
import se.citerus.dddsample.tracking.core.domain.model.location.Location;
|
|
5
|
5
|
import se.citerus.dddsample.tracking.core.domain.patterns.specification.AbstractSpecification;
|
|
|
6
|
+import se.citerus.dddsample.tracking.core.domain.patterns.specification.Specification;
|
|
6
|
7
|
import se.citerus.dddsample.tracking.core.domain.patterns.valueobject.ValueObjectSupport;
|
|
7
|
8
|
|
|
8
|
9
|
import java.util.Date;
|
|
|
@@ -17,10 +18,11 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
|
|
17
|
18
|
private final Location destination;
|
|
18
|
19
|
private final Date arrivalDeadline;
|
|
19
|
20
|
|
|
20
|
|
- private final NotNullSpecification notNull = new NotNullSpecification();
|
|
21
|
|
- private final SameOriginSpecification sameOrigin = new SameOriginSpecification();
|
|
22
|
|
- private final SameDestinationSpecification sameDestination = new SameDestinationSpecification();
|
|
23
|
|
- private final MeetsDeadlineSpecification meetsDeadline = new MeetsDeadlineSpecification();
|
|
|
21
|
+ // Delegate specifications
|
|
|
22
|
+ private final Specification<Itinerary> notNull = new NotNullSpecification();
|
|
|
23
|
+ private final Specification<Itinerary> sameOrigin = new SameOriginSpecification();
|
|
|
24
|
+ private final Specification<Itinerary> sameDestination = new SameDestinationSpecification();
|
|
|
25
|
+ private final Specification<Itinerary> meetsDeadline = new MeetsDeadlineSpecification();
|
|
24
|
26
|
|
|
25
|
27
|
/**
|
|
26
|
28
|
* @param origin origin location - can't be the same as the destination
|
|
|
@@ -39,6 +41,15 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
|
|
39
|
41
|
}
|
|
40
|
42
|
|
|
41
|
43
|
/**
|
|
|
44
|
+ * @param itinerary itinerary
|
|
|
45
|
+ * @return True if this route specification is satisfied by the itinerary,
|
|
|
46
|
+ * i.e. the cargo will be delivered according to requirements.
|
|
|
47
|
+ */
|
|
|
48
|
+ public boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
|
49
|
+ return notNull.and(sameOrigin).and(sameDestination).and(meetsDeadline).isSatisfiedBy(itinerary);
|
|
|
50
|
+ }
|
|
|
51
|
+
|
|
|
52
|
+ /**
|
|
42
|
53
|
* @return Specified origin location.
|
|
43
|
54
|
*/
|
|
44
|
55
|
public Location origin() {
|
|
|
@@ -83,15 +94,6 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
|
|
83
|
94
|
return new RouteSpecification(origin, destination, newArrivalDeadline);
|
|
84
|
95
|
}
|
|
85
|
96
|
|
|
86
|
|
- /**
|
|
87
|
|
- * @param itinerary itinerary
|
|
88
|
|
- * @return True if this route specification is satisfied by the itinerary,
|
|
89
|
|
- * i.e. the cargo will be delivered according to requirements.
|
|
90
|
|
- */
|
|
91
|
|
- public boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
92
|
|
- return notNull.and(sameOrigin).and(sameDestination).and(meetsDeadline).isSatisfiedBy(itinerary);
|
|
93
|
|
- }
|
|
94
|
|
-
|
|
95
|
97
|
@Override
|
|
96
|
98
|
public String toString() {
|
|
97
|
99
|
return origin + " to " + destination + " by " + arrivalDeadline;
|
|
|
@@ -103,32 +105,45 @@ public class RouteSpecification extends ValueObjectSupport<RouteSpecification> {
|
|
103
|
105
|
arrivalDeadline = null;
|
|
104
|
106
|
}
|
|
105
|
107
|
|
|
106
|
|
- private class NotNullSpecification extends AbstractSpecification<Itinerary> {
|
|
|
108
|
+ // --- Private classes ---
|
|
|
109
|
+
|
|
|
110
|
+ private final class NotNullSpecification extends FieldlessSpecification {
|
|
107
|
111
|
@Override
|
|
108
|
|
- public boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
|
112
|
+ public final boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
109
|
113
|
return itinerary != null;
|
|
110
|
114
|
}
|
|
111
|
115
|
}
|
|
112
|
116
|
|
|
113
|
|
- private class SameOriginSpecification extends AbstractSpecification<Itinerary> {
|
|
|
117
|
+ private final class SameOriginSpecification extends FieldlessSpecification {
|
|
114
|
118
|
@Override
|
|
115
|
|
- public boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
|
119
|
+ public final boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
116
|
120
|
return origin.sameAs(itinerary.initialLoadLocation());
|
|
117
|
121
|
}
|
|
118
|
122
|
}
|
|
119
|
123
|
|
|
120
|
|
- private class SameDestinationSpecification extends AbstractSpecification<Itinerary> {
|
|
|
124
|
+ private final class SameDestinationSpecification extends FieldlessSpecification {
|
|
121
|
125
|
@Override
|
|
122
|
|
- public boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
|
126
|
+ public final boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
123
|
127
|
return destination.sameAs(itinerary.finalUnloadLocation());
|
|
124
|
128
|
}
|
|
125
|
129
|
}
|
|
126
|
130
|
|
|
127
|
|
- private class MeetsDeadlineSpecification extends AbstractSpecification<Itinerary> {
|
|
|
131
|
+ private final class MeetsDeadlineSpecification extends FieldlessSpecification {
|
|
128
|
132
|
@Override
|
|
129
|
|
- public boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
|
133
|
+ public final boolean isSatisfiedBy(final Itinerary itinerary) {
|
|
130
|
134
|
return arrivalDeadline.after(itinerary.finalUnloadTime());
|
|
131
|
135
|
}
|
|
132
|
136
|
}
|
|
133
|
137
|
|
|
|
138
|
+ private static abstract class FieldlessSpecification extends AbstractSpecification<Itinerary> {
|
|
|
139
|
+ @Override
|
|
|
140
|
+ public final boolean equals(final Object that) {
|
|
|
141
|
+ return that != null && this.getClass().equals(that.getClass());
|
|
|
142
|
+ }
|
|
|
143
|
+ @Override
|
|
|
144
|
+ public final int hashCode() {
|
|
|
145
|
+ return this.getClass().hashCode();
|
|
|
146
|
+ }
|
|
|
147
|
+ }
|
|
|
148
|
+
|
|
134
|
149
|
}
|