1 package fr.ifremer.tutti.service;
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 import com.google.common.collect.Lists;
28 import com.opensymphony.xwork2.util.ValueStack;
29 import fr.ifremer.tutti.persistence.entities.data.Cruise;
30 import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
31 import fr.ifremer.tutti.persistence.entities.data.Program;
32 import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
33 import fr.ifremer.tutti.type.WeightUnit;
34 import org.apache.commons.logging.Log;
35 import org.apache.commons.logging.LogFactory;
36 import org.nuiton.util.DateUtil;
37 import org.nuiton.validator.xwork2.XWork2ValidatorUtil;
38
39 import java.util.ArrayList;
40 import java.util.Date;
41 import java.util.List;
42
43
44
45
46
47
48
49
50
51 public abstract class TuttiValidationDataContextSupport {
52
53
54 private static final Log log = LogFactory.getLog(TuttiValidationDataContextSupport.class);
55
56 private List<Program> existingPrograms = Lists.newArrayList();
57
58 private List<TuttiProtocol> existingProtocols = Lists.newArrayList();
59
60 private List<FishingOperation> existingFishingOperations = Lists.newArrayList();
61
62 public static TuttiValidationDataContextSupport setValidationContext(TuttiValidationDataContextSupport validationDataContext, boolean removePrevious) {
63
64 ValueStack sharedValueStack = XWork2ValidatorUtil.getSharedValueStack();
65
66 TuttiValidationDataContextSupport previousValidationContext = null;
67 if (removePrevious) {
68 List toRepush = new ArrayList();
69 do {
70
71 Object o = sharedValueStack.pop();
72
73 if (log.isDebugEnabled()) {
74 log.debug("Pop object: " + o);
75 }
76 if (o instanceof TuttiValidationDataContextSupport) {
77 previousValidationContext = (TuttiValidationDataContextSupport) o;
78 } else {
79 toRepush.add(0, o);
80 }
81
82 } while (previousValidationContext == null || sharedValueStack.size() > 0);
83
84 for (Object o : toRepush) {
85
86 if (log.isDebugEnabled()) {
87 log.debug("Push object: " + o);
88 }
89 sharedValueStack.push(o);
90 }
91
92 }
93 sharedValueStack.push(validationDataContext);
94
95 return previousValidationContext;
96 }
97
98 protected abstract List<Program> loadExistingPrograms();
99
100 protected abstract List<TuttiProtocol> loadExistingProtocols();
101
102 protected abstract List<FishingOperation> loadExistingFishingOperations();
103
104 protected abstract Program getProgram();
105
106 protected abstract Cruise getCruise();
107
108 protected abstract TuttiProtocol getProtocol();
109
110 protected abstract FishingOperation getFishingOperation();
111
112 public final List<Program> getExistingPrograms() {
113 if (existingPrograms == null) {
114
115 existingPrograms = loadExistingPrograms();
116 }
117 return existingPrograms;
118 }
119
120 public final List<TuttiProtocol> getExistingProtocols() {
121 if (existingProtocols == null) {
122 existingProtocols = loadExistingProtocols();
123 }
124 return existingProtocols;
125 }
126
127 public final List<FishingOperation> getExistingFishingOperations() {
128 if (existingFishingOperations == null) {
129 existingFishingOperations = loadExistingFishingOperations();
130 }
131 return existingFishingOperations;
132 }
133
134 public final boolean isDateInCruise(Date date) {
135 return DateUtil.between(date, getCruise().getBeginDate(), getCruise().getEndDate());
136 }
137
138 public final boolean isNotWeightZeroValue(Float weight) {
139 return WeightUnit.KG.isNotNullNorZero(weight);
140 }
141
142 public final boolean isMutiRegNumberValid(String numberAsString) {
143 boolean result = false;
144 if (numberAsString.matches("\\d+")) {
145 int mutlirigNumber = Integer.valueOf(numberAsString);
146 Integer cruiseMultirigNumber = getCruise().getMultirigNumber();
147 result = mutlirigNumber <= cruiseMultirigNumber;
148 }
149 return result;
150 }
151
152 public final boolean isValidDuration(Date gearShootingStartDate, Date gearShootingEndDate) {
153 boolean result = gearShootingStartDate == null || gearShootingEndDate == null;
154 if (!result) {
155 int minutes = DateUtil.getDifferenceInMinutes(gearShootingStartDate, gearShootingEndDate);
156 result = minutes <= 45 && minutes >= 20;
157 }
158 return result;
159 }
160
161 public void reset() {
162 resetExistingPrograms();
163 resetExistingProtocols();
164 resetExistingFishingOperations();
165 }
166
167 public void resetExistingPrograms() {
168 existingPrograms = null;
169 }
170
171 public void resetExistingProtocols() {
172 existingProtocols = null;
173 }
174
175 public void resetExistingFishingOperations() {
176 existingFishingOperations = null;
177 }
178 }