View Javadoc
1   package fr.ifremer.tutti.ui.swing.content.cruise;
2   
3   /*
4    * #%L
5    * Tutti :: UI
6    * %%
7    * Copyright (C) 2012 - 2014 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the 
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public 
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
23   */
24  
25  import com.google.common.collect.Lists;
26  import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode;
27  import fr.ifremer.tutti.persistence.entities.data.Attachment;
28  import fr.ifremer.tutti.persistence.entities.data.Cruise;
29  import fr.ifremer.tutti.persistence.entities.data.Cruises;
30  import fr.ifremer.tutti.persistence.entities.data.Program;
31  import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder;
32  import fr.ifremer.tutti.persistence.entities.referential.Person;
33  import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation;
34  import fr.ifremer.tutti.persistence.entities.referential.Vessel;
35  import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel;
36  import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentModelAware;
37  import org.apache.commons.lang3.StringUtils;
38  import org.apache.commons.lang3.time.DateUtils;
39  import org.nuiton.util.DateUtil;
40  import org.nuiton.util.beans.Binder;
41  import org.nuiton.util.beans.BinderFactory;
42  
43  import java.util.Calendar;
44  import java.util.Collection;
45  import java.util.Date;
46  import java.util.List;
47  
48  /**
49   * Model of UI {@link EditCruiseUI}.
50   *
51   * @author Tony Chemit - chemit@codelutin.com
52   * @since 0.1
53   */
54  public class EditCruiseUIModel extends AbstractTuttiBeanUIModel<Cruise, EditCruiseUIModel> implements AttachmentModelAware, Cruise {
55  
56      private static final long serialVersionUID = 1L;
57  
58      public static final String PROPERTY_CAN_GENERATE_NAME = "canGenerateName";
59  
60      public static final String PROPERTY_CAN_SHOW_GEAR_CARACTERISTIC = "canShowGearCatacteristic";
61  
62      public static final String PROPERTY_CAN_EDIT_GEAR_CARACTERISTIC = "canEditGearCatacteristic";
63  
64      public static final String PROPERTY_VESSEL_TYPE = "vesselType";
65  
66      public static final String PROPERTY_VESSEL_TYPE_ALL = "vesselTypeAll";
67  
68      public static final String PROPERTY_VESSEL_TYPE_SCIENTIFIC = "vesselTypeScientific";
69  
70      public static final String PROPERTY_VESSEL_TYPE_FISHING = "vesselTypeFishing";
71  
72      public static final String PROPERTY_VALIDATION_CONTEXT = "validationContext";
73  
74      /**
75       * Delegate edit object.
76       *
77       * @since 1.3
78       */
79      protected final Cruise editObject = Cruises.newCruise();
80  
81      /**
82       * Type of vessel.
83       *
84       * @see VesselTypeEnum
85       * @since 1.0
86       */
87      protected VesselTypeEnum vesselType;
88  
89      /**
90       * Can edit caracteristics of selected gear (for any temporary gear or professional one)
91       * <strong>only for a none modified cruise.</strong>?
92       *
93       * @since 2.6
94       */
95      protected boolean canEditGearCatacteristic;
96  
97      /**
98       * Can show caracteristics of selected gear? Any time so should be keep it?
99       *
100      * @since 2.6
101      */
102     protected boolean canShowGearCatacteristic;
103 
104     /**
105      * To switch validation context (edit or validate).
106      *
107      * @since 3.6
108      */
109     protected String validationContext;
110 
111     protected final List<Attachment> attachment = Lists.newArrayList();
112 
113     protected static Binder<EditCruiseUIModel, Cruise> toBeanBinder =
114             BinderFactory.newBinder(EditCruiseUIModel.class,
115                                     Cruise.class);
116 
117     protected static Binder<Cruise, EditCruiseUIModel> fromBeanBinder =
118             BinderFactory.newBinder(Cruise.class, EditCruiseUIModel.class);
119 
120     public EditCruiseUIModel() {
121         super(fromBeanBinder, toBeanBinder);
122     }
123 
124     @Override
125     protected Cruise newEntity() {
126         return Cruises.newCruise();
127     }
128 
129     public boolean isCanEditGearCatacteristic() {
130         return canEditGearCatacteristic;
131     }
132 
133     public void setCanEditGearCatacteristic(boolean canEditGearCatacteristic) {
134         this.canEditGearCatacteristic = canEditGearCatacteristic;
135         firePropertyChange(PROPERTY_CAN_EDIT_GEAR_CARACTERISTIC, null, canEditGearCatacteristic);
136     }
137 
138     public boolean isCanShowGearCatacteristic() {
139         return canShowGearCatacteristic;
140     }
141 
142     public void setCanShowGearCatacteristic(boolean canShowGearCatacteristic) {
143         this.canShowGearCatacteristic = canShowGearCatacteristic;
144         firePropertyChange(PROPERTY_CAN_SHOW_GEAR_CARACTERISTIC, null, canShowGearCatacteristic);
145     }
146 
147     public VesselTypeEnum getVesselType() {
148         return vesselType;
149     }
150 
151     public void setVesselType(VesselTypeEnum vesselType) {
152         boolean oldAll = isVesselTypeAll();
153         boolean oldScientific = isVesselTypeScientific();
154         boolean oldFishing = isVesselTypeFishing();
155         Object oldValue = getVesselType();
156         this.vesselType = vesselType;
157         firePropertyChange(PROPERTY_VESSEL_TYPE, oldValue, vesselType);
158         firePropertyChange(PROPERTY_VESSEL_TYPE_ALL, oldAll, isVesselTypeAll());
159         firePropertyChange(PROPERTY_VESSEL_TYPE_SCIENTIFIC, oldScientific, isVesselTypeScientific());
160         firePropertyChange(PROPERTY_VESSEL_TYPE_FISHING, oldFishing, isVesselTypeFishing());
161     }
162 
163     public boolean isVesselTypeAll() {
164         return VesselTypeEnum.ALL.equals(vesselType);
165     }
166 
167     public boolean isVesselTypeScientific() {
168         return VesselTypeEnum.SCIENTIFIC.equals(vesselType);
169     }
170 
171     public boolean isVesselTypeFishing() {
172         return VesselTypeEnum.FISHING.equals(vesselType);
173     }
174 
175     public boolean isCanGenerateName() {
176         return getProgram() != null && getBeginDate() != null;
177     }
178 
179     public static final String CRUISE_NAME_FORMAT = "%1$s_%2$s";
180 
181     public String getGeneratedCampaignName() {
182         int year;
183         if (getBeginDate() == null) {
184             year = 0;
185         } else {
186             Calendar c = Calendar.getInstance();
187             c.setTime(getBeginDate());
188             year = c.get(Calendar.YEAR);
189         }
190         String result = String.format(CRUISE_NAME_FORMAT, getProgram().getName(), year);
191         if (StringUtils.isNotEmpty(getSurveyPart())) {
192             result += "_" + getSurveyPart();
193         }
194         return result;
195     }
196 
197     public String getValidationContext() {
198         return validationContext;
199     }
200 
201     public void setValidationContext(String validationContext) {
202         Object oldValue = getValidationContext();
203         this.validationContext = validationContext;
204         firePropertyChange(PROPERTY_VALIDATION_CONTEXT, oldValue, validationContext);
205     }
206 
207     //------------------------------------------------------------------------//
208     //-- AttachmentModelAware methods                                       --//
209     //------------------------------------------------------------------------//
210 
211     @Override
212     public ObjectTypeCode getObjectType() {
213         return ObjectTypeCode.SCIENTIFIC_CRUISE;
214     }
215 
216     @Override
217     public Integer getObjectId() {
218         return getIdAsInt();
219     }
220 
221     @Override
222     public List<Attachment> getAttachment() {
223         return attachment;
224     }
225 
226     @Override
227     public void addAllAttachment(Collection<Attachment> attachments) {
228         this.attachment.addAll(attachments);
229         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
230     }
231 
232     @Override
233     public void addAttachment(Attachment attachment) {
234         this.attachment.add(attachment);
235         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
236     }
237 
238     @Override
239     public void removeAllAttachment(Collection<Attachment> attachments) {
240         this.attachment.removeAll(attachments);
241         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
242     }
243 
244     @Override
245     public void removeAttachment(Attachment attachment) {
246         this.attachment.remove(attachment);
247         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
248     }
249 
250     //------------------------------------------------------------------------//
251     //-- Cruise methods                                                     --//
252     //------------------------------------------------------------------------//
253 
254     @Override
255     public Program getProgram() {
256         return editObject.getProgram();
257     }
258 
259     @Override
260     public void setProgram(Program program) {
261         Object oldValue = getProgram();
262         editObject.setProgram(program);
263         firePropertyChange(PROPERTY_PROGRAM, oldValue, program);
264         firePropertyChange(PROPERTY_CAN_GENERATE_NAME, null, isCanGenerateName());
265     }
266 
267     @Override
268     public String getName() {
269         return editObject.getName();
270     }
271 
272     @Override
273     public void setName(String name) {
274         Object oldValue = getName();
275         editObject.setName(name);
276         firePropertyChange(PROPERTY_NAME, oldValue, name);
277     }
278 
279     @Override
280     public String getComment() {
281         return editObject.getComment();
282     }
283 
284     @Override
285     public void setComment(String comment) {
286         Object oldValue = getComment();
287         editObject.setComment(comment);
288         firePropertyChange(PROPERTY_COMMENT, oldValue, comment);
289     }
290 
291     @Override
292     public TuttiLocation getDepartureLocation() {
293         return editObject.getDepartureLocation();
294     }
295 
296     @Override
297     public void setDepartureLocation(TuttiLocation departureLocation) {
298         Object oldValue = getDepartureLocation();
299         editObject.setDepartureLocation(departureLocation);
300         firePropertyChange(PROPERTY_DEPARTURE_LOCATION, oldValue, departureLocation);
301     }
302 
303     @Override
304     public TuttiLocation getReturnLocation() {
305         return editObject.getReturnLocation();
306     }
307 
308     @Override
309     public void setReturnLocation(TuttiLocation returnLocation) {
310         Object oldValue = getReturnLocation();
311         editObject.setReturnLocation(returnLocation);
312         firePropertyChange(PROPERTY_RETURN_LOCATION, oldValue, returnLocation);
313     }
314 
315     @Override
316     public String getSurveyPart() {
317         return editObject.getSurveyPart();
318     }
319 
320     @Override
321     public void setSurveyPart(String surveyPart) {
322         Object oldValue = getSurveyPart();
323         editObject.setSurveyPart(surveyPart);
324         firePropertyChange(PROPERTY_SURVEY_PART, oldValue, surveyPart);
325         firePropertyChange(PROPERTY_CAN_GENERATE_NAME, null, isCanGenerateName());
326     }
327 
328     @Override
329     public Integer getMultirigNumber() {
330         return editObject.getMultirigNumber();
331     }
332 
333     @Override
334     public void setMultirigNumber(Integer multirigNumber) {
335         Object oldValue = getMultirigNumber();
336         editObject.setMultirigNumber(multirigNumber);
337         firePropertyChange(PROPERTY_MULTIRIG_NUMBER, oldValue, multirigNumber);
338     }
339 
340     @Override
341     public Date getBeginDate() {
342         return editObject.getBeginDate();
343     }
344 
345     @Override
346     public void setBeginDate(Date beginDate) {
347         Date oldValue = getBeginDate();
348         Date newDate = beginDate;
349         if (oldValue != null && beginDate != null) {
350             // reapply time from previous date
351             newDate = applyTime(beginDate, oldValue);
352         }
353         setBeginDate0(newDate);
354     }
355 
356     @Override
357     public Date getEndDate() {
358         return editObject.getEndDate();
359     }
360 
361     @Override
362     public void setEndDate(Date endDate) {
363         Date oldValue = getEndDate();
364         Date newDate = endDate;
365         if (oldValue != null && endDate != null) {
366             // reapply time from previous date
367             newDate = applyTime(endDate, oldValue);
368         }
369         setEndDate0(newDate);
370     }
371 
372     @Override
373     public Vessel getVessel() {
374         return editObject.getVessel();
375     }
376 
377     @Override
378     public void setVessel(Vessel vessel) {
379         Object oldValue = getVessel();
380         editObject.setVessel(vessel);
381         firePropertyChange(PROPERTY_VESSEL, oldValue, vessel);
382     }
383 
384     @Override
385     public String getSynchronizationStatus() {
386         return editObject.getSynchronizationStatus();
387     }
388 
389     @Override
390     public void setSynchronizationStatus(String synchronizationStatus) {
391         String oldValue = getSynchronizationStatus();
392         editObject.setSynchronizationStatus(synchronizationStatus);
393         firePropertyChange(PROPERTY_SYNCHRONIZATION_STATUS, oldValue, synchronizationStatus);
394     }
395 
396     @Override
397     public List<GearWithOriginalRankOrder> getGear() {
398         return editObject.getGear();
399     }
400 
401     @Override
402     public void setGear(List<GearWithOriginalRankOrder> gear) {
403         editObject.setGear(gear);
404         firePropertyChange(PROPERTY_GEAR, null, gear);
405     }
406 
407     @Override
408     public List<Person> getHeadOfMission() {
409         return editObject.getHeadOfMission();
410     }
411 
412     @Override
413     public void setHeadOfMission(List<Person> headOfMission) {
414         editObject.setHeadOfMission(headOfMission);
415         firePropertyChange(PROPERTY_HEAD_OF_MISSION, null, headOfMission);
416     }
417 
418     @Override
419     public List<Person> getHeadOfSortRoom() {
420         return editObject.getHeadOfSortRoom();
421     }
422 
423     @Override
424     public void setHeadOfSortRoom(List<Person> headOfSortRoom) {
425         editObject.setHeadOfSortRoom(headOfSortRoom);
426         firePropertyChange(PROPERTY_HEAD_OF_SORT_ROOM, null, headOfSortRoom);
427     }
428 
429     @Override
430     public GearWithOriginalRankOrder getGear(int index) {
431         return editObject.getGear(index);
432     }
433 
434     @Override
435     public boolean isGearEmpty() {
436         return editObject.isGearEmpty();
437     }
438 
439     @Override
440     public int sizeGear() {
441         return editObject.sizeGear();
442     }
443 
444     @Override
445     public void addGear(GearWithOriginalRankOrder gear) {
446         editObject.addGear(gear);
447     }
448 
449     @Override
450     public void addAllGear(Collection<GearWithOriginalRankOrder> gear) {
451         editObject.addAllGear(gear);
452     }
453 
454     @Override
455     public boolean removeGear(GearWithOriginalRankOrder gear) {
456         return editObject.removeGear(gear);
457     }
458 
459     @Override
460     public boolean removeAllGear(Collection<GearWithOriginalRankOrder> gear) {
461         return editObject.removeAllGear(gear);
462     }
463 
464     @Override
465     public boolean containsGear(GearWithOriginalRankOrder gear) {
466         return editObject.containsGear(gear);
467     }
468 
469     @Override
470     public boolean containsAllGear(Collection<GearWithOriginalRankOrder> gear) {
471         return editObject.containsAllGear(gear);
472     }
473 
474     @Override
475     public Person getHeadOfMission(int index) {
476         return null;
477     }
478 
479     @Override
480     public boolean isHeadOfMissionEmpty() {
481         return false;
482     }
483 
484     @Override
485     public int sizeHeadOfMission() {
486         return 0;
487     }
488 
489     @Override
490     public void addHeadOfMission(Person headOfMission) {
491     }
492 
493     @Override
494     public void addAllHeadOfMission(Collection<Person> headOfMission) {
495     }
496 
497     @Override
498     public boolean removeHeadOfMission(Person headOfMission) {
499         return false;
500     }
501 
502     @Override
503     public boolean removeAllHeadOfMission(Collection<Person> headOfMission) {
504         return false;
505     }
506 
507     @Override
508     public boolean containsHeadOfMission(Person headOfMission) {
509         return false;
510     }
511 
512     @Override
513     public boolean containsAllHeadOfMission(Collection<Person> headOfMission) {
514         return false;
515     }
516 
517     @Override
518     public Person getHeadOfSortRoom(int index) {
519         return null;
520     }
521 
522     @Override
523     public boolean isHeadOfSortRoomEmpty() {
524         return false;
525     }
526 
527     @Override
528     public int sizeHeadOfSortRoom() {
529         return 0;
530     }
531 
532     @Override
533     public void addHeadOfSortRoom(Person headOfSortRoom) {
534     }
535 
536     @Override
537     public void addAllHeadOfSortRoom(Collection<Person> headOfSortRoom) {
538     }
539 
540     @Override
541     public boolean removeHeadOfSortRoom(Person headOfSortRoom) {
542         return false;
543     }
544 
545     @Override
546     public boolean removeAllHeadOfSortRoom(Collection<Person> headOfSortRoom) {
547         return false;
548     }
549 
550     @Override
551     public boolean containsHeadOfSortRoom(Person headOfSortRoom) {
552         return false;
553     }
554 
555     @Override
556     public boolean containsAllHeadOfSortRoom(Collection<Person> headOfSortRoom) {
557         return false;
558     }
559 
560     //------------------------------------------------------------------------//
561     //-- Start - End Time ----------------------------------------------------//
562     //------------------------------------------------------------------------//
563 
564     public void setBeginTime(Date beginTime) {
565         Date oldValue = getBeginDate();
566         if (oldValue != null && beginTime != null) {
567             // apply time to previous date
568             Date newDate = applyTime(oldValue, beginTime);
569             setBeginDate0(newDate);
570         }
571     }
572 
573     public void setEndTime(Date endTime) {
574         Date oldValue = getEndDate();
575         if (oldValue != null && endTime != null) {
576             // apply time to previous date
577             Date newDate = applyTime(oldValue, endTime);
578             setEndDate0(newDate);
579         }
580     }
581 
582     //------------------------------------------------------------------------//
583     //-- Protected methods ---------------------------------------------------//
584     //------------------------------------------------------------------------//
585 
586     protected Date applyTime(Date date, Date timeDate) {
587 
588         Calendar cal = DateUtils.toCalendar(timeDate);
589         Date newDate = DateUtils.setHours(date, cal.get(Calendar.HOUR_OF_DAY));
590         newDate = DateUtils.setMinutes(newDate, cal.get(Calendar.MINUTE));
591 
592         return newDate;
593     }
594 
595     protected void setBeginDate0(Date beginDate) {
596         Date oldValue = getBeginDate();
597         if (beginDate != null) {
598             Calendar calendar = DateUtil.getDefaultCalendar(beginDate);
599             calendar.set(Calendar.SECOND, 0);
600             editObject.setBeginDate(calendar.getTime());
601 
602         } else {
603             editObject.setBeginDate(null);
604         }
605         firePropertyChange(PROPERTY_BEGIN_DATE, oldValue, getBeginDate());
606         firePropertyChange(PROPERTY_CAN_GENERATE_NAME, null, isCanGenerateName());
607     }
608 
609     protected void setEndDate0(Date endDate) {
610         Object oldValue = getEndDate();
611         if (endDate != null) {
612             Calendar calendar = DateUtil.getDefaultCalendar(endDate);
613             calendar.set(Calendar.SECOND, 0);
614             editObject.setEndDate(calendar.getTime());
615 
616         } else {
617             editObject.setEndDate(null);
618         }
619         firePropertyChange(PROPERTY_END_DATE, oldValue, getEndDate());
620     }
621 }