1 package fr.ifremer.quadrige2.ui.swing.common.synchro;
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 import com.google.common.base.Charsets;
27 import com.google.common.base.Preconditions;
28 import com.google.common.collect.Multimap;
29 import com.google.common.collect.Sets;
30 import com.google.common.io.Files;
31 import fr.ifremer.quadrige2.core.config.Quadrige2Configuration;
32 import fr.ifremer.quadrige2.core.dao.technical.DateVersions;
33 import fr.ifremer.quadrige2.core.dao.technical.Dates;
34 import fr.ifremer.quadrige2.core.dao.technical.hibernate.ConfigurationHelper;
35 import fr.ifremer.quadrige2.core.exception.Quadrige2TechnicalException;
36 import fr.ifremer.quadrige2.synchro.vo.SynchroExportContextVO;
37 import fr.ifremer.quadrige2.synchro.vo.SynchroImportContextVO;
38 import fr.ifremer.quadrige2.synchro.vo.SynchroProgressionStatus;
39 import fr.ifremer.quadrige2.ui.swing.common.ApplicationUIContext;
40 import fr.ifremer.quadrige2.ui.swing.common.model.BeanPropertyChangeListener;
41 import fr.ifremer.quadrige2.ui.swing.common.model.ProgressionModel;
42 import org.apache.commons.collections4.CollectionUtils;
43 import org.apache.commons.io.IOUtils;
44 import org.apache.commons.lang3.StringUtils;
45 import org.apache.commons.logging.Log;
46 import org.apache.commons.logging.LogFactory;
47 import org.jdesktop.beans.AbstractBean;
48 import org.nuiton.i18n.I18n;
49 import org.nuiton.updater.ApplicationUpdater;
50 import org.nuiton.util.DateUtil;
51
52 import java.beans.PropertyChangeListener;
53 import java.io.*;
54 import java.nio.charset.Charset;
55 import java.util.Collection;
56 import java.util.Date;
57 import java.util.Properties;
58 import java.util.Set;
59
60 import static org.nuiton.i18n.I18n.t;
61
62
63
64
65
66
67 public class SynchroUIContext extends AbstractBean implements Closeable, BeanPropertyChangeListener {
68
69 private static final Log log = LogFactory.getLog(SynchroUIContext.class);
70
71 private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSX";
72
73 private static final String IMPORT_DIRECTORY = "import";
74 private static final String EXPORT_DIRECTORY = "export";
75 private static final String IMPORT_PROPERTIES = "import.properties";
76 private static final String EXPORT_PROPERTIES = "export.properties";
77
78 private static final String PROPERTY_UI_DATA_START_DATE = "importDataStartDate";
79 private static final String PROPERTY_UI_DATA_END_DATE = "importDataEndDate";
80
81 private static final String PROPERTY_DATA_DATE_RANGE = "yyyyMMdd";
82
83 private final ApplicationUIContext mainContext;
84
85 private SynchroDirection direction;
86
87 private String title;
88
89 public static final String PROPERTY_SYNCHRO_TITLE = "title";
90
91 private SynchroImportContextVO synchroImportContext;
92
93 private SynchroExportContextVO synchroExportContext;
94
95 private SynchroProgressionStatus status;
96
97 public static final String PROPERTY_PROGRESSION_STATUS = "status";
98
99 private ProgressionModel progressionModel;
100
101 public static final String PROPERTY_PROGRESSION_MODEL = "progressionModel";
102
103 private boolean serverSide;
104
105 public static final String PROPERTY_SERVER_SIDE = "serverSide";
106
107 private String transferFilename;
108
109 public static final String PROPERTY_TRANSFER_FILENAME = "transfertFilename";
110
111 private File workingDirectory;
112
113 public static final String PROPERTY_WORKING_DIRECTORY = "workingDirectory";
114
115
116
117
118
119
120 public SynchroUIContext(ApplicationUIContext mainContext) {
121 this.mainContext = mainContext;
122 synchroImportContext = new SynchroImportContextVO();
123 synchroExportContext = new SynchroExportContextVO();
124
125
126 setProgressionModel(new ProgressionModel());
127 getProgressionModel().setTotal(100);
128
129 if (getStatus() == null) {
130 setStatus(SynchroProgressionStatus.NOT_STARTED);
131 }
132 }
133
134
135
136
137
138
139 public SynchroDirection getDirection() {
140 return direction;
141 }
142
143
144
145
146
147
148 public void setDirection(SynchroDirection direction) {
149 this.direction = direction;
150 updateTitle();
151 }
152
153
154
155
156
157
158 public String getTitle() {
159 return title;
160 }
161
162
163
164
165
166
167 public void setTitle(String title) {
168 String oldValue = getTitle();
169 this.title = title;
170 firePropertyChange(PROPERTY_SYNCHRO_TITLE, oldValue, title);
171 }
172
173
174
175
176
177
178 public final SynchroProgressionStatus getStatus() {
179 return status;
180 }
181
182
183
184
185
186
187 public final boolean isRunningStatus() {
188 return status == SynchroProgressionStatus.RUNNING
189 || status == SynchroProgressionStatus.WAITING_EXECUTION;
190 }
191
192
193
194
195
196
197 public final void setStatus(SynchroProgressionStatus status) {
198 this.status = status;
199 firePropertyChange(PROPERTY_PROGRESSION_STATUS, null, status);
200 }
201
202
203
204
205
206
207 public final ProgressionModel getProgressionModel() {
208 return progressionModel;
209 }
210
211
212
213
214
215
216 public final void setProgressionModel(ProgressionModel progressionModel) {
217 Object oldValue = getProgressionModel();
218 this.progressionModel = progressionModel;
219 firePropertyChange(PROPERTY_PROGRESSION_MODEL, oldValue, progressionModel);
220 }
221
222
223
224
225
226
227 public boolean isServerSide() {
228 return serverSide;
229 }
230
231
232
233
234
235
236 public void setServerSide(boolean serverSide) {
237 boolean oldValue = isServerSide();
238 this.serverSide = serverSide;
239 firePropertyChange(PROPERTY_SERVER_SIDE, oldValue, serverSide);
240 }
241
242
243
244
245
246
247 public File getWorkingDirectory() {
248 return workingDirectory;
249 }
250
251
252
253
254
255
256 public void setWorkingDirectory(File workingDirectory) {
257 this.workingDirectory = workingDirectory;
258 }
259
260
261
262
263
264
265 public String getTransferFilename() {
266 return transferFilename;
267 }
268
269
270
271
272
273
274 public void setTransferFilename(String transfertFilename) {
275 this.transferFilename = transfertFilename;
276 }
277
278
279
280
281
282
283 public SynchroImportContextVO getSynchroImportContext() {
284 return synchroImportContext;
285 }
286
287
288
289
290
291
292 public void setSynchroImportContext(SynchroImportContextVO synchroImportContext) {
293 Preconditions.checkNotNull(synchroImportContext);
294 this.synchroImportContext = synchroImportContext;
295 }
296
297
298
299
300
301
302 public SynchroExportContextVO getSynchroExportContext() {
303 return synchroExportContext;
304 }
305
306
307
308
309
310
311 public void setSynchroExportContext(SynchroExportContextVO synchroExportContext) {
312 Preconditions.checkNotNull(synchroExportContext);
313 this.synchroExportContext = synchroExportContext;
314 }
315
316
317
318
319
320
321
322
323
324 public String getImportJobId() {
325 return synchroImportContext.getJobId();
326 }
327
328
329
330
331
332
333 public void setImportJobId(String jobId) {
334 synchroImportContext.setJobId(jobId);
335 }
336
337
338
339
340
341
342 public Date getImportReferentialUpdateDate() {
343 return synchroImportContext.getReferentialUpdateDate();
344 }
345
346
347
348
349
350
351 public void setImportReferentialUpdateDate(Date referentialUpdateDate) {
352 synchroImportContext.setReferentialUpdateDate(referentialUpdateDate);
353 }
354
355
356
357
358
359
360 public Date getImportDataUpdateDate() {
361 return synchroImportContext.getDataUpdateDate();
362 }
363
364
365
366
367
368
369 public void setImportDataUpdateDate(Date dataUpdateDate) {
370 synchroImportContext.setDataUpdateDate(dataUpdateDate);
371 }
372
373
374
375
376
377
378 public Date getImportDataStartDate() {
379 return synchroImportContext.getDataStartDate();
380 }
381
382
383
384
385
386
387 public void setImportDataStartDate(Date dataStartDate) {
388 synchroImportContext.setDataStartDate(dataStartDate);
389 firePropertyChange(PROPERTY_UI_DATA_START_DATE, null, null);
390 if (dataStartDate != null && getImportDataEndDate() != null && dataStartDate.after(getImportDataEndDate())) {
391 setImportDataEndDate(dataStartDate);
392 }
393 }
394
395
396
397
398
399
400 public Date getImportDataEndDate() {
401 return synchroImportContext.getDataEndDate();
402 }
403
404
405
406
407
408
409 public void setImportDataEndDate(Date dataEndDate) {
410 synchroImportContext.setDataEndDate(dataEndDate);
411 firePropertyChange(PROPERTY_UI_DATA_END_DATE, null, null);
412 if (dataEndDate != null && getImportDataStartDate() != null && dataEndDate.before(getImportDataStartDate())) {
413 setImportDataStartDate(dataEndDate);
414 }
415 }
416
417
418
419
420
421
422 public boolean isImportReferential() {
423 return synchroImportContext.isWithReferential();
424 }
425
426
427
428
429
430
431 public void setImportReferential(boolean referential) {
432 synchroImportContext.setWithReferential(referential);
433 }
434
435
436
437
438
439
440 public boolean isImportData() {
441 return synchroImportContext.isWithData();
442 }
443
444
445
446
447
448
449 public void setImportData(boolean data) {
450 synchroImportContext.setWithData(data);
451 updateTitle();
452 }
453
454
455
456
457
458
459 public void setImportReferentialPkIncludes(Multimap<String, String> referentialPkIncludes) {
460 synchroImportContext.setReferentialPkIncludes(referentialPkIncludes);
461 }
462
463
464
465
466
467
468 public void setImportDataPkIncludes(Multimap<String, String> dataPkIncludes) {
469 synchroImportContext.setDataPkIncludes(dataPkIncludes);
470 }
471
472
473
474
475
476
477 public void setForceDuplication(boolean forceDuplication) {
478 synchroImportContext.setForceDuplication(forceDuplication);
479 }
480
481
482
483
484
485
486 public Set<String> getImportDataProgramCodes() {
487 return synchroImportContext.getDataProgramCodes();
488 }
489
490
491
492
493
494
495 public void setImportDataProgramCodes(Set<String> programCodes) {
496 synchroImportContext.setDataProgramCodes(programCodes);
497 }
498
499
500
501
502
503
504 public void setImportReferentialProgramCodes(Set<String> programCodes) {
505 synchroImportContext.setReferentialProgramCodes(programCodes);
506 }
507
508
509
510
511
512
513 public Set<String> getImportReferentialProgramCodes() {
514 return synchroImportContext.getReferentialProgramCodes();
515 }
516
517
518
519
520
521
522 public Set<String> getExportDataProgramCodes() {
523 return synchroExportContext.getDataProgramCodes();
524 }
525
526
527
528
529
530
531 public void setExportDataProgramCodes(Set<String> programCodes) {
532 synchroExportContext.setDataProgramCodes(programCodes);
533 }
534
535
536
537
538
539
540 public Set<String> getExportReferentialProgramCodes() {
541 return synchroExportContext.getReferentialProgramCodes();
542 }
543
544
545
546
547
548
549 public void setExportReferentialProgramCodes(Set<String> programCodes) {
550 synchroExportContext.setReferentialProgramCodes(programCodes);
551 }
552
553
554
555
556
557
558 public Multimap<String, String> getImportReferentialPkIncludes() {
559 return synchroImportContext.getReferentialPkIncludes();
560 }
561
562
563
564
565
566
567 public Multimap<String, String> getImportDataPkIncludes() {
568 return synchroImportContext.getDataPkIncludes();
569 }
570
571
572
573
574
575
576 public boolean isForceDuplication() {
577 return synchroImportContext.isForceDuplication();
578 }
579
580
581
582
583
584
585 public void setImportDataForceEditedRowOverride(boolean forceEditedDataOverride) {
586 synchroImportContext.setDataForceEditedRowOverride(forceEditedDataOverride);
587 }
588
589
590
591
592
593
594 public boolean isImportDataForceEditedRowOverride() {
595 return synchroImportContext.isDataForceEditedRowOverride();
596 }
597
598
599
600
601
602
603
604 public String getExportJobId() {
605 return synchroExportContext.getJobId();
606 }
607
608
609
610
611
612
613 public void setExportJobId(String jobId) {
614 synchroExportContext.setJobId(jobId);
615 }
616
617
618
619
620
621
622 public String getExportFileName() {
623 return synchroExportContext.getFileName();
624 }
625
626
627
628
629
630
631 public void setExportFileName(String fileName) {
632 synchroExportContext.setFileName(fileName);
633 }
634
635
636
637
638
639
640
641 public File getImportDirectory() {
642 return new File(mainContext.getConfiguration().getSynchroUserDirectory(), IMPORT_DIRECTORY);
643 }
644
645
646
647
648 public void loadImportContext() {
649
650
651 {
652 File dbVersionFile = ApplicationUpdater.getVersionFile(mainContext.getConfiguration().getDbDirectory());
653 String dbVersion = null;
654 if (dbVersionFile.exists()) {
655 try {
656 dbVersion = Files.asCharSource(dbVersionFile, Charset.defaultCharset()).readFirstLine();
657 } catch (IOException ex) {
658 throw new Quadrige2TechnicalException(I18n.t("quadrige2.error.read.file", dbVersionFile.getAbsolutePath()), ex);
659 }
660 }
661
662 Date importReferentialUpdateDate = DateVersions.safeConvertVersion2Date(dbVersion,
663 Quadrige2Configuration.getInstance().getDbTimezone());
664 setImportReferentialUpdateDate(importReferentialUpdateDate);
665 }
666
667 File file = getImportContextFile();
668 if (file.exists()) {
669 Properties p = new Properties();
670 Reader reader = null;
671 try {
672 reader = Files.newReader(file, Charsets.UTF_8);
673 p.load(reader);
674 } catch (IOException ex) {
675 throw new Quadrige2TechnicalException(I18n.t("quadrige2.error.read.file", file.getAbsolutePath()), ex);
676 } finally {
677 IOUtils.closeQuietly(reader);
678 }
679
680
681 setStatus(SynchroProgressionStatus.valueOf(
682 p.getProperty(PROPERTY_PROGRESSION_STATUS, SynchroProgressionStatus.NOT_STARTED.name())));
683
684
685 setImportJobId(p.getProperty(SynchroImportContextVO.PROPERTY_JOB_ID));
686
687
688 setImportReferential(Boolean.parseBoolean(p.getProperty(SynchroImportContextVO.PROPERTY_WITH_REFERENTIAL)));
689 setImportData(Boolean.parseBoolean(p.getProperty(SynchroImportContextVO.PROPERTY_WITH_DATA)));
690
691
692 setImportDataUpdateDate(Dates.safeParseDate(p.getProperty(SynchroImportContextVO.PROPERTY_DATA_UPDATE_DATE), DATE_PATTERN));
693 setImportDataStartDate(Dates.safeParseDate(p.getProperty(SynchroImportContextVO.PROPERTY_DATA_START_DATE), DATE_PATTERN));
694 setImportDataEndDate(Dates.safeParseDate(p.getProperty(SynchroImportContextVO.PROPERTY_DATA_END_DATE), DATE_PATTERN));
695
696
697 Collection<String> programCodes = ConfigurationHelper.getList(SynchroImportContextVO.PROPERTY_DATA_PROGRAM_CODES, p);
698 if (CollectionUtils.isEmpty(programCodes)) {
699 setImportDataProgramCodes(null);
700 } else {
701 setImportDataProgramCodes(Sets.newHashSet(programCodes));
702 }
703
704
705
706 if (CollectionUtils.isNotEmpty(programCodes)) {
707 String keyPrefix = SynchroImportContextVO.PROPERTY_DATA_UPDATE_DATE + "_";
708
709
710
711 if (getImportDataStartDate() != null && getImportDataEndDate() != null) {
712 keyPrefix += DateUtil.formatDate(getImportDataStartDate(), PROPERTY_DATA_DATE_RANGE)
713 + "_"
714 + DateUtil.formatDate(getImportDataEndDate(), PROPERTY_DATA_DATE_RANGE)
715 + "_";
716 }
717
718 Date minUpdateDate = null;
719 for (String programCode : programCodes) {
720 String key = keyPrefix + programCode;
721 Date programUpdateDate = Dates.safeParseDate(p.getProperty(key), DATE_PATTERN);
722 if (programUpdateDate == null) {
723 minUpdateDate = null;
724 break;
725 }
726 if (minUpdateDate == null || programUpdateDate.before(minUpdateDate)) {
727 minUpdateDate = programUpdateDate;
728 }
729 }
730 setImportDataUpdateDate(minUpdateDate);
731 }
732
733
734
735 else if (getImportDataStartDate() != null && getImportDataEndDate() != null) {
736 String key = SynchroImportContextVO.PROPERTY_DATA_UPDATE_DATE + "_"
737 + DateUtil.formatDate(getImportDataStartDate(), PROPERTY_DATA_DATE_RANGE) + "_"
738 + DateUtil.formatDate(getImportDataEndDate(), PROPERTY_DATA_DATE_RANGE);
739 setImportDataUpdateDate(Dates.safeParseDate(p.getProperty(key), DATE_PATTERN));
740 }
741
742
743 setTransferFilename(p.getProperty(PROPERTY_TRANSFER_FILENAME));
744 String workingDirectoryPath = p.getProperty(PROPERTY_WORKING_DIRECTORY);
745 if (StringUtils.isNotBlank(workingDirectoryPath)) {
746 setWorkingDirectory(new File(workingDirectoryPath));
747 }
748 }
749 }
750
751
752
753
754 public void saveImportContext() {
755 saveImportContext(false, false);
756 }
757
758
759
760
761
762
763
764 public void saveImportContext(boolean saveDataDates, boolean saveVersionAppup) {
765
766 File file = getImportContextFile();
767
768
769 Properties p = new Properties();
770 if (file.exists() && file.isFile()) {
771 Reader reader = null;
772 try {
773 reader = Files.newReader(file, Charsets.UTF_8);
774 p.load(reader);
775 } catch (IOException ex) {
776 throw new Quadrige2TechnicalException(I18n.t("quadrige2.error.read.file", file.getAbsolutePath()), ex);
777 } finally {
778 IOUtils.closeQuietly(reader);
779 }
780 }
781
782
783 p.put(PROPERTY_PROGRESSION_STATUS, getStatus().name());
784
785
786 if (getImportJobId() != null) {
787 p.put(SynchroImportContextVO.PROPERTY_JOB_ID, getImportJobId());
788 } else {
789 p.remove(SynchroImportContextVO.PROPERTY_JOB_ID);
790 }
791
792
793 p.put(SynchroImportContextVO.PROPERTY_WITH_REFERENTIAL, Boolean.toString(isImportReferential()));
794 p.put(SynchroImportContextVO.PROPERTY_WITH_DATA, Boolean.toString(isImportData()));
795
796
797
798 ConfigurationHelper.setDate(
799 SynchroImportContextVO.PROPERTY_REFERENTIAL_UPDATE_DATE,
800 getImportReferentialUpdateDate(), DATE_PATTERN, true,
801 p);
802 ConfigurationHelper.setDate(
803 SynchroImportContextVO.PROPERTY_DATA_UPDATE_DATE,
804 getImportDataUpdateDate(), DATE_PATTERN, true,
805 p);
806 ConfigurationHelper.setDate(
807 SynchroImportContextVO.PROPERTY_DATA_START_DATE,
808 getImportDataStartDate(), DATE_PATTERN, true,
809 p);
810 ConfigurationHelper.setDate(
811 SynchroImportContextVO.PROPERTY_DATA_END_DATE,
812 getImportDataEndDate(), DATE_PATTERN, true,
813 p);
814
815
816 ConfigurationHelper.setMultimap(
817 SynchroImportContextVO.PROPERTY_REFERENTIAL_PK_INCLUDES,
818 getImportReferentialPkIncludes(),
819 p);
820 ConfigurationHelper.setMultimap(
821 SynchroImportContextVO.PROPERTY_DATA_PK_INCLUDES,
822 getImportDataPkIncludes(),
823 p);
824
825
826 ConfigurationHelper.setList(
827 SynchroImportContextVO.PROPERTY_DATA_PROGRAM_CODES,
828 getImportDataProgramCodes(),
829 p);
830
831
832 p.put(PROPERTY_PROGRESSION_STATUS, getStatus().name());
833
834 if (saveDataDates
835 && CollectionUtils.isNotEmpty(getImportDataProgramCodes())
836 && getImportDataUpdateDate() != null) {
837 String keyPrefix = SynchroImportContextVO.PROPERTY_DATA_UPDATE_DATE + "_";
838
839
840 if (getImportDataStartDate() != null
841 && getImportDataEndDate() != null) {
842 keyPrefix += DateUtil.formatDate(getImportDataStartDate(), PROPERTY_DATA_DATE_RANGE) + "_"
843 + DateUtil.formatDate(getImportDataEndDate(), PROPERTY_DATA_DATE_RANGE) + "_";
844 }
845
846 for (String programCode : getImportDataProgramCodes()) {
847 ConfigurationHelper.setDate(
848 keyPrefix + programCode,
849 getImportDataUpdateDate(), DATE_PATTERN, true,
850 p);
851 }
852
853 }
854
855
856 ConfigurationHelper.setString(
857 PROPERTY_TRANSFER_FILENAME,
858 getTransferFilename(),
859 p);
860 ConfigurationHelper.setFile(
861 PROPERTY_WORKING_DIRECTORY,
862 getWorkingDirectory(),
863 p);
864
865
866 if (saveVersionAppup && isImportReferential() && getImportReferentialUpdateDate() != null) {
867
868 File target = mainContext.getConfiguration().getDbDirectory();
869 File versionFile = ApplicationUpdater.getVersionFile(target);
870 String newVersion = DateVersions.convertDate2Version(
871 getImportReferentialUpdateDate(),
872 Quadrige2Configuration.getInstance().getDbTimezone()
873 ).toString();
874 if (log.isInfoEnabled()) {
875 log.info("Replace content of file " + versionFile + " with " + newVersion);
876 }
877 try {
878 ApplicationUpdater.storeVersionFile(target, newVersion);
879 } catch (IOException e) {
880 throw new Quadrige2TechnicalException(I18n.t("quadrige2.error.write.file", versionFile));
881 }
882 }
883
884
885 Writer writer = null;
886 try {
887 if (!file.exists()) {
888 Files.createParentDirs(file);
889 file.createNewFile();
890 }
891 writer = Files.newWriter(file, Charsets.UTF_8);
892 p.store(writer, null);
893 } catch (IOException ex) {
894 throw new Quadrige2TechnicalException(I18n.t("quadrige2.error.write.file", file.getAbsolutePath()), ex);
895 } finally {
896 IOUtils.closeQuietly(writer);
897 }
898
899 }
900
901
902
903
904 public void resetImportContext() {
905
906 setWorkingDirectory(null);
907 setTransferFilename(null);
908 setImportJobId(null);
909 setStatus(SynchroProgressionStatus.NOT_STARTED);
910 setImportDataPkIncludes(null);
911 setForceDuplication(false);
912 setImportDataForceEditedRowOverride(false);
913 setDirection(null);
914
915 }
916
917
918
919
920
921
922
923 public File getExportDirectory() {
924 return new File(mainContext.getConfiguration().getSynchroUserDirectory(), EXPORT_DIRECTORY);
925 }
926
927
928
929
930 public void loadExportContext() {
931
932 File file = getExportContextFile();
933 if (file.exists()) {
934 Properties p = new Properties();
935 Reader reader = null;
936 try {
937 reader = Files.newReader(file, Charsets.UTF_8);
938 p.load(reader);
939 } catch (IOException ex) {
940 throw new Quadrige2TechnicalException(I18n.t("quadrige2.error.read.file", file.getAbsolutePath()), ex);
941 } finally {
942 IOUtils.closeQuietly(reader);
943 }
944
945
946 setStatus(SynchroProgressionStatus.valueOf(
947 p.getProperty(PROPERTY_PROGRESSION_STATUS, SynchroProgressionStatus.NOT_STARTED.name())));
948
949
950 setExportJobId(p.getProperty(SynchroExportContextVO.PROPERTY_JOB_ID));
951
952
953 Collection<String> programCodes = ConfigurationHelper.getList(SynchroExportContextVO.PROPERTY_DATA_PROGRAM_CODES, p);
954 if (CollectionUtils.isEmpty(programCodes)) {
955 setExportDataProgramCodes(null);
956 } else {
957 setExportDataProgramCodes(Sets.newHashSet(programCodes));
958 }
959
960
961 setExportFileName(p.getProperty(SynchroExportContextVO.PROPERTY_FILE_NAME));
962
963 setTransferFilename(p.getProperty(PROPERTY_TRANSFER_FILENAME));
964 String workingDirectoryPath = p.getProperty(PROPERTY_WORKING_DIRECTORY);
965 if (StringUtils.isNotBlank(workingDirectoryPath)) {
966 setWorkingDirectory(new File(workingDirectoryPath));
967 }
968
969 }
970 }
971
972
973
974
975 public void saveExportContext() {
976
977 File file = getExportContextFile();
978 Properties p = new Properties();
979
980
981 p.put(PROPERTY_PROGRESSION_STATUS, getStatus().name());
982
983
984 if (getExportJobId() != null) {
985 p.put(SynchroExportContextVO.PROPERTY_JOB_ID, getExportJobId());
986 }
987
988
989 ConfigurationHelper.setList(
990 SynchroExportContextVO.PROPERTY_DATA_PROGRAM_CODES,
991 getExportDataProgramCodes(),
992 p);
993
994
995 if (getExportFileName() != null) {
996 p.put(SynchroExportContextVO.PROPERTY_FILE_NAME, getExportFileName());
997 }
998 if (getTransferFilename() != null) {
999 p.put(PROPERTY_TRANSFER_FILENAME, getTransferFilename());
1000 }
1001 if (getWorkingDirectory() != null) {
1002 p.put(PROPERTY_WORKING_DIRECTORY, getWorkingDirectory().getAbsolutePath());
1003 }
1004
1005
1006 Writer writer = null;
1007 try {
1008 if (!file.exists()) {
1009 Files.createParentDirs(file);
1010 file.createNewFile();
1011 }
1012 writer = Files.newWriter(file, Charsets.UTF_8);
1013 p.store(writer, null);
1014 } catch (IOException ex) {
1015 throw new Quadrige2TechnicalException(I18n.t("quadrige2.error.write.file", file.getAbsolutePath()), ex);
1016 } finally {
1017 IOUtils.closeQuietly(writer);
1018 }
1019 }
1020
1021
1022
1023
1024 public void resetExportContext() {
1025
1026 setExportFileName(null);
1027 setWorkingDirectory(null);
1028 setTransferFilename(null);
1029 setExportJobId(null);
1030 setStatus(SynchroProgressionStatus.NOT_STARTED);
1031 setDirection(null);
1032
1033 }
1034
1035
1036 private File getImportContextFile() {
1037 return new File(mainContext.getConfiguration().getSynchroUserDirectory(), IMPORT_PROPERTIES);
1038 }
1039
1040 private File getExportContextFile() {
1041 return new File(mainContext.getConfiguration().getSynchroUserDirectory(), EXPORT_PROPERTIES);
1042 }
1043
1044 private void updateTitle() {
1045 String newTitle = null;
1046 if (direction != null) {
1047
1048 if (direction == SynchroDirection.IMPORT && isImportData()) {
1049 newTitle = t("quadrige2.synchro.import.data");
1050 } else {
1051 newTitle = direction.getLabel();
1052 }
1053 }
1054
1055 setTitle(newTitle);
1056 }
1057
1058
1059 @Override
1060 public void close() throws IOException {
1061
1062 PropertyChangeListener[] listeners = getPropertyChangeListeners();
1063 for (PropertyChangeListener listener : listeners) {
1064 if (log.isDebugEnabled()) {
1065 log.debug("Remove listener: " + listener);
1066 }
1067 removePropertyChangeListener(listener);
1068 }
1069 }
1070
1071
1072 @Override
1073 public void firePropertyChanged(String propertyName, Object oldValue, Object newValue) {
1074 firePropertyChange(propertyName, oldValue, newValue);
1075 }
1076
1077 @Override
1078 public void fireIndexedPropertyChanged(String propertyName, int index, Object oldValue, Object newValue) {
1079 fireIndexedPropertyChange(propertyName, index, oldValue, newValue);
1080 }
1081 }