branch develop updated (1f718cb -> 7c138f2)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository tutti. See http://git.codelutin.com/tutti.git from 1f718cb fixes #6157 Merge branch 'feature/6157' into develop new 2db3d09 refs #6129 [IMPORT SUMATRA] Import des valeurs des PSFMs et des champs du trait new 3bbb702 refs #6129 new b1b82c0 refs #5954 add v2 version new 9c6de72 refs #6129 [IMPORT SUMATRA] Import des valeurs des PSFMs et des champs du trait new b0cdc86 refs #6129 import du fichier avec les colonnes new b046594 refs #6129 mapping des champs du trait avec les colonnes + début import dans le trait new 4085ac3 refactoring : table des caractéristiques non éditable, ajouter les caractéristiques depuis la liste déroulante au dessus new c2893a7 - ne pas proposer les caractéristiques déjà ajoutées dans d'autres onglets - possibilité de supprimer des caractéristiques dans le tableau (clic droit) new 4b7efb2 correction de la suppression new 490685c import new 65484e6 empecher de saisir plusieurs fois la même colonne dans les caracteristiques new b3ac98d add todo new 34b8502 - error management - check the operation key to enable or not the import - import locations new 8cb32da fix import of lists new a899157 ajout javadoc + nettoyage imports new 45aacd5 ajout service d'import des caractéristicques d'un trait new 51e78a2 renommage de l'action d'import de caracteristiques d'un trait + utilisation du service dédié new e62c69c utilisation d'une exception si colonne non trouvee dans le header new 97b6318 fix imports new d5d1292 refs #6129 fix export new 7c138f2 remove fixme The 21 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 7c138f2df004a99203c4c69467f7cfceffdbba08 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 16:15:49 2014 +0100 remove fixme commit d5d12920c295169afe48f8b856c0c207f6425e94 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 16:14:39 2014 +0100 refs #6129 fix export commit 97b6318484b7899d9d97ac5525896ccefb915367 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 16:01:05 2014 +0100 fix imports commit e62c69c78d2b2f1a46220eebec34a75b64bcb9d5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:58:19 2014 +0100 utilisation d'une exception si colonne non trouvee dans le header commit 51e78a270fc20df29a75fd8a7f2a52c026b9661a Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:44 2014 +0100 renommage de l'action d'import de caracteristiques d'un trait + utilisation du service dédié commit 45aacd562efa18241aba5280b93d851112a67dbb Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:11 2014 +0100 ajout service d'import des caractéristicques d'un trait commit a899157b71c88fedf2bce5904e4b69beb03c7e71 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:49:30 2014 +0100 ajout javadoc + nettoyage imports commit 8cb32da105caf5bc9ff8117404e4e1995ae6b536 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 12:09:26 2014 +0100 fix import of lists commit 34b8502bf937aab63b64aa6951cb757d6fa72607 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 11:10:25 2014 +0100 - error management - check the operation key to enable or not the import - import locations commit b3ac98d4023cbe64baa8f4ae47d7cbed9b141d55 Author: Kevin Morin <morin@codelutin.com> Date: Wed Dec 10 09:30:38 2014 +0100 add todo commit 65484e68b6aaf38f8b8039a26cf878aab06528cd Author: Kevin Morin <morin@codelutin.com> Date: Wed Dec 10 09:22:20 2014 +0100 empecher de saisir plusieurs fois la même colonne dans les caracteristiques commit 490685cf85e9b1e2989419a82b7926153bc5df67 Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 9 18:23:03 2014 +0100 import commit 4b7efb2105e9a90667277c15ad8e2d5fc904fddc Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 9 12:21:12 2014 +0100 correction de la suppression commit c2893a748ac4ed780cab491239b0800aef5d8819 Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 9 10:28:40 2014 +0100 - ne pas proposer les caractéristiques déjà ajoutées dans d'autres onglets - possibilité de supprimer des caractéristiques dans le tableau (clic droit) commit 4085ac33909c11155d147699cab8ff455aad835f Author: Kevin Morin <morin@codelutin.com> Date: Mon Dec 8 17:38:25 2014 +0100 refactoring : table des caractéristiques non éditable, ajouter les caractéristiques depuis la liste déroulante au dessus commit b0465940ceaa9e704ca6462d9a4d2ae4343eeda8 Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 2 19:09:14 2014 +0100 refs #6129 mapping des champs du trait avec les colonnes + début import dans le trait commit b0cdc86ec757be55502b2422fefcbfc8c34ecfc6 Author: Kevin Morin <morin@codelutin.com> Date: Mon Dec 1 14:47:06 2014 +0100 refs #6129 import du fichier avec les colonnes commit 9c6de7275dba89759d4f814c2fa9fea4f6fc8a64 Author: Kevin Morin <morin@codelutin.com> Date: Thu Nov 27 16:37:05 2014 +0100 refs #6129 [IMPORT SUMATRA] Import des valeurs des PSFMs et des champs du trait commit b1b82c0687e79fb76051b09a9a849041c0515ca4 Author: Kevin Morin <morin@codelutin.com> Date: Mon Nov 24 14:31:13 2014 +0100 refs #5954 add v2 version commit 3bbb702c9e1b55dff5f74a12d66491d012d72b78 Author: Kevin Morin <morin@codelutin.com> Date: Mon Nov 24 11:05:10 2014 +0100 refs #6129 commit 2db3d09d159bf8f477aafd093425c307c0bf1387 Author: Kevin Morin <morin@codelutin.com> Date: Thu Nov 20 11:12:18 2014 +0100 refs #6129 [IMPORT SUMATRA] Import des valeurs des PSFMs et des champs du trait Summary of changes: .../entities}/protocol/CaracteristicType.java | 16 +- .../entities/protocol/TuttiProtocols.java | 180 ++++++-- .../TuttiProtocol1.java => v2/TuttiProtocol2.java} | 101 +++-- .../TuttiProtocolBean2.java} | 194 ++++++--- .../service/ProtocolPersistenceServiceImpl.java | 3 +- .../i18n/tutti-persistence_en_GB.properties | 4 + .../src/main/xmi/tutti-persistence.properties | 3 +- .../src/main/xmi/tutti-persistence.zargo | Bin 56767 -> 57983 bytes ...-persistence.zargo => tutti-persistence.zargo~} | Bin 56767 -> 57983 bytes .../entities/protocol/TuttiProtocolsTest.java | 18 +- .../ProtocolPersistenceServiceReadTest.java | 11 +- .../fr/ifremer/tutti/service/DecoratorService.java | 11 + .../fr/ifremer/tutti/service/TuttiCsvUtil.java | 70 +++ .../FishingOperationImportService.java | 167 ++++++++ ...olumnFileFishingOperationNotFoundException.java | 15 + .../ImportFromColumnFileInvalidRowException.java | 29 ++ ...ImportFromColumnFileMissingHeaderException.java | 24 ++ .../operationimport/ImportFromColumnFileModel.java | 210 +++++++++ .../tutti/service/protocol/CaracteristicRow.java | 1 + .../service/protocol/CaracteristicRowModel.java | 2 +- .../protocol/ProtocolImportExportService.java | 58 ++- .../resources/i18n/tutti-service_en_GB.properties | 8 + .../resources/i18n/tutti-service_fr_FR.properties | 5 + .../protocol/ProtocolImportExportServiceTest.java | 35 +- .../filtered-resources/tutti-help-fr.properties | 8 +- .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 5 + ...ion.java => AddCaracteristicMappingAction.java} | 49 +-- ...perationCaracteristicsFromColumnFileAction.java | 128 ++++++ .../swing/action/ImportProtocolBenthosAction.java | 2 +- .../swing/action/ImportProtocolSpeciesAction.java | 2 +- .../action/LoadProtocolImportColumnsAction.java | 62 +++ .../action/RemoveCaracteristicMappingAction.java | 105 +++++ .../tutti/ui/swing/action/SaveProtocolAction.java | 29 ++ .../content/operation/EditFishingOperationUI.css | 10 + .../content/operation/EditFishingOperationUI.jaxx | 1 + .../operation/EditFishingOperationUIHandler.java | 18 + .../operation/EditFishingOperationUIModel.java | 13 + .../fishing/AbstractCaracteristicTabUIHandler.java | 26 +- .../fishing/GearUseFeatureTabUIHandler.java | 10 +- .../fishing/VesselUseFeatureTabUIHandler.java | 10 +- .../EditProtocolCaracteristicsRowModel.java | 94 ++++ .../EditProtocolCaracteristicsTableModel.java | 45 ++ .../EditProtocolOperationFieldsRowModel.java | 57 +++ .../EditProtocolOperationFieldsTableModel.java | 34 ++ .../ui/swing/content/protocol/EditProtocolUI.css | 63 ++- .../ui/swing/content/protocol/EditProtocolUI.jaxx | 46 +- .../content/protocol/EditProtocolUIHandler.java | 472 ++++++++++++++++----- .../content/protocol/EditProtocolUIModel.java | 353 +++++++++++---- .../resources/i18n/tutti-ui-swing_en_GB.properties | 36 +- .../resources/i18n/tutti-ui-swing_fr_FR.properties | 39 +- 50 files changed, 2439 insertions(+), 443 deletions(-) rename {tutti-service/src/main/java/fr/ifremer/tutti/service => tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities}/protocol/CaracteristicType.java (71%) copy tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/{v1/TuttiProtocol1.java => v2/TuttiProtocol2.java} (57%) copy tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/{v1/TuttiProtocolBean1.java => v2/TuttiProtocolBean2.java} (59%) copy tutti-persistence/src/main/xmi/{tutti-persistence.zargo => tutti-persistence.zargo~} (50%) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java copy tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/{AddSpeciesProtocolAction.java => AddCaracteristicMappingAction.java} (54%) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 2db3d09d159bf8f477aafd093425c307c0bf1387 Author: Kevin Morin <morin@codelutin.com> Date: Thu Nov 20 11:12:18 2014 +0100 refs #6129 [IMPORT SUMATRA] Import des valeurs des PSFMs et des champs du trait --- .../entities}/protocol/CaracteristicType.java | 2 +- .../entities/protocol/TuttiProtocols.java | 43 ++++++++ .../service/ProtocolPersistenceServiceImpl.java | 3 +- .../src/main/xmi/tutti-persistence.properties | 3 +- .../src/main/xmi/tutti-persistence.zargo | Bin 56767 -> 57378 bytes ...-persistence.zargo => tutti-persistence.zargo~} | Bin 56767 -> 57382 bytes .../entities/protocol/TuttiProtocolsTest.java | 18 +++- .../ProtocolPersistenceServiceReadTest.java | 11 +- .../tutti/service/protocol/CaracteristicRow.java | 1 + .../service/protocol/CaracteristicRowModel.java | 2 +- .../protocol/ProtocolImportExportService.java | 36 ++++--- .../protocol/ProtocolImportExportServiceTest.java | 35 +++++-- .../fishing/GearUseFeatureTabUIHandler.java | 10 +- .../fishing/VesselUseFeatureTabUIHandler.java | 10 +- .../ui/swing/content/protocol/EditProtocolUI.css | 10 -- .../ui/swing/content/protocol/EditProtocolUI.jaxx | 8 -- .../content/protocol/EditProtocolUIHandler.java | 26 +---- .../content/protocol/EditProtocolUIModel.java | 116 +++++---------------- 18 files changed, 166 insertions(+), 168 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicType.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java similarity index 94% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicType.java rename to tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java index 4f92c68..358a184 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicType.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.protocol; +package fr.ifremer.tutti.persistence.entities.protocol; /* * #%L diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index 2503372..32d4279 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -26,7 +26,11 @@ import com.esotericsoftware.yamlbeans.YamlConfig; import com.esotericsoftware.yamlbeans.YamlReader; import com.esotericsoftware.yamlbeans.YamlWriter; import com.google.common.base.Charsets; +import com.google.common.base.Function; import com.google.common.base.Joiner; +import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.io.Files; import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId; @@ -50,6 +54,8 @@ import org.nuiton.util.beans.BinderFactory; import java.io.BufferedWriter; import java.io.File; import java.io.Reader; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -378,4 +384,41 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } return null; } + + public static CaracteristicMappingRow caracteristicMappingRow(String pmfmId, CaracteristicType tab) { + CaracteristicMappingRow caracteristicMappingRow = new CaracteristicMappingRowBean(); + caracteristicMappingRow.setPmfmId(pmfmId); + caracteristicMappingRow.setTab(tab.name()); + return caracteristicMappingRow; + } + + public static List<String> gearUseFeaturePmfmIds(TuttiProtocol protocol) { + return pmfmIdsForCaracteristicType(protocol, CaracteristicType.GEAR_USE_FEATURE); + } + + public static List<String> vesselUseFeaturePmfmIds(TuttiProtocol protocol) { + return pmfmIdsForCaracteristicType(protocol, CaracteristicType.VESSEL_USE_FEATURE); + } + + public static List<String> pmfmIdsForCaracteristicType(TuttiProtocol protocol, final CaracteristicType type) { + Preconditions.checkNotNull(protocol); + Preconditions.checkNotNull(type); + + List<CaracteristicMappingRow> caracteristicMapping = protocol.getCaracteristicMapping(); + Collection<CaracteristicMappingRow> gearUseFeatureCaracteristics = + Collections2.filter(caracteristicMapping, new Predicate<CaracteristicMappingRow>() { + @Override + public boolean apply(CaracteristicMappingRow caracteristicMappingRow) { + return type.equals(caracteristicMappingRow.getTab()); + } + }); + + Collection<String> pmfmIds = Collections2.transform(gearUseFeatureCaracteristics, new Function<CaracteristicMappingRow, String>() { + @Override + public String apply(CaracteristicMappingRow caracteristicMappingRow) { + return caracteristicMappingRow.getPmfmId(); + } + }); + return new ArrayList<>(pmfmIds); + } } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java index b3b6279..b5952ae 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java @@ -152,8 +152,7 @@ public class ProtocolPersistenceServiceImpl extends AbstractPersistenceService i // result.setVesselUseFeaturePmfmId(TuttiEntities.getList(bean.getVesselUseFeaturePmfmId())); // result.setGearUseFeaturePmfmId(TuttiEntities.getList(bean.getGearUseFeaturePmfmId())); result.setLengthClassesPmfmId(bean.getLengthClassesPmfmId()); - result.setVesselUseFeaturePmfmId(bean.getVesselUseFeaturePmfmId()); - result.setGearUseFeaturePmfmId(bean.getGearUseFeaturePmfmId()); + result.setCaracteristicMapping(bean.getCaracteristicMapping()); Binder<SpeciesProtocol, SpeciesProtocol> speciesProtocolBinder = BinderFactory.newBinder(SpeciesProtocol.class); List<SpeciesProtocol> species = Lists.newArrayList(); diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.properties b/tutti-persistence/src/main/xmi/tutti-persistence.properties index a69a326..0431cee 100644 --- a/tutti-persistence/src/main/xmi/tutti-persistence.properties +++ b/tutti-persistence/src/main/xmi/tutti-persistence.properties @@ -39,8 +39,7 @@ fr.ifremer.tutti.persistence.entities.data.FishingOperation.attribute.secondaryV fr.ifremer.tutti.persistence.entities.data.SpeciesBatch.attribute.childBatchs.stereotype=ordered fr.ifremer.tutti.persistence.entities.data.BenthosBatch.attribute.childBatchs.stereotype=ordered -fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.gearUseFeaturePmfmId.stereotype=ordered -fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.vesselUseFeaturePmfmId.stereotype=ordered +fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.caracteristicMapping.stereotype=ordered fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.individualObservationPmfmId.stereotype=ordered fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.lengthClassesPmfmId.stereotype=ordered fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.species.stereotype=ordered diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo b/tutti-persistence/src/main/xmi/tutti-persistence.zargo index 6a566b8..982bb6a 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo differ diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ similarity index 51% copy from tutti-persistence/src/main/xmi/tutti-persistence.zargo copy to tutti-persistence/src/main/xmi/tutti-persistence.zargo~ index 6a566b8..2d2cc86 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ differ diff --git a/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocolsTest.java b/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocolsTest.java index 9993a55..622ee61 100644 --- a/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocolsTest.java +++ b/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocolsTest.java @@ -180,8 +180,13 @@ public class TuttiProtocolsTest { Assert.assertEquals("protocolName", protocol.getName()); Assert.assertEquals("Commentaire", protocol.getComment()); Assert.assertEquals(Lists.newArrayList("14", "18"), protocol.getLengthClassesPmfmId()); - Assert.assertEquals(Lists.newArrayList("114", "228", "821"), protocol.getVesselUseFeaturePmfmId()); - Assert.assertEquals(Lists.newArrayList("21", "22"), protocol.getGearUseFeaturePmfmId()); + Assert.assertEquals(Lists.newArrayList( + TuttiProtocols.caracteristicMappingRow("114", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("228", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("821", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("21", CaracteristicType.GEAR_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("22", CaracteristicType.GEAR_USE_FEATURE)), + protocol.getCaracteristicMapping()); Assert.assertNotNull(protocol.getSpecies()); Assert.assertEquals(2, protocol.getSpecies().size()); @@ -251,8 +256,13 @@ public class TuttiProtocolsTest { protocol.setName("protocolName"); protocol.setComment("Commentaire"); protocol.setLengthClassesPmfmId(Lists.newArrayList("14", "18")); - protocol.setVesselUseFeaturePmfmId(Lists.newArrayList("114", "228", "821")); - protocol.setGearUseFeaturePmfmId(Lists.newArrayList("21", "22")); + + protocol.setCaracteristicMapping(Lists.newArrayList( + TuttiProtocols.caracteristicMappingRow("114", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("228", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("821", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("21", CaracteristicType.GEAR_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("22", CaracteristicType.GEAR_USE_FEATURE))); protocol.setSpecies(Lists.<SpeciesProtocol>newArrayList()); SpeciesProtocol sp1 = SpeciesProtocols.newSpeciesProtocol(); diff --git a/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceReadTest.java b/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceReadTest.java index b303c78..1cb0ed8 100644 --- a/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceReadTest.java +++ b/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceReadTest.java @@ -28,6 +28,7 @@ import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocols; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.test.DatabaseResource; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; @@ -93,8 +94,13 @@ public class ProtocolPersistenceServiceReadTest { protocol.setName("protocolName"); protocol.setComment("Commentaire"); protocol.setLengthClassesPmfmId(Lists.newArrayList("14", "18")); - protocol.setVesselUseFeaturePmfmId(Lists.newArrayList("114", "228", "821")); - protocol.setGearUseFeaturePmfmId(Lists.newArrayList("21", "22")); + + protocol.setCaracteristicMapping(Lists.newArrayList( + TuttiProtocols.caracteristicMappingRow("114", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("228", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("821", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("21", CaracteristicType.GEAR_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("22", CaracteristicType.GEAR_USE_FEATURE))); protocol.setSpecies(Lists.<SpeciesProtocol>newArrayList()); SpeciesProtocol sp1 = SpeciesProtocols.newSpeciesProtocol(); @@ -154,4 +160,5 @@ public class ProtocolPersistenceServiceReadTest { return protocol; } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRow.java index 242a07f..a4ac8de 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRow.java @@ -22,6 +22,7 @@ package fr.ifremer.tutti.service.protocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import java.io.Serializable; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRowModel.java index b622d39..5a6b244 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/CaracteristicRowModel.java @@ -24,7 +24,7 @@ package fr.ifremer.tutti.service.protocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.service.TuttiCsvUtil; -import org.nuiton.csv.Common; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import java.util.Map; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java index 5f7a4c9..442f8e9 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java @@ -30,6 +30,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; import com.google.common.io.Files; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocols; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -37,8 +38,7 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.AbstractTuttiService; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -129,15 +129,16 @@ public class ProtocolImportExportService extends AbstractTuttiService { ids.get(CaracteristicType.LENGTH_STEP)) ); - protocol.setVesselUseFeaturePmfmId( - mergeIds(protocol.getVesselUseFeaturePmfmId(), - ids.get(CaracteristicType.VESSEL_USE_FEATURE)) - ); - - protocol.setGearUseFeaturePmfmId( - mergeIds(protocol.getGearUseFeaturePmfmId(), - ids.get(CaracteristicType.GEAR_USE_FEATURE)) - ); + //FIXME +// protocol.setVesselUseFeaturePmfmId( +// mergeIds(protocol.getVesselUseFeaturePmfmId(), +// ids.get(CaracteristicType.VESSEL_USE_FEATURE)) +// ); +// +// protocol.setGearUseFeaturePmfmId( +// mergeIds(protocol.getGearUseFeaturePmfmId(), +// ids.get(CaracteristicType.GEAR_USE_FEATURE)) +// ); protocol.setIndividualObservationPmfmId( mergeIds(protocol.getIndividualObservationPmfmId(), @@ -194,15 +195,16 @@ public class ProtocolImportExportService extends AbstractTuttiService { rows.addAll(Lists.transform(protocol.getLengthClassesPmfmId(), function)); } - if (!protocol.isVesselUseFeaturePmfmIdEmpty()) { + + //FIXME + if (!protocol.isCaracteristicMappingEmpty()) { function.setType(CaracteristicType.VESSEL_USE_FEATURE); - rows.addAll(Lists.transform(protocol.getVesselUseFeaturePmfmId(), function)); + for (CaracteristicMappingRow mappingRow : protocol.getCaracteristicMapping()) { + function.setType(CaracteristicType.valueOf(mappingRow.getTab())); + rows.add(function.apply(mappingRow.getPmfmId())); + } } - if (!protocol.isGearUseFeaturePmfmIdEmpty()) { - function.setType(CaracteristicType.GEAR_USE_FEATURE); - rows.addAll(Lists.transform(protocol.getGearUseFeaturePmfmId(), function)); - } if (!protocol.isIndividualObservationPmfmIdEmpty()) { function.setType(CaracteristicType.INDIVIDUAL_OBSERVATION); diff --git a/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportServiceTest.java b/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportServiceTest.java index 270807c..b137692 100644 --- a/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportServiceTest.java +++ b/tutti-service/src/test/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportServiceTest.java @@ -26,6 +26,7 @@ import com.google.common.base.Charsets; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.Files; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocols; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -189,8 +190,13 @@ public class ProtocolImportExportServiceTest { protocol.setName("protocolName"); protocol.setComment("Commentaire"); protocol.setLengthClassesPmfmId(Lists.newArrayList("14", "18")); - protocol.setVesselUseFeaturePmfmId(Lists.newArrayList("114", "228", "821")); - protocol.setGearUseFeaturePmfmId(Lists.newArrayList("21", "22")); + protocol.setCaracteristicMapping(Lists.newArrayList( + TuttiProtocols.caracteristicMappingRow("114", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("228", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("821", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("21", CaracteristicType.GEAR_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("262", CaracteristicType.GEAR_USE_FEATURE) + )); protocol.setIndividualObservationPmfmId(Lists.newArrayList("25", "26")); protocol.setSpecies(Lists.<SpeciesProtocol>newArrayList()); @@ -271,8 +277,14 @@ public class ProtocolImportExportServiceTest { Assert.assertEquals("protocolName", protocol.getName()); Assert.assertEquals("Commentaire", protocol.getComment()); Assert.assertEquals(Lists.newArrayList("14", "18"), protocol.getLengthClassesPmfmId()); - Assert.assertEquals(Lists.newArrayList("114", "228", "821"), protocol.getVesselUseFeaturePmfmId()); - Assert.assertEquals(Lists.newArrayList("21", "22"), protocol.getGearUseFeaturePmfmId()); + Assert.assertEquals(Lists.newArrayList( + TuttiProtocols.caracteristicMappingRow("114", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("228", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("821", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("21", CaracteristicType.GEAR_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("262", CaracteristicType.GEAR_USE_FEATURE) + ), + protocol.getCaracteristicMapping()); Assert.assertEquals(Lists.newArrayList("25", "26"), protocol.getIndividualObservationPmfmId()); Assert.assertNotNull(protocol.getSpecies()); @@ -352,10 +364,11 @@ public class ProtocolImportExportServiceTest { Assert.assertEquals(Lists.newArrayList("1"), protocol.getLengthClassesPmfmId()); - Assert.assertEquals(Lists.newArrayList("2"), - protocol.getVesselUseFeaturePmfmId()); - Assert.assertEquals(Lists.newArrayList("3"), - protocol.getGearUseFeaturePmfmId()); + Assert.assertEquals(Lists.newArrayList( + TuttiProtocols.caracteristicMappingRow("2", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("3", CaracteristicType.GEAR_USE_FEATURE) + ), + protocol.getCaracteristicMapping()); Assert.assertEquals(Lists.newArrayList("4"), protocol.getIndividualObservationPmfmId()); } @@ -387,8 +400,10 @@ public class ProtocolImportExportServiceTest { TuttiProtocol protocol = TuttiProtocols.newTuttiProtocol(); protocol.setLengthClassesPmfmId(Lists.newArrayList("1")); - protocol.setVesselUseFeaturePmfmId(Lists.newArrayList("2")); - protocol.setGearUseFeaturePmfmId(Lists.newArrayList("3")); + protocol.setCaracteristicMapping(Lists.newArrayList( + TuttiProtocols.caracteristicMappingRow("2", CaracteristicType.VESSEL_USE_FEATURE), + TuttiProtocols.caracteristicMappingRow("3", CaracteristicType.GEAR_USE_FEATURE) + )); protocol.setIndividualObservationPmfmId(Lists.newArrayList("4")); Assert.assertFalse(file.exists()); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/GearUseFeatureTabUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/GearUseFeatureTabUIHandler.java index 4b7fabb..bf859b2 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/GearUseFeatureTabUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/GearUseFeatureTabUIHandler.java @@ -22,8 +22,14 @@ package fr.ifremer.tutti.ui.swing.content.operation.fishing; * #L% */ +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicValueEditor; @@ -32,6 +38,8 @@ import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -65,7 +73,7 @@ public class GearUseFeatureTabUIHandler extends AbstractCaracteristicTabUIHandle @Override protected List<String> getProtocolPmfmIds() { - return getDataContext().getProtocol().getGearUseFeaturePmfmId(); + return TuttiProtocols.gearUseFeaturePmfmIds(getDataContext().getProtocol()); } //------------------------------------------------------------------------// diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/VesselUseFeatureTabUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/VesselUseFeatureTabUIHandler.java index b21f980..6f77d9c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/VesselUseFeatureTabUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/VesselUseFeatureTabUIHandler.java @@ -22,8 +22,14 @@ package fr.ifremer.tutti.ui.swing.content.operation.fishing; * #L% */ +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicValueEditor; @@ -32,6 +38,8 @@ import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -65,7 +73,7 @@ public class VesselUseFeatureTabUIHandler extends AbstractCaracteristicTabUIHand @Override protected List<String> getProtocolPmfmIds() { - return getDataContext().getProtocol().getVesselUseFeaturePmfmId(); + return TuttiProtocols.vesselUseFeaturePmfmIds(getDataContext().getProtocol()); } //------------------------------------------------------------------------// diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css index 9011a91..9b882b7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css @@ -113,16 +113,6 @@ JTextField { _help: {"tutti.editProtocol.pane.caracteristic.help"}; } -#gearUseFeatureList { - property: gearUseFeaturePmfm; - _help: {"tutti.editProtocol.field.gearUseFeature.help"}; -} - -#vesselUseFeatureList { - property: vesselUseFeaturePmfm; - _help: {"tutti.editProtocol.field.vesselUseFeature.help"}; -} - #individualObservationList { property: individualObservationPmfm; _help: {"tutti.editProtocol.field.individualObservation.help"}; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx index 22e70ec..0ca8922 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx @@ -113,18 +113,10 @@ <tab title='tutti.editProtocol.tab.caracteristic.lengthClasses'> <BeanDoubleList id='lengthClassesList' genericType='Caracteristic'/> </tab> - <tab title='tutti.editProtocol.tab.caracteristic.gearUseFeature'> - <BeanDoubleList id='gearUseFeatureList' - genericType='Caracteristic'/> - </tab> <tab title='tutti.editProtocol.tab.caracteristic.individualObservation'> <BeanDoubleList id='individualObservationList' genericType='Caracteristic'/> </tab> - <tab title='tutti.editProtocol.tab.caracteristic.vesselUseFeature'> - <BeanDoubleList id='vesselUseFeatureList' - genericType='Caracteristic'/> - </tab> </JTabbedPane> </JPanel> </tab> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index d14a898..0913491 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -409,9 +409,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI allDoubleLists = Lists.newArrayList( this.ui.getLengthClassesList(), - this.ui.getGearUseFeatureList(), - this.ui.getIndividualObservationList(), - this.ui.getVesselUseFeatureList() + this.ui.getIndividualObservationList() ); initDoubleList(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, @@ -419,16 +417,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI Lists.newArrayList(model.getCaracteristics()), model.getLengthClassesPmfmId()); - initDoubleList(EditProtocolUIModel.PROPERTY_GEAR_USE_FEATURE_PMFM_ID, - this.ui.getGearUseFeatureList(), - Lists.newArrayList(model.getCaracteristics()), - model.getGearUseFeaturePmfmId()); - - initDoubleList(EditProtocolUIModel.PROPERTY_VESSEL_USE_FEATURE_PMFM_ID, - this.ui.getVesselUseFeatureList(), - Lists.newArrayList(model.getCaracteristics()), - model.getVesselUseFeaturePmfmId()); - initDoubleList(EditProtocolUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_PMFM_ID, this.ui.getIndividualObservationList(), Lists.newArrayList(model.getCaracteristics()), @@ -450,17 +438,13 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI break; case 1: - selectedDoubleList = EditProtocolUIHandler.this.ui.getGearUseFeatureList(); - break; - - case 2: +// selectedDoubleList = EditProtocolUIHandler.this.ui.getGearUseFeatureList(); +// break; +// +// case 2: selectedDoubleList = EditProtocolUIHandler.this.ui.getIndividualObservationList(); break; - case 3: - selectedDoubleList = EditProtocolUIHandler.this.ui.getVesselUseFeatureList(); - break; - default: selectedDoubleList = null; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index 268317f..eed2950 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.content.protocol; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; @@ -139,15 +140,10 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, setLengthClassesPmfmId(ids); } - public void setGearUseFeaturePmfm(List<Caracteristic> gearUseFeaturePmfm) { - List<String> ids = TuttiEntities.collecIds(gearUseFeaturePmfm); - setGearUseFeaturePmfmId(ids); - } - - public void setVesselUseFeaturePmfm(List<Caracteristic> vesselUseFeaturePmfm) { - List<String> ids = TuttiEntities.collecIds(vesselUseFeaturePmfm); - setVesselUseFeaturePmfmId(ids); - } +// public void setGearUseFeaturePmfm(List<Caracteristic> gearUseFeaturePmfm) { +// List<String> ids = TuttiEntities.collecIds(gearUseFeaturePmfm); +// setGearUseFeaturePmfmId(ids); +// } public void setIndividualObservationPmfm(List<Caracteristic> individualObservationPmfm) { List<String> ids = TuttiEntities.collecIds(individualObservationPmfm); @@ -322,28 +318,6 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, } @Override - public List<String> getGearUseFeaturePmfmId() { - return editObject.getGearUseFeaturePmfmId(); - } - - @Override - public void setGearUseFeaturePmfmId(List<String> gearUseFeaturePmfmId) { - editObject.setGearUseFeaturePmfmId(gearUseFeaturePmfmId); - firePropertyChange(PROPERTY_GEAR_USE_FEATURE_PMFM_ID, null, gearUseFeaturePmfmId); - } - - @Override - public List<String> getVesselUseFeaturePmfmId() { - return editObject.getVesselUseFeaturePmfmId(); - } - - @Override - public void setVesselUseFeaturePmfmId(List<String> vesselUseFeaturePmfmId) { - editObject.setVesselUseFeaturePmfmId(vesselUseFeaturePmfmId); - firePropertyChange(PROPERTY_VESSEL_USE_FEATURE_PMFM_ID, null, vesselUseFeaturePmfmId); - } - - @Override public List<String> getIndividualObservationPmfmId() { return editObject.getIndividualObservationPmfmId(); } @@ -355,93 +329,59 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, } @Override - public String getGearUseFeaturePmfmId(int index) { - return editObject.getGearUseFeaturePmfmId(index); - } - - @Override - public boolean isGearUseFeaturePmfmIdEmpty() { - return editObject.isGearUseFeaturePmfmIdEmpty(); - } - - @Override - public int sizeGearUseFeaturePmfmId() { - return editObject.sizeGearUseFeaturePmfmId(); - } - - @Override - public void addGearUseFeaturePmfmId(String gearUseFeaturePmfmId) { - editObject.addGearUseFeaturePmfmId(gearUseFeaturePmfmId); - } - - @Override - public void addAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId) { - editObject.addAllGearUseFeaturePmfmId(gearUseFeaturePmfmId); - } - - @Override - public boolean removeGearUseFeaturePmfmId(String gearUseFeaturePmfmId) { - return editObject.removeGearUseFeaturePmfmId(gearUseFeaturePmfmId); - } - - @Override - public boolean removeAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId) { - return editObject.removeAllGearUseFeaturePmfmId(gearUseFeaturePmfmId); - } - - @Override - public boolean containsGearUseFeaturePmfmId(String gearUseFeaturePmfmId) { - return editObject.containsGearUseFeaturePmfmId(gearUseFeaturePmfmId); + public List<CaracteristicMappingRow> getCaracteristicMapping() { + return editObject.getCaracteristicMapping(); } @Override - public boolean containsAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId) { - return editObject.containsAllGearUseFeaturePmfmId(gearUseFeaturePmfmId); + public void setCaracteristicMapping(List<CaracteristicMappingRow> caracteristicMapping) { + editObject.setCaracteristicMapping(caracteristicMapping); + firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING, null, caracteristicMapping); } @Override - public String getVesselUseFeaturePmfmId(int index) { - return editObject.getVesselUseFeaturePmfmId(index); + public CaracteristicMappingRow getCaracteristicMapping(int index) { + return editObject.getCaracteristicMapping(index); } @Override - public boolean isVesselUseFeaturePmfmIdEmpty() { - return editObject.isVesselUseFeaturePmfmIdEmpty(); + public boolean isCaracteristicMappingEmpty() { + return editObject.isCaracteristicMappingEmpty(); } @Override - public int sizeVesselUseFeaturePmfmId() { - return editObject.sizeVesselUseFeaturePmfmId(); + public int sizeCaracteristicMapping() { + return editObject.sizeCaracteristicMapping(); } @Override - public void addVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId) { - editObject.addVesselUseFeaturePmfmId(vesselUseFeaturePmfmId); + public void addCaracteristicMapping(CaracteristicMappingRow caracteristicMapping) { + editObject.addCaracteristicMapping(caracteristicMapping); } @Override - public void addAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId) { - editObject.addAllVesselUseFeaturePmfmId(vesselUseFeaturePmfmId); + public void addAllCaracteristicMapping(Collection<CaracteristicMappingRow> caracteristicMapping) { + editObject.addAllCaracteristicMapping(caracteristicMapping); } @Override - public boolean removeVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId) { - return editObject.removeVesselUseFeaturePmfmId(vesselUseFeaturePmfmId); + public boolean removeCaracteristicMapping(CaracteristicMappingRow caracteristicMapping) { + return editObject.removeCaracteristicMapping(caracteristicMapping); } @Override - public boolean removeAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId) { - return editObject.removeAllVesselUseFeaturePmfmId(vesselUseFeaturePmfmId); + public boolean removeAllCaracteristicMapping(Collection<CaracteristicMappingRow> caracteristicMapping) { + return editObject.removeAllCaracteristicMapping(caracteristicMapping); } @Override - public boolean containsVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId) { - return editObject.containsVesselUseFeaturePmfmId(vesselUseFeaturePmfmId); + public boolean containsCaracteristicMapping(CaracteristicMappingRow caracteristicMapping) { + return editObject.containsCaracteristicMapping(caracteristicMapping); } @Override - public boolean containsAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId) { - return editObject.containsAllVesselUseFeaturePmfmId(vesselUseFeaturePmfmId); + public boolean containsAllCaracteristicMapping(Collection<CaracteristicMappingRow> caracteristicMapping) { + return editObject.containsAllCaracteristicMapping(caracteristicMapping); } @Override -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 3bbb702c9e1b55dff5f74a12d66491d012d72b78 Author: Kevin Morin <morin@codelutin.com> Date: Mon Nov 24 11:05:10 2014 +0100 refs #6129 --- .../entities/protocol/CaracteristicType.java | 33 ++++++++-- .../i18n/tutti-persistence_en_GB.properties | 4 ++ .../EditProtocolCaracteristicsRowModel.java | 71 ++++++++++++++++++++++ .../EditProtocolCaracteristicsTableModel.java | 39 ++++++++++++ .../ui/swing/content/protocol/EditProtocolUI.jaxx | 5 ++ .../content/protocol/EditProtocolUIHandler.java | 46 ++++++++++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 7 +++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 7 +++ 8 files changed, 207 insertions(+), 5 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java index 358a184..b0d2b01 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java @@ -22,16 +22,39 @@ package fr.ifremer.tutti.persistence.entities.protocol; * #L% */ +import fr.ifremer.tutti.LabelAware; + +import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; + /** * To define which caracteristic can be imported. * * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -public enum CaracteristicType { +public enum CaracteristicType implements LabelAware { + + LENGTH_STEP(n("tutti.caracteristicType.lengthStep")), + VESSEL_USE_FEATURE(n("tutti.caracteristicType.vesselUseFeature")), + GEAR_USE_FEATURE(n("tutti.caracteristicType.gearUseFeature")), + INDIVIDUAL_OBSERVATION(n("tutti.caracteristicType.individualObservation")); + + private String labelKey; + + private CaracteristicType(String labelKey) { + this.labelKey = labelKey; + } + + @Override + public String getLabel() { + return t(labelKey); + } - LENGTH_STEP, - VESSEL_USE_FEATURE, - GEAR_USE_FEATURE, - INDIVIDUAL_OBSERVATION + public static CaracteristicType[] getTabTypes() { + return new CaracteristicType[] { + VESSEL_USE_FEATURE, + GEAR_USE_FEATURE + }; + } } diff --git a/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties b/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties index c074775..c2f80a2 100644 --- a/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties +++ b/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties @@ -28,6 +28,10 @@ application.common.unit.g=Gram application.common.unit.kg=Kilogram application.common.unit.short.g=g application.common.unit.short.kg=kg +tutti.caracteristicType.gearUseFeature= +tutti.caracteristicType.individualObservation= +tutti.caracteristicType.lengthStep= +tutti.caracteristicType.vesselUseFeature= tutti.config= tutti.config.option.basedir.description= tutti.config.option.cruiseId.description= diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java new file mode 100644 index 0000000..149cfaf --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java @@ -0,0 +1,71 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel> { + + public static final String PROPERTY_PSFM = "psfm"; + public static final String PROPERTY_TYPE = "type"; + public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + + protected Caracteristic psfm; + protected CaracteristicType type; + protected String importFileColumn; + + protected static final Binder<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel> fromBeanBinder = + BinderFactory.newBinder(CaracteristicMappingRow.class, + EditProtocolCaracteristicsRowModel.class); + + protected static final Binder<EditProtocolCaracteristicsRowModel, CaracteristicMappingRow> toBeanBinder = + BinderFactory.newBinder(EditProtocolCaracteristicsRowModel.class, + CaracteristicMappingRow.class); + + public EditProtocolCaracteristicsRowModel() { + super(fromBeanBinder, toBeanBinder); + } + + public Caracteristic getPsfm() { + return psfm; + } + + public void setPsfm(Caracteristic psfm) { + Object oldValue = getPsfm(); + this.psfm = psfm; + firePropertyChanged(PROPERTY_PSFM, oldValue, psfm); + } + + public CaracteristicType getType() { + return type; + } + + public void setType(CaracteristicType type) { + Object oldValue = getType(); + this.type = type; + firePropertyChanged(PROPERTY_TYPE, oldValue, type); + } + + public String getImportFileColumn() { + return importFileColumn; + } + + public void setImportFileColumn(String importFileColumn) { + Object oldValue = getImportFileColumn(); + this.importFileColumn = importFileColumn; + firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); + } + + @Override + protected CaracteristicMappingRow newEntity() { + return new CaracteristicMappingRowBean(); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java new file mode 100644 index 0000000..140872a --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java @@ -0,0 +1,39 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import org.jdesktop.swingx.table.TableColumnModelExt; +import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; +import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; + +import static org.nuiton.i18n.I18n.n; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class EditProtocolCaracteristicsTableModel extends AbstractApplicationTableModel<EditProtocolCaracteristicsRowModel> { + + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> PSFM_ID = ColumnIdentifier.newId( + EditProtocolCaracteristicsRowModel.PROPERTY_PSFM, + n("tutti.editProtocol.table.header.caracteristics.psfmId"), + n("tutti.editProtocol.table.header.caracteristics.psfmId.tip")); + + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> TYPE = ColumnIdentifier.newId( + EditProtocolCaracteristicsRowModel.PROPERTY_TYPE, + n("tutti.editProtocol.table.header.caracteristics.type"), + n("tutti.editProtocol.table.header.caracteristics.type.tip")); + + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> IMPORT_FILE_COLUMN = ColumnIdentifier.newId( + EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_FILE_COLUMN, + n("tutti.editProtocol.table.header.caracteristics.importFileColumn"), + n("tutti.editProtocol.table.header.caracteristics.importFileColumn.tip")); + + public EditProtocolCaracteristicsTableModel(TableColumnModelExt columnModel) { + super(columnModel, true, true); + setNoneEditableCols(); + } + + @Override + public EditProtocolCaracteristicsRowModel createNewRow() { + return new EditProtocolCaracteristicsRowModel(); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx index 0ca8922..d6ccd4f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx @@ -117,6 +117,11 @@ <BeanDoubleList id='individualObservationList' genericType='Caracteristic'/> </tab> + <tab title='tutti.editProtocol.tab.caracteristic.mapping'> + <JScrollPane> + <JXTable id='caracteristicsTable'/> + </JScrollPane> + </tab> </JTabbedPane> </JPanel> </tab> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index 0913491..e1215e3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -27,9 +27,11 @@ import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModelEntry; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; @@ -76,6 +78,7 @@ import javax.swing.table.TableColumnModel; import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -422,6 +425,49 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI Lists.newArrayList(model.getCaracteristics()), model.getIndividualObservationPmfmId()); + // table of caracteristic mapping + + { + JXTable caracteristicsMappingTable = ui.getCaracteristicsTable(); + + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + +// getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, new PropertyChangeListener() { +// @Override +// public void propertyChange(PropertyChangeEvent evt) { +// List<String> ids = (List<String>) evt.getNewValue(); +// selectLengthClasses(ids, comboBox); +// } +// }); + + Decorator<Caracteristic> decorator = getDecorator(Caracteristic.class, null); + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.PSFM_ID, + decorator, + new ArrayList<Caracteristic>(getModel().getAllCaracteristic().values())); + + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.TYPE, + getDecorator(CaracteristicType.class, null), + Lists.newArrayList(CaracteristicType.getTabTypes())); + + addColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); + + EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel); + caracteristicsMappingTable.setModel(tableModel); + caracteristicsMappingTable.setColumnModel(columnModel); + + JTableHeader tableHeader = caracteristicsMappingTable.getTableHeader(); + + // by default do not authorize to change column orders + tableHeader.setReorderingAllowed(false); + + addHighlighters(caracteristicsMappingTable); + + tableModel.setRows(new ArrayList<EditProtocolCaracteristicsRowModel>()); + } + // if new protocol can already cancel his creation model.setModify(model.isCreate() || model.isCleaned()); diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 35b8461..e23914b 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -958,11 +958,18 @@ tutti.editProtocol.tab.caracteristic= tutti.editProtocol.tab.caracteristic.gearUseFeature= tutti.editProtocol.tab.caracteristic.individualObservation= tutti.editProtocol.tab.caracteristic.lengthClasses= +tutti.editProtocol.tab.caracteristic.mapping= tutti.editProtocol.tab.caracteristic.vesselUseFeature= tutti.editProtocol.tab.info= tutti.editProtocol.tab.species= tutti.editProtocol.table.header.calcifySample= tutti.editProtocol.table.header.calcifySample.tip= +tutti.editProtocol.table.header.caracteristics.importFileColumn= +tutti.editProtocol.table.header.caracteristics.importFileColumn.tip= +tutti.editProtocol.table.header.caracteristics.psfmId= +tutti.editProtocol.table.header.caracteristics.psfmId.tip= +tutti.editProtocol.table.header.caracteristics.type= +tutti.editProtocol.table.header.caracteristics.type.tip= tutti.editProtocol.table.header.countIfNoFrequency= tutti.editProtocol.table.header.countIfNoFrequency.tip= tutti.editProtocol.table.header.lengthStep= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 29b59a9..d5f5451 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -935,11 +935,18 @@ tutti.editProtocol.tab.caracteristic=Caractéristiques tutti.editProtocol.tab.caracteristic.gearUseFeature=Mise en œuvre de l'engin tutti.editProtocol.tab.caracteristic.individualObservation=Observations individuelles tutti.editProtocol.tab.caracteristic.lengthClasses=Classes de taille +tutti.editProtocol.tab.caracteristic.mapping=Caractéristiques du trait tutti.editProtocol.tab.caracteristic.vesselUseFeature=Autres caractéristiques tutti.editProtocol.tab.info=Informations générales tutti.editProtocol.tab.species=Espèces tutti.editProtocol.table.header.calcifySample=Prélèvement de pièces calcifiées tutti.editProtocol.table.header.calcifySample.tip=Prélèvement de pièces calcifiées (pour les données individuelles) +tutti.editProtocol.table.header.caracteristics.importFileColumn=Colonne du fichier d'import +tutti.editProtocol.table.header.caracteristics.importFileColumn.tip=Colonne du fichier d'import +tutti.editProtocol.table.header.caracteristics.psfmId=Caractéristique +tutti.editProtocol.table.header.caracteristics.psfmId.tip=Caractéristique +tutti.editProtocol.table.header.caracteristics.type=Onglet +tutti.editProtocol.table.header.caracteristics.type.tip=Onglet tutti.editProtocol.table.header.countIfNoFrequency=Dénombrement tutti.editProtocol.table.header.countIfNoFrequency.tip=L'espèce doit elle être dénombrée ? tutti.editProtocol.table.header.lengthStep=Mode de mensuration -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit b1b82c0687e79fb76051b09a9a849041c0515ca4 Author: Kevin Morin <morin@codelutin.com> Date: Mon Nov 24 14:31:13 2014 +0100 refs #5954 add v2 version --- .../entities/protocol/v2/TuttiProtocol2.java | 176 ++++++++ .../entities/protocol/v2/TuttiProtocolBean2.java | 444 +++++++++++++++++++++ 2 files changed, 620 insertions(+) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java new file mode 100644 index 0000000..a67f592 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java @@ -0,0 +1,176 @@ +package fr.ifremer.tutti.persistence.entities.protocol.v2; + +import fr.ifremer.tutti.persistence.entities.CommentAware; +import fr.ifremer.tutti.persistence.entities.TuttiEntity; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; + +import javax.annotation.Generated; +import java.util.Collection; +import java.util.List; + +@Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Mon Nov 24 12:54:48 CET 2014") +public interface TuttiProtocol2 extends CommentAware, TuttiEntity { + + String PROPERTY_NAME = "name"; + + String PROPERTY_COMMENT = "comment"; + + String PROPERTY_GEAR_USE_FEATURE_PMFM_ID = "gearUseFeaturePmfmId"; + + String PROPERTY_VESSEL_USE_FEATURE_PMFM_ID = "vesselUseFeaturePmfmId"; + + String PROPERTY_LENGTH_CLASSES_PMFM_ID = "lengthClassesPmfmId"; + + String PROPERTY_INDIVIDUAL_OBSERVATION_PMFM_ID = "individualObservationPmfmId"; + + String PROPERTY_VERSION = "version"; + + String PROPERTY_SPECIES = "species"; + + String PROPERTY_BENTHOS = "benthos"; + + String getName(); + + void setName(String name); + + String getComment(); + + void setComment(String comment); + + String getGearUseFeaturePmfmId(int index); + + boolean isGearUseFeaturePmfmIdEmpty(); + + int sizeGearUseFeaturePmfmId(); + + void addGearUseFeaturePmfmId(String gearUseFeaturePmfmId); + + void addAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId); + + boolean removeGearUseFeaturePmfmId(String gearUseFeaturePmfmId); + + boolean removeAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId); + + boolean containsGearUseFeaturePmfmId(String gearUseFeaturePmfmId); + + boolean containsAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId); + + List<String> getGearUseFeaturePmfmId(); + + void setGearUseFeaturePmfmId(List<String> gearUseFeaturePmfmId); + + String getVesselUseFeaturePmfmId(int index); + + boolean isVesselUseFeaturePmfmIdEmpty(); + + int sizeVesselUseFeaturePmfmId(); + + void addVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId); + + void addAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId); + + boolean removeVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId); + + boolean removeAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId); + + boolean containsVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId); + + boolean containsAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId); + + List<String> getVesselUseFeaturePmfmId(); + + void setVesselUseFeaturePmfmId(List<String> vesselUseFeaturePmfmId); + + String getLengthClassesPmfmId(int index); + + boolean isLengthClassesPmfmIdEmpty(); + + int sizeLengthClassesPmfmId(); + + void addLengthClassesPmfmId(String lengthClassesPmfmId); + + void addAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId); + + boolean removeLengthClassesPmfmId(String lengthClassesPmfmId); + + boolean removeAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId); + + boolean containsLengthClassesPmfmId(String lengthClassesPmfmId); + + boolean containsAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId); + + List<String> getLengthClassesPmfmId(); + + void setLengthClassesPmfmId(List<String> lengthClassesPmfmId); + + String getIndividualObservationPmfmId(int index); + + boolean isIndividualObservationPmfmIdEmpty(); + + int sizeIndividualObservationPmfmId(); + + void addIndividualObservationPmfmId(String individualObservationPmfmId); + + void addAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId); + + boolean removeIndividualObservationPmfmId(String individualObservationPmfmId); + + boolean removeAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId); + + boolean containsIndividualObservationPmfmId(String individualObservationPmfmId); + + boolean containsAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId); + + List<String> getIndividualObservationPmfmId(); + + void setIndividualObservationPmfmId(List<String> individualObservationPmfmId); + + Integer getVersion(); + + void setVersion(Integer version); + + SpeciesProtocol getSpecies(int index); + + boolean isSpeciesEmpty(); + + int sizeSpecies(); + + void addSpecies(SpeciesProtocol species); + + void addAllSpecies(Collection<SpeciesProtocol> species); + + boolean removeSpecies(SpeciesProtocol species); + + boolean removeAllSpecies(Collection<SpeciesProtocol> species); + + boolean containsSpecies(SpeciesProtocol species); + + boolean containsAllSpecies(Collection<SpeciesProtocol> species); + + List<SpeciesProtocol> getSpecies(); + + void setSpecies(List<SpeciesProtocol> species); + + SpeciesProtocol getBenthos(int index); + + boolean isBenthosEmpty(); + + int sizeBenthos(); + + void addBenthos(SpeciesProtocol benthos); + + void addAllBenthos(Collection<SpeciesProtocol> benthos); + + boolean removeBenthos(SpeciesProtocol benthos); + + boolean removeAllBenthos(Collection<SpeciesProtocol> benthos); + + boolean containsBenthos(SpeciesProtocol benthos); + + boolean containsAllBenthos(Collection<SpeciesProtocol> benthos); + + List<SpeciesProtocol> getBenthos(); + + void setBenthos(List<SpeciesProtocol> benthos); + +} //TuttiProtocol diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java new file mode 100644 index 0000000..9ae21f3 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java @@ -0,0 +1,444 @@ +package fr.ifremer.tutti.persistence.entities.protocol.v2; + +import fr.ifremer.tutti.persistence.entities.TuttiEntityBean; +import fr.ifremer.tutti.persistence.entities.protocol.AbstractTuttiProtocolBean; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; + +import javax.annotation.Generated; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + +@Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Mon Nov 24 12:54:48 CET 2014") +public class TuttiProtocolBean2 extends TuttiEntityBean implements TuttiProtocol { + + private static final long serialVersionUID = 3847260679792845110L; + + protected String name; + + protected String comment; + + protected List<String> gearUseFeaturePmfmId; + + protected List<String> vesselUseFeaturePmfmId; + + protected List<String> lengthClassesPmfmId; + + protected List<String> individualObservationPmfmId; + + protected Integer version; + + protected List<SpeciesProtocol> species; + + protected List<SpeciesProtocol> benthos; + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getComment() { + return comment; + } + + @Override + public void setComment(String comment) { + this.comment = comment; + } + + @Override + public String getGearUseFeaturePmfmId(int index) { + String o = getChild(gearUseFeaturePmfmId, index); + return o; + } + + @Override + public boolean isGearUseFeaturePmfmIdEmpty() { + return gearUseFeaturePmfmId == null || gearUseFeaturePmfmId.isEmpty(); + } + + @Override + public int sizeGearUseFeaturePmfmId() { + return gearUseFeaturePmfmId == null ? 0 : gearUseFeaturePmfmId.size(); + } + + @Override + public void addGearUseFeaturePmfmId(String gearUseFeaturePmfmId) { + getGearUseFeaturePmfmId().add(gearUseFeaturePmfmId); + } + + @Override + public void addAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId) { + getGearUseFeaturePmfmId().addAll(gearUseFeaturePmfmId); + } + + @Override + public boolean removeGearUseFeaturePmfmId(String gearUseFeaturePmfmId) { + boolean removed = getGearUseFeaturePmfmId().remove(gearUseFeaturePmfmId); + return removed; + } + + @Override + public boolean removeAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId) { + boolean removed = getGearUseFeaturePmfmId().removeAll(gearUseFeaturePmfmId); + return removed; + } + + @Override + public boolean containsGearUseFeaturePmfmId(String gearUseFeaturePmfmId) { + boolean contains = getGearUseFeaturePmfmId().contains(gearUseFeaturePmfmId); + return contains; + } + + @Override + public boolean containsAllGearUseFeaturePmfmId(Collection<String> gearUseFeaturePmfmId) { + boolean contains = getGearUseFeaturePmfmId().containsAll(gearUseFeaturePmfmId); + return contains; + } + + @Override + public List<String> getGearUseFeaturePmfmId() { + if (gearUseFeaturePmfmId == null) { + gearUseFeaturePmfmId = new LinkedList<String>(); + } + return gearUseFeaturePmfmId; + } + + @Override + public void setGearUseFeaturePmfmId(List<String> gearUseFeaturePmfmId) { + this.gearUseFeaturePmfmId = gearUseFeaturePmfmId; + } + + @Override + public String getVesselUseFeaturePmfmId(int index) { + String o = getChild(vesselUseFeaturePmfmId, index); + return o; + } + + @Override + public boolean isVesselUseFeaturePmfmIdEmpty() { + return vesselUseFeaturePmfmId == null || vesselUseFeaturePmfmId.isEmpty(); + } + + @Override + public int sizeVesselUseFeaturePmfmId() { + return vesselUseFeaturePmfmId == null ? 0 : vesselUseFeaturePmfmId.size(); + } + + @Override + public void addVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId) { + getVesselUseFeaturePmfmId().add(vesselUseFeaturePmfmId); + } + + @Override + public void addAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId) { + getVesselUseFeaturePmfmId().addAll(vesselUseFeaturePmfmId); + } + + @Override + public boolean removeVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId) { + boolean removed = getVesselUseFeaturePmfmId().remove(vesselUseFeaturePmfmId); + return removed; + } + + @Override + public boolean removeAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId) { + boolean removed = getVesselUseFeaturePmfmId().removeAll(vesselUseFeaturePmfmId); + return removed; + } + + @Override + public boolean containsVesselUseFeaturePmfmId(String vesselUseFeaturePmfmId) { + boolean contains = getVesselUseFeaturePmfmId().contains(vesselUseFeaturePmfmId); + return contains; + } + + @Override + public boolean containsAllVesselUseFeaturePmfmId(Collection<String> vesselUseFeaturePmfmId) { + boolean contains = getVesselUseFeaturePmfmId().containsAll(vesselUseFeaturePmfmId); + return contains; + } + + @Override + public List<String> getVesselUseFeaturePmfmId() { + if (vesselUseFeaturePmfmId == null) { + vesselUseFeaturePmfmId = new LinkedList<String>(); + } + return vesselUseFeaturePmfmId; + } + + @Override + public void setVesselUseFeaturePmfmId(List<String> vesselUseFeaturePmfmId) { + this.vesselUseFeaturePmfmId = vesselUseFeaturePmfmId; + } + + @Override + public String getLengthClassesPmfmId(int index) { + String o = getChild(lengthClassesPmfmId, index); + return o; + } + + @Override + public boolean isLengthClassesPmfmIdEmpty() { + return lengthClassesPmfmId == null || lengthClassesPmfmId.isEmpty(); + } + + @Override + public int sizeLengthClassesPmfmId() { + return lengthClassesPmfmId == null ? 0 : lengthClassesPmfmId.size(); + } + + @Override + public void addLengthClassesPmfmId(String lengthClassesPmfmId) { + getLengthClassesPmfmId().add(lengthClassesPmfmId); + } + + @Override + public void addAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId) { + getLengthClassesPmfmId().addAll(lengthClassesPmfmId); + } + + @Override + public boolean removeLengthClassesPmfmId(String lengthClassesPmfmId) { + boolean removed = getLengthClassesPmfmId().remove(lengthClassesPmfmId); + return removed; + } + + @Override + public boolean removeAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId) { + boolean removed = getLengthClassesPmfmId().removeAll(lengthClassesPmfmId); + return removed; + } + + @Override + public boolean containsLengthClassesPmfmId(String lengthClassesPmfmId) { + boolean contains = getLengthClassesPmfmId().contains(lengthClassesPmfmId); + return contains; + } + + @Override + public boolean containsAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId) { + boolean contains = getLengthClassesPmfmId().containsAll(lengthClassesPmfmId); + return contains; + } + + @Override + public List<String> getLengthClassesPmfmId() { + if (lengthClassesPmfmId == null) { + lengthClassesPmfmId = new LinkedList<String>(); + } + return lengthClassesPmfmId; + } + + @Override + public void setLengthClassesPmfmId(List<String> lengthClassesPmfmId) { + this.lengthClassesPmfmId = lengthClassesPmfmId; + } + + @Override + public String getIndividualObservationPmfmId(int index) { + String o = getChild(individualObservationPmfmId, index); + return o; + } + + @Override + public boolean isIndividualObservationPmfmIdEmpty() { + return individualObservationPmfmId == null || individualObservationPmfmId.isEmpty(); + } + + @Override + public int sizeIndividualObservationPmfmId() { + return individualObservationPmfmId == null ? 0 : individualObservationPmfmId.size(); + } + + @Override + public void addIndividualObservationPmfmId(String individualObservationPmfmId) { + getIndividualObservationPmfmId().add(individualObservationPmfmId); + } + + @Override + public void addAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId) { + getIndividualObservationPmfmId().addAll(individualObservationPmfmId); + } + + @Override + public boolean removeIndividualObservationPmfmId(String individualObservationPmfmId) { + boolean removed = getIndividualObservationPmfmId().remove(individualObservationPmfmId); + return removed; + } + + @Override + public boolean removeAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId) { + boolean removed = getIndividualObservationPmfmId().removeAll(individualObservationPmfmId); + return removed; + } + + @Override + public boolean containsIndividualObservationPmfmId(String individualObservationPmfmId) { + boolean contains = getIndividualObservationPmfmId().contains(individualObservationPmfmId); + return contains; + } + + @Override + public boolean containsAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId) { + boolean contains = getIndividualObservationPmfmId().containsAll(individualObservationPmfmId); + return contains; + } + + @Override + public List<String> getIndividualObservationPmfmId() { + if (individualObservationPmfmId == null) { + individualObservationPmfmId = new LinkedList<String>(); + } + return individualObservationPmfmId; + } + + @Override + public void setIndividualObservationPmfmId(List<String> individualObservationPmfmId) { + this.individualObservationPmfmId = individualObservationPmfmId; + } + + @Override + public Integer getVersion() { + return version; + } + + @Override + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public SpeciesProtocol getSpecies(int index) { + SpeciesProtocol o = getChild(species, index); + return o; + } + + @Override + public boolean isSpeciesEmpty() { + return species == null || species.isEmpty(); + } + + @Override + public int sizeSpecies() { + return species == null ? 0 : species.size(); + } + + @Override + public void addSpecies(SpeciesProtocol species) { + getSpecies().add(species); + } + + @Override + public void addAllSpecies(Collection<SpeciesProtocol> species) { + getSpecies().addAll(species); + } + + @Override + public boolean removeSpecies(SpeciesProtocol species) { + boolean removed = getSpecies().remove(species); + return removed; + } + + @Override + public boolean removeAllSpecies(Collection<SpeciesProtocol> species) { + boolean removed = getSpecies().removeAll(species); + return removed; + } + + @Override + public boolean containsSpecies(SpeciesProtocol species) { + boolean contains = getSpecies().contains(species); + return contains; + } + + @Override + public boolean containsAllSpecies(Collection<SpeciesProtocol> species) { + boolean contains = getSpecies().containsAll(species); + return contains; + } + + @Override + public List<SpeciesProtocol> getSpecies() { + if (species == null) { + species = new LinkedList<SpeciesProtocol>(); + } + return species; + } + + @Override + public void setSpecies(List<SpeciesProtocol> species) { + this.species = species; + } + + @Override + public SpeciesProtocol getBenthos(int index) { + SpeciesProtocol o = getChild(benthos, index); + return o; + } + + @Override + public boolean isBenthosEmpty() { + return benthos == null || benthos.isEmpty(); + } + + @Override + public int sizeBenthos() { + return benthos == null ? 0 : benthos.size(); + } + + @Override + public void addBenthos(SpeciesProtocol benthos) { + getBenthos().add(benthos); + } + + @Override + public void addAllBenthos(Collection<SpeciesProtocol> benthos) { + getBenthos().addAll(benthos); + } + + @Override + public boolean removeBenthos(SpeciesProtocol benthos) { + boolean removed = getBenthos().remove(benthos); + return removed; + } + + @Override + public boolean removeAllBenthos(Collection<SpeciesProtocol> benthos) { + boolean removed = getBenthos().removeAll(benthos); + return removed; + } + + @Override + public boolean containsBenthos(SpeciesProtocol benthos) { + boolean contains = getBenthos().contains(benthos); + return contains; + } + + @Override + public boolean containsAllBenthos(Collection<SpeciesProtocol> benthos) { + boolean contains = getBenthos().containsAll(benthos); + return contains; + } + + @Override + public List<SpeciesProtocol> getBenthos() { + if (benthos == null) { + benthos = new LinkedList<SpeciesProtocol>(); + } + return benthos; + } + + @Override + public void setBenthos(List<SpeciesProtocol> benthos) { + this.benthos = benthos; + } + +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 9c6de7275dba89759d4f814c2fa9fea4f6fc8a64 Author: Kevin Morin <morin@codelutin.com> Date: Thu Nov 27 16:37:05 2014 +0100 refs #6129 [IMPORT SUMATRA] Import des valeurs des PSFMs et des champs du trait --- .../entities/protocol/CaracteristicType.java | 21 +-- .../entities/protocol/TuttiProtocols.java | 4 +- .../entities/protocol/v2/TuttiProtocolBean2.java | 2 +- .../fr/ifremer/tutti/service/DecoratorService.java | 11 ++ .../resources/i18n/tutti-service_en_GB.properties | 8 + .../resources/i18n/tutti-service_fr_FR.properties | 4 + .../tutti/ui/swing/action/SaveProtocolAction.java | 6 + .../content/protocol/CaracteristicMappingUI.css | 7 + .../content/protocol/CaracteristicMappingUI.jaxx | 40 +++++ .../protocol/CaracteristicMappingUIHandler.java | 176 +++++++++++++++++++++ .../protocol/CaracteristicMappingUIModel.java | 62 ++++++++ .../EditProtocolCaracteristicsRowModel.java | 27 +++- .../EditProtocolCaracteristicsTableModel.java | 10 +- .../ui/swing/content/protocol/EditProtocolUI.jaxx | 4 +- .../content/protocol/EditProtocolUIHandler.java | 49 +----- .../util/table/AbstractTuttiTableUIHandler.java | 1 + .../resources/i18n/tutti-ui-swing_en_GB.properties | 1 - 17 files changed, 364 insertions(+), 69 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java index b0d2b01..f93a4b8 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/CaracteristicType.java @@ -33,23 +33,12 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -public enum CaracteristicType implements LabelAware { +public enum CaracteristicType { - LENGTH_STEP(n("tutti.caracteristicType.lengthStep")), - VESSEL_USE_FEATURE(n("tutti.caracteristicType.vesselUseFeature")), - GEAR_USE_FEATURE(n("tutti.caracteristicType.gearUseFeature")), - INDIVIDUAL_OBSERVATION(n("tutti.caracteristicType.individualObservation")); - - private String labelKey; - - private CaracteristicType(String labelKey) { - this.labelKey = labelKey; - } - - @Override - public String getLabel() { - return t(labelKey); - } + LENGTH_STEP, + VESSEL_USE_FEATURE, + GEAR_USE_FEATURE, + INDIVIDUAL_OBSERVATION; public static CaracteristicType[] getTabTypes() { return new CaracteristicType[] { diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index 32d4279..ab5eb2a 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -308,6 +308,8 @@ public class TuttiProtocols extends AbstractTuttiProtocols { YamlConfig result = new YamlConfig(); result.setClassTag(SpeciesProtocol.class.getSimpleName(), SpeciesProtocols.typeOfSpeciesProtocol()); + result.setClassTag(CaracteristicMappingRow.class.getSimpleName(), + CaracteristicMappingRows.typeOfCaracteristicMappingRow()); result.writeConfig.setAlwaysWriteClassname(false); result.writeConfig.setWriteRootTags(false); return result; @@ -409,7 +411,7 @@ public class TuttiProtocols extends AbstractTuttiProtocols { Collections2.filter(caracteristicMapping, new Predicate<CaracteristicMappingRow>() { @Override public boolean apply(CaracteristicMappingRow caracteristicMappingRow) { - return type.equals(caracteristicMappingRow.getTab()); + return type.name().equals(caracteristicMappingRow.getTab()); } }); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java index 9ae21f3..0405b21 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java @@ -11,7 +11,7 @@ import java.util.LinkedList; import java.util.List; @Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Mon Nov 24 12:54:48 CET 2014") -public class TuttiProtocolBean2 extends TuttiEntityBean implements TuttiProtocol { +public class TuttiProtocolBean2 extends TuttiEntityBean implements TuttiProtocol2 { private static final long serialVersionUID = 3847260679792845110L; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java index d8a9402..fa07772 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java @@ -29,6 +29,7 @@ import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModelEntry; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; @@ -115,6 +116,12 @@ public class DecoratorService extends AbstractTuttiService { registerDecorator(CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT, new SimpleCaracteristicDecorator("${parameterName}$s")); registerTuttiDecorator(CaracteristicQualitativeValue.class, "${description}$s", SEPARATOR, " - "); + registerDecorator(new Decorator<CaracteristicType>(CaracteristicType.class) { + @Override + public String toString(Object bean) { + return bean == null ? "" : t("tutti.caracteristicType." + bean.toString()); + } + }); registerTuttiDecorator(SpeciesProtocol.class, "${speciesReferenceTaxonId}", SEPARATOR, " - "); registerTuttiDecorator(Attachment.class, "${name}$s", SEPARATOR, " - "); registerTuttiDecorator(LabelAware.class, "${label}$s", SEPARATOR, " - "); @@ -197,6 +204,10 @@ public class DecoratorService extends AbstractTuttiService { n("tutti.property.attachment"); n("tutti.property.multirigAggregation"); n("tutti.property.caracteristic"); + n("tutti.caracteristicType.GEAR_USE_FEATURE"); + n("tutti.caracteristicType.INDIVIDUAL_OBSERVATION"); + n("tutti.caracteristicType.lengthStep"); + n("tutti.caracteristicType.VESSEL_USE_FEATURE"); } public static class SpeciesDecorator extends TuttiDecorator<Species> implements Cloneable { diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index 67c40d7..1639fd0 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -1,3 +1,11 @@ +tutti.caracteristicType.GEAR_USE_FEATURE= +tutti.caracteristicType.INDIVIDUAL_OBSERVATION= +tutti.caracteristicType.LENGTH_STEP= +tutti.caracteristicType.VESSEL_USE_FEATURE= +tutti.caracteristicType.gearUseFeature= +tutti.caracteristicType.individualObservation= +tutti.caracteristicType.lengthStep= +tutti.caracteristicType.vesselUseFeature= tutti.error.benthos.not.in.protocol= tutti.error.species.not.in.protocol= tutti.io.mkDir.error= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index beeb93e..0e4f677 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -1,3 +1,7 @@ +tutti.caracteristicType.GEAR_USE_FEATURE=Caractéristiques de l'engin +tutti.caracteristicType.INDIVIDUAL_OBSERVATION=Observations individuelles +tutti.caracteristicType.LENGTH_STEP=Classes de tailles +tutti.caracteristicType.VESSEL_USE_FEATURE=Autres caractéristiques tutti.io.mkDir.error=Erreur à la création du dossier %s tutti.pdf.export.missing.species.code=Une espèce (referenceId %s, nom scientifique %s) n'a ni code campagne, ni code refTax. tutti.property.attachment=Pièce jointe diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java index f5950c0..c6378be 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.action; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; @@ -36,6 +37,7 @@ import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.ArrayList; import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -68,6 +70,10 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, TuttiProtocol bean = model.toBean(); + List<CaracteristicMappingRow> caracteristicMappingRows = + new ArrayList<>(getUI().getCaracteristicsTable().getModel().getCaracteristicMapping().values()); + bean.setCaracteristicMapping(caracteristicMappingRows); + // get the species protocols from the table List<SpeciesProtocol> speciesProtocols = Lists.newArrayList(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css new file mode 100644 index 0000000..4773389 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css @@ -0,0 +1,7 @@ +#caracteristicsTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; + enabled: true; +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx new file mode 100644 index 0000000..8706193 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx @@ -0,0 +1,40 @@ +<JPanel layout="{new BorderLayout()}" + implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<CaracteristicMappingUIModel, CaracteristicMappingUIHandler>'> + + <import> + fr.ifremer.tutti.persistence.entities.referential.Caracteristic + fr.ifremer.tutti.persistence.entities.referential.Species + + fr.ifremer.tutti.ui.swing.TuttiHelpBroker + fr.ifremer.tutti.ui.swing.util.TuttiUI + fr.ifremer.tutti.ui.swing.util.TuttiUIUtil + + jaxx.runtime.swing.editor.bean.BeanFilterableComboBox + jaxx.runtime.swing.editor.bean.BeanDoubleList + + java.awt.Color + + javax.swing.ListSelectionModel + + org.jdesktop.swingx.JXTable + + static org.nuiton.i18n.I18n.t + static jaxx.runtime.SwingUtil.getStringValue + + </import> + + <script><![CDATA[ + + public CaracteristicMappingUI(TuttiUI parentUI) { + TuttiUIUtil.setParentUI(this, parentUI); + } + ]]> + </script> + + <CaracteristicMappingUIModel id='model' + initializer='getContextValue(CaracteristicMappingUIModel.class)'/> + + <JScrollPane constraints="BorderLayout.CENTER"> + <JXTable id='caracteristicsTable'/> + </JScrollPane> +</JPanel> \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java new file mode 100644 index 0000000..f1b92fc --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java @@ -0,0 +1,176 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; + +import javax.swing.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class CaracteristicMappingUIHandler + extends AbstractTuttiTableUIHandler<EditProtocolCaracteristicsRowModel, CaracteristicMappingUIModel, CaracteristicMappingUI> { + + private static final Log log = LogFactory.getLog(CaracteristicMappingUIHandler.class); + + public CaracteristicMappingUIHandler() { + super(EditProtocolCaracteristicsRowModel.PROPERTY_PSFM, + EditProtocolCaracteristicsRowModel.PROPERTY_TYPE, + EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_FILE_COLUMN); + } + + @Override + public AbstractApplicationTableModel<EditProtocolCaracteristicsRowModel> getTableModel() { + return (EditProtocolCaracteristicsTableModel) getTable().getModel(); + } + + @Override + public JXTable getTable() { + return getUI().getCaracteristicsTable(); + } + + @Override + protected boolean isRowValid(EditProtocolCaracteristicsRowModel row) { + return row.getPsfm() != null && row.getType() != null; + } + + @Override + protected void saveSelectedRowIfRequired(TuttiBeanMonitor<EditProtocolCaracteristicsRowModel> rowMonitor, + EditProtocolCaracteristicsRowModel row) { + if (row.isValid()) { + // there is a valid bean attached to the monitor + + if (rowMonitor.wasModified()) { + + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + row + " was modified, will save it"); + } + + getModel().getCaracteristicMapping().put(row.getPsfm().getId(), row.toBean()); + } + } + + } + + @Override + public void onCloseUI() { + + } + + @Override + public SwingValidator<CaracteristicMappingUIModel> getValidator() { + return null; + } + + @Override + protected JComponent getComponentToFocus() { + return null; + } + + @Override + public void beforeInit(CaracteristicMappingUI ui) { + super.beforeInit(ui); + + EditProtocolUIModel editProtocolUIModel = + ui.getContextValue(EditProtocolUIModel.class); + + CaracteristicMappingUIModel model = new CaracteristicMappingUIModel(); + model.setCaracteristics(editProtocolUIModel.getCaracteristics()); + editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_CARACTERISTIC_MAPPING, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + getModel().setCaracteristicMappingRows((List<CaracteristicMappingRow>) evt.getNewValue()); + } + }); + ui.setContextValue(model); + } + + @Override + public void afterInit(CaracteristicMappingUI caracteristicMappingUI) { + + initUI(this.ui); + + JXTable caracteristicsMappingTable = caracteristicMappingUI.getCaracteristicsTable(); + + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + +// getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, new PropertyChangeListener() { +// @Override +// public void propertyChange(PropertyChangeEvent evt) { +// List<String> ids = (List<String>) evt.getNewValue(); +// selectLengthClasses(ids, comboBox); +// } +// }); + + List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.PSFM_ID, + getDecorator(Caracteristic.class, null), + caracteristics); + + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.TYPE, + getDecorator(CaracteristicType.class, null), + Lists.newArrayList(CaracteristicType.getTabTypes())); + + addColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); + + EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); + caracteristicsMappingTable.setModel(tableModel); + caracteristicsMappingTable.setColumnModel(columnModel); + + initTable(caracteristicsMappingTable); + + getModel().addPropertyChangeListener(CaracteristicMappingUIModel.PROPERTY_CARACTERISTIC_MAPPING_ROWS, + new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + populateTable((Collection<CaracteristicMappingRow>) evt.getNewValue()); + } + }); + + } + + protected void populateTable(Collection<CaracteristicMappingRow> values) { + List<EditProtocolCaracteristicsRowModel> rows = new ArrayList<EditProtocolCaracteristicsRowModel>(); + for (CaracteristicMappingRow row : values) { + EditProtocolCaracteristicsRowModel rowModel = getTableModel().createNewRow(); + rowModel.fromEntity(row); + recomputeRowValidState(rowModel); + rows.add(rowModel); + } + getTableModel().setRows(rows); + } + + @Override + protected void initTable(JXTable table) { + super.initTable(table); + installTableKeyListener(table.getColumnModel(), table); + } + + @Override + protected void onRowModified(int rowIndex, EditProtocolCaracteristicsRowModel row, + String propertyName, Object oldValue, Object newValue) { + recomputeRowValidState(row); + super.onRowModified(rowIndex, row, propertyName, oldValue, newValue); + saveSelectedRowIfNeeded(); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java new file mode 100644 index 0000000..d07ab9f --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java @@ -0,0 +1,62 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import com.google.common.base.Function; +import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel, CaracteristicMappingUIModel> { + + public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; + + protected List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(); + protected Map<String, CaracteristicMappingRow> caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); + + public CaracteristicMappingUIModel() { + super(CaracteristicMappingRow.class, null, null); + } + + public List<Caracteristic> getCaracteristics() { + return caracteristics; + } + + public void setCaracteristics(List<Caracteristic> caracteristics) { + this.caracteristics = caracteristics; + } + + public Map<String, CaracteristicMappingRow> getCaracteristicMapping() { + return caracteristicMappingRows; + } + + public void setCaracteristicMappingRows(List<CaracteristicMappingRow> caracteristicMappingRows) { + this.caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); + if (caracteristicMappingRows != null) { + this.caracteristicMappingRows.putAll(Maps.uniqueIndex(caracteristicMappingRows, new Function<CaracteristicMappingRow, String>() { + @Override + public String apply(CaracteristicMappingRow caracteristicMappingRow) { + return caracteristicMappingRow.getPmfmId(); + } + })); + } + firePropertyChanged(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, caracteristicMappingRows); + } + + @Override + protected CaracteristicMappingRow newEntity() { + return new CaracteristicMappingRowBean(); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java index 149cfaf..c845b8e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java @@ -1,5 +1,8 @@ package fr.ifremer.tutti.ui.swing.content.protocol; +import com.google.common.base.Function; +import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; @@ -8,6 +11,10 @@ import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + /** * @author Kevin Morin (Code Lutin) * @since 3.10 @@ -18,6 +25,7 @@ public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel public static final String PROPERTY_TYPE = "type"; public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + protected Map<String, Caracteristic> caracteristicMap; protected Caracteristic psfm; protected CaracteristicType type; protected String importFileColumn; @@ -30,8 +38,9 @@ public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel BinderFactory.newBinder(EditProtocolCaracteristicsRowModel.class, CaracteristicMappingRow.class); - public EditProtocolCaracteristicsRowModel() { + public EditProtocolCaracteristicsRowModel(Collection<Caracteristic> caracteristics) { super(fromBeanBinder, toBeanBinder); + caracteristicMap = caracteristics != null ? TuttiEntities.splitById(caracteristics) : new HashMap<String, Caracteristic>(); } public Caracteristic getPsfm() { @@ -64,6 +73,22 @@ public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); } + public String getPmfmId() { + return psfm == null ? null : psfm.getId(); + } + + public void setPmfmId(String pmfmId) { + setPsfm(caracteristicMap.get(pmfmId)); + } + + public String getTab() { + return type == null ? null : type.name(); + } + + public void setTab(String tab) { + setType(CaracteristicType.valueOf(tab)); + } + @Override protected CaracteristicMappingRow newEntity() { return new CaracteristicMappingRowBean(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java index 140872a..6e262ed 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java @@ -1,9 +1,12 @@ package fr.ifremer.tutti.ui.swing.content.protocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; +import java.util.Collection; + import static org.nuiton.i18n.I18n.n; /** @@ -12,6 +15,8 @@ import static org.nuiton.i18n.I18n.n; */ public class EditProtocolCaracteristicsTableModel extends AbstractApplicationTableModel<EditProtocolCaracteristicsRowModel> { + protected Collection<Caracteristic> caracteristics; + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> PSFM_ID = ColumnIdentifier.newId( EditProtocolCaracteristicsRowModel.PROPERTY_PSFM, n("tutti.editProtocol.table.header.caracteristics.psfmId"), @@ -27,13 +32,14 @@ public class EditProtocolCaracteristicsTableModel extends AbstractApplicationTab n("tutti.editProtocol.table.header.caracteristics.importFileColumn"), n("tutti.editProtocol.table.header.caracteristics.importFileColumn.tip")); - public EditProtocolCaracteristicsTableModel(TableColumnModelExt columnModel) { + public EditProtocolCaracteristicsTableModel(TableColumnModelExt columnModel, Collection<Caracteristic> caracteristics) { super(columnModel, true, true); setNoneEditableCols(); + this.caracteristics = caracteristics; } @Override public EditProtocolCaracteristicsRowModel createNewRow() { - return new EditProtocolCaracteristicsRowModel(); + return new EditProtocolCaracteristicsRowModel(caracteristics); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx index d6ccd4f..b8e29f4 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx @@ -118,9 +118,7 @@ genericType='Caracteristic'/> </tab> <tab title='tutti.editProtocol.tab.caracteristic.mapping'> - <JScrollPane> - <JXTable id='caracteristicsTable'/> - </JScrollPane> + <CaracteristicMappingUI id='caracteristicsTable' constructorParams="(TuttiUI)this"/> </tab> </JTabbedPane> </JPanel> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index e1215e3..5100218 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -180,6 +180,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI // afterUI method to fill model listModelIsModify(model); + this.ui.setContextValue(model); } @@ -425,49 +426,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI Lists.newArrayList(model.getCaracteristics()), model.getIndividualObservationPmfmId()); - // table of caracteristic mapping - - { - JXTable caracteristicsMappingTable = ui.getCaracteristicsTable(); - - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); - -// getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, new PropertyChangeListener() { -// @Override -// public void propertyChange(PropertyChangeEvent evt) { -// List<String> ids = (List<String>) evt.getNewValue(); -// selectLengthClasses(ids, comboBox); -// } -// }); - - Decorator<Caracteristic> decorator = getDecorator(Caracteristic.class, null); - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.PSFM_ID, - decorator, - new ArrayList<Caracteristic>(getModel().getAllCaracteristic().values())); - - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.TYPE, - getDecorator(CaracteristicType.class, null), - Lists.newArrayList(CaracteristicType.getTabTypes())); - - addColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); - - EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel); - caracteristicsMappingTable.setModel(tableModel); - caracteristicsMappingTable.setColumnModel(columnModel); - - JTableHeader tableHeader = caracteristicsMappingTable.getTableHeader(); - - // by default do not authorize to change column orders - tableHeader.setReorderingAllowed(false); - - addHighlighters(caracteristicsMappingTable); - - tableModel.setRows(new ArrayList<EditProtocolCaracteristicsRowModel>()); - } - // if new protocol can already cancel his creation model.setModify(model.isCreate() || model.isCleaned()); @@ -501,7 +459,8 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI }); dialog = new SelectSpeciesUI(false, this.ui); - + + listenModelModifiy(ui.getCaracteristicsTable().getModel()); } @Override @@ -591,6 +550,8 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI } clearValidators(); ui.getTabPanel().setSelectedIndex(0); + + closeUI(ui.getCaracteristicsTable()); } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java index ab99b41..335d832 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java @@ -264,6 +264,7 @@ public abstract class AbstractTuttiTableUIHandler<R extends AbstractTuttiBeanUIM getModel().addPropertyChangeListener(AbstractTuttiTableUIModel.PROPERTY_ROWS, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { + log.info("row schanged"); onModelRowsChanged((List<R>) evt.getNewValue()); } }); diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index e23914b..245b3a6 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1,6 +1,5 @@ application.action.create.error= application.error.ui.business.warning= -gtrph= swing.error.cannot.open.file= tutti.about.bottomText= tutti.about.message= -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit b0cdc86ec757be55502b2422fefcbfc8c34ecfc6 Author: Kevin Morin <morin@codelutin.com> Date: Mon Dec 1 14:47:06 2014 +0100 refs #6129 import du fichier avec les colonnes --- .../entities/protocol/TuttiProtocols.java | 69 +++++++++++++++++++-- .../src/main/xmi/tutti-persistence.zargo | Bin 57378 -> 57440 bytes .../src/main/xmi/tutti-persistence.zargo~ | Bin 57382 -> 57378 bytes .../resources/i18n/tutti-service_fr_FR.properties | 1 + .../filtered-resources/tutti-help-fr.properties | 3 +- .../action/LoadProtocolImportColumnsAction.java | 65 +++++++++++++++++++ .../protocol/CaracteristicMappingUIHandler.java | 38 ++++++++++++ .../protocol/CaracteristicMappingUIModel.java | 16 +++++ .../ui/swing/content/protocol/EditProtocolUI.css | 9 +++ .../ui/swing/content/protocol/EditProtocolUI.jaxx | 3 + .../content/protocol/EditProtocolUIModel.java | 62 ++++++++++++++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 6 ++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 6 ++ 13 files changed, 273 insertions(+), 5 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index ab5eb2a..acfb9b9 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -40,6 +40,8 @@ import fr.ifremer.tutti.persistence.entities.protocol.v1.SpeciesProtocol1; import fr.ifremer.tutti.persistence.entities.protocol.v1.SpeciesProtocolBean1; import fr.ifremer.tutti.persistence.entities.protocol.v1.TuttiProtocol1; import fr.ifremer.tutti.persistence.entities.protocol.v1.TuttiProtocolBean1; +import fr.ifremer.tutti.persistence.entities.protocol.v2.TuttiProtocol2; +import fr.ifremer.tutti.persistence.entities.protocol.v2.TuttiProtocolBean2; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import org.apache.commons.collections4.CollectionUtils; @@ -130,12 +132,23 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } } return result; + } catch (Exception e) { - // try to load a v1 - TuttiProtocol1 tuttiProtocol1 = fromFileV1(file); + //try to load a v2 + try { + // try to load a v1 + TuttiProtocol2 tuttiProtocol2 = fromFileV2(file); - TuttiProtocol result = fromTuttiProtocol1(tuttiProtocol1); - return result; + TuttiProtocol result = fromTuttiProtocol2(tuttiProtocol2); + return result; + + } catch (Exception ee) { + // try to load a v1 + TuttiProtocol1 tuttiProtocol1 = fromFileV1(file); + + TuttiProtocol result = fromTuttiProtocol1(tuttiProtocol1); + return result; + } } finally { IOUtils.closeQuietly(fileReader); @@ -158,6 +171,22 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } } + public static TuttiProtocol2 fromFileV2(File file) { + + Reader fileReader = null; + try { + fileReader = Files.newReader(file, Charsets.UTF_8); + YamlReader reader = new YamlReader(fileReader, createConfigV2()); + TuttiProtocol2 result = reader.read(TuttiProtocolBean2.class); + fileReader.close(); + return result; + } catch (Exception e) { + throw new ApplicationTechnicalException(t("tutti.persistence.protocol.fromFile.error", file), e); + } finally { + IOUtils.closeQuietly(fileReader); + } + } + public static void checkSampleCategories(SampleCategoryModel sampleCategoryModel, TuttiProtocol protocol, Set<Integer> badCategories) { @@ -304,6 +333,29 @@ public class TuttiProtocols extends AbstractTuttiProtocols { return result; } + protected static TuttiProtocol fromTuttiProtocol2(TuttiProtocol2 tuttiProtocol2) { + TuttiProtocol result = newTuttiProtocol(); + Binder<TuttiProtocol2, TuttiProtocol> binder = BinderFactory.newBinder(TuttiProtocol2.class, TuttiProtocol.class); + binder.copy(tuttiProtocol2, result); + + List<CaracteristicMappingRow> caracteristicMappingRows = new ArrayList<>(); + for (String id : tuttiProtocol2.getGearUseFeaturePmfmId()) { + CaracteristicMappingRow row = new CaracteristicMappingRowBean(); + row.setPmfmId(id); + row.setTab(CaracteristicType.GEAR_USE_FEATURE.name()); + caracteristicMappingRows.add(row); + } + for (String id : tuttiProtocol2.getVesselUseFeaturePmfmId()) { + CaracteristicMappingRow row = new CaracteristicMappingRowBean(); + row.setPmfmId(id); + row.setTab(CaracteristicType.VESSEL_USE_FEATURE.name()); + caracteristicMappingRows.add(row); + } + result.setCaracteristicMapping(caracteristicMappingRows); + + return result; + } + protected static YamlConfig createConfig() { YamlConfig result = new YamlConfig(); result.setClassTag(SpeciesProtocol.class.getSimpleName(), @@ -324,6 +376,15 @@ public class TuttiProtocols extends AbstractTuttiProtocols { return result; } + protected static YamlConfig createConfigV2() { + YamlConfig result = new YamlConfig(); + result.setClassTag(SpeciesProtocol.class.getSimpleName(), + SpeciesProtocols.typeOfSpeciesProtocol()); + result.writeConfig.setAlwaysWriteClassname(false); + result.writeConfig.setWriteRootTags(false); + return result; + } + public static SpeciesProtocol getSpeciesOrBenthosProtocol(TuttiProtocol protocol, Integer speciesReferenceTaxonId) { SpeciesProtocol speciesProtocol = getSpeciesProtocol(protocol, speciesReferenceTaxonId); if (speciesProtocol == null) { diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo b/tutti-persistence/src/main/xmi/tutti-persistence.zargo index 982bb6a..b3c7107 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo differ diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ index 2d2cc86..982bb6a 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ differ diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 0e4f677..202911d 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -2,6 +2,7 @@ tutti.caracteristicType.GEAR_USE_FEATURE=Caractéristiques de l'engin tutti.caracteristicType.INDIVIDUAL_OBSERVATION=Observations individuelles tutti.caracteristicType.LENGTH_STEP=Classes de tailles tutti.caracteristicType.VESSEL_USE_FEATURE=Autres caractéristiques +tutti.caracteristicType.lengthStep= tutti.io.mkDir.error=Erreur à la création du dossier %s tutti.pdf.export.missing.species.code=Une espèce (referenceId %s, nom scientifique %s) n'a ni code campagne, ni code refTax. tutti.property.attachment=Pièce jointe diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index f14baa3..001e779 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -22,7 +22,7 @@ # #L% ### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Sat Nov 15 23:48:54 CET 2014 +#Mon Dec 01 10:21:58 CET 2014 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -256,6 +256,7 @@ tutti.editProtocol.action.exportProtocolSpecies.help=editProtocol.html\#actionsS tutti.editProtocol.action.exportPupitri.help=editProtocol.html\#actionsSpecies tutti.editProtocol.action.importProtocolBenthos.help=editProtocol.html\#actionsBenthos tutti.editProtocol.action.importProtocolCaracteristic.help=editProtocol.html\#actionsCaracteristics +tutti.editProtocol.action.importProtocolColumns.help= tutti.editProtocol.action.importProtocolSpecies.help=editProtocol.html\#actionsSpecies tutti.editProtocol.action.removeBenthosProtocol.help=editProtocol.html\#actionsBenthos tutti.editProtocol.action.removeSpeciesProtocol.help=editProtocol.html\#actionsSpecies diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java new file mode 100644 index 0000000..725e2cd --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java @@ -0,0 +1,65 @@ +package fr.ifremer.tutti.ui.swing.action; + +import com.csvreader.CsvReader; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class LoadProtocolImportColumnsAction extends AbstractTuttiAction<EditProtocolUIModel, EditProtocolUI, EditProtocolUIHandler> { + + private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); + + protected File columnsFile; + + public LoadProtocolImportColumnsAction(EditProtocolUIHandler handler) { + super(handler, false); + } + + @Override + public boolean prepareAction() throws Exception { + boolean result = super.prepareAction(); + + if (result) { + columnsFile = chooseFile(t("tutti.editProtocol.action.title.choose.importColumnsFile"), + t("tutti.editProtocol.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); + + result = columnsFile != null; + } + + return result; + } + + @Override + public void doAction() throws Exception { + FileInputStream fileInputStream = new FileInputStream(columnsFile); + CsvReader csvReader = new CsvReader(fileInputStream, ';', Charset.forName("UTF-8")); + if (csvReader.readHeaders()) { + String[] headers = csvReader.getHeaders(); + List<String> importColumns = Arrays.asList(headers); + Collections.sort(importColumns); + getModel().setImportColumns(importColumns); + } + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + sendMessage(t("tutti.editProtocol.action.loadImportColumns.success", getModel().sizeImportColumns())); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java index f1b92fc..b3f2903 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java @@ -6,11 +6,18 @@ import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.editor.bean.BeanUIUtil; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor; +import org.jdesktop.swingx.autocomplete.ObjectToStringConverter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import org.jdesktop.swingx.table.TableColumnExt; +import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import javax.swing.*; @@ -93,12 +100,43 @@ public class CaracteristicMappingUIHandler CaracteristicMappingUIModel model = new CaracteristicMappingUIModel(); model.setCaracteristics(editProtocolUIModel.getCaracteristics()); + editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_CARACTERISTIC_MAPPING, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { getModel().setCaracteristicMappingRows((List<CaracteristicMappingRow>) evt.getNewValue()); } }); + + editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_IMPORT_COLUMNS, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + Collection<String> newValue = (Collection<String>) evt.getNewValue(); + ArrayList<String> dataToList = new ArrayList<String>(); + + if (newValue != null) { + dataToList.addAll(newValue); + + // add a null value at first position + if (!dataToList.isEmpty() && dataToList.get(0) != null) { + dataToList.add(0, null); + } + + } else { + dataToList.add(null); + } + + JComboBox comboBox = new JComboBox(); + SwingUtil.fillComboBox(comboBox, dataToList, null); + + TableColumnExt col = getTable().getColumnExt(2); + ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); + col.setCellEditor(editor); + + } + }); + ui.setContextValue(model); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java index d07ab9f..03538c9 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java @@ -22,10 +22,14 @@ import java.util.Map; public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel, CaracteristicMappingUIModel> { public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; + public static final String PROPERTY_CARACTERISTICS_IN_MAPPING = "caracteristicsInMapping"; protected List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(); + protected Map<String, CaracteristicMappingRow> caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); + protected List<String> importColumns = new ArrayList<String>(); + public CaracteristicMappingUIModel() { super(CaracteristicMappingRow.class, null, null); } @@ -53,6 +57,18 @@ public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<Carac })); } firePropertyChanged(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, caracteristicMappingRows); + firePropertyChanged(PROPERTY_CARACTERISTICS_IN_MAPPING, null, this.caracteristicMappingRows.values()); + } + + public List<String> getImportColumns() { + return importColumns; + } + + public void setImportColumns(List<String> importColumns) { + this.importColumns.clear(); + if (importColumns != null) { + this.importColumns.addAll(importColumns); + } } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css index 9b882b7..aec68ad 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css @@ -268,3 +268,12 @@ JTextField { _help: {"tutti.editProtocol.action.exportProtocolAllCaracteristic.help"}; } +#importColumnsButton { + actionIcon: import; + text: "tutti.editProtocol.action.importProtocolColumns"; + toolTipText: "tutti.editProtocol.action.importProtocolColumns.tip"; + i18nMnemonic: "tutti.editProtocol.action.importProtocolColumns.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.LoadProtocolImportColumnsAction.class}; + _help: {"tutti.editProtocol.action.importProtocolColumns.help"}; +} + diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx index b8e29f4..1644756 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx @@ -108,7 +108,10 @@ <JButton id='importCaracteristicButton'/> <JButton id='exportCaracteristicButton'/> <JButton id='exportAllCaracteristicButton'/> + <JButton id='importColumnsButton'/> + </JPanel> + <JTabbedPane id='caracteristicPane' constraints='BorderLayout.CENTER'> <tab title='tutti.editProtocol.tab.caracteristic.lengthClasses'> <BeanDoubleList id='lengthClassesList' genericType='Caracteristic'/> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index eed2950..506a97b 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -603,4 +603,66 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, public void setVersion(Integer version) { editObject.setVersion(version); } + + @Override + public String getImportColumns(int index) { + return editObject.getImportColumns(index); + } + + @Override + public boolean isImportColumnsEmpty() { + return editObject.isImportColumnsEmpty(); + } + + @Override + public int sizeImportColumns() { + return editObject.sizeImportColumns(); + } + + @Override + public void addImportColumns(String importColumns) { + editObject.addImportColumns(importColumns); + firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns()); + } + + @Override + public void addAllImportColumns(Collection<String> importColumns) { + editObject.addAllImportColumns(importColumns); + firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns()); + } + + @Override + public boolean removeImportColumns(String importColumns) { + boolean removeImportColumns = editObject.removeImportColumns(importColumns); + firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns()); + return removeImportColumns; + } + + @Override + public boolean removeAllImportColumns(Collection<String> importColumns) { + boolean removeAllImportColumns = editObject.removeAllImportColumns(importColumns); + firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns()); + return removeAllImportColumns; + } + + @Override + public boolean containsImportColumns(String importColumns) { + return editObject.containsImportColumns(importColumns); + } + + @Override + public boolean containsAllImportColumns(Collection<String> importColumns) { + return editObject.containsAllImportColumns(importColumns); + } + + @Override + public Collection<String> getImportColumns() { + return editObject.getImportColumns(); + } + + @Override + public void setImportColumns(Collection<String> importColumns) { + editObject.setImportColumns(importColumns); + firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns()); + } } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 245b3a6..8fbf9d3 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -889,6 +889,7 @@ tutti.editProtocol.action.addBenthosProtocol.mnemonic= tutti.editProtocol.action.addBenthosProtocol.tip= tutti.editProtocol.action.addSpeciesProtocol.mnemonic= tutti.editProtocol.action.addSpeciesProtocol.tip= +tutti.editProtocol.action.chooseColumnsFile.import= tutti.editProtocol.action.chooseProtocolBenthosFile= tutti.editProtocol.action.chooseProtocolCaracteristicFile= tutti.editProtocol.action.chooseProtocolSpeciesFile= @@ -920,6 +921,9 @@ tutti.editProtocol.action.importProtocolBenthos.tip= tutti.editProtocol.action.importProtocolCaracteristic= tutti.editProtocol.action.importProtocolCaracteristic.mnemonic= tutti.editProtocol.action.importProtocolCaracteristic.tip= +tutti.editProtocol.action.importProtocolColumns= +tutti.editProtocol.action.importProtocolColumns.mnemonic= +tutti.editProtocol.action.importProtocolColumns.tip= tutti.editProtocol.action.importProtocolSpecies= tutti.editProtocol.action.importProtocolSpecies.mnemonic= tutti.editProtocol.action.importProtocolSpecies.speciesInBenthos= @@ -927,6 +931,7 @@ tutti.editProtocol.action.importProtocolSpecies.speciesInBenthos.title= tutti.editProtocol.action.importProtocolSpecies.tip= tutti.editProtocol.action.importSpecies.speciesInBenthos= tutti.editProtocol.action.importSpecies.speciesInBenthos.title= +tutti.editProtocol.action.loadImportColumns.success= tutti.editProtocol.action.removeBenthosProtocol= tutti.editProtocol.action.removeBenthosProtocol.mnemonic= tutti.editProtocol.action.removeBenthosProtocol.tip= @@ -942,6 +947,7 @@ tutti.editProtocol.action.selectOtherBenthos.tip= tutti.editProtocol.action.selectOtherSpecies= tutti.editProtocol.action.selectOtherSpecies.mnemonic= tutti.editProtocol.action.selectOtherSpecies.tip= +tutti.editProtocol.action.title.choose.importColumnsFile= tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveProtocol= tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel= tutti.editProtocol.askSaveBeforeLeaving.saveProtocol= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index d5f5451..d18ab1c 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -871,6 +871,7 @@ tutti.editProtocol.action.addBenthosProtocol.mnemonic=j tutti.editProtocol.action.addBenthosProtocol.tip=Ajouter une espèce du benthos au protocole tutti.editProtocol.action.addSpeciesProtocol.mnemonic=j tutti.editProtocol.action.addSpeciesProtocol.tip=Ajouter une espèce au protocole +tutti.editProtocol.action.chooseColumnsFile.import=Choisir le fichier contenant les colonnes tutti.editProtocol.action.chooseProtocolBenthosFile=Choisir le fichier des benthos tutti.editProtocol.action.chooseProtocolCaracteristicFile=Choisir le fichier des caractéristiques tutti.editProtocol.action.chooseProtocolSpeciesFile=Choisir le fichier des espèces @@ -900,11 +901,15 @@ tutti.editProtocol.action.importProtocolBenthos.tip=Importer les benthos dans le tutti.editProtocol.action.importProtocolCaracteristic=Importer les caractéristiques tutti.editProtocol.action.importProtocolCaracteristic.mnemonic=i tutti.editProtocol.action.importProtocolCaracteristic.tip=Importer les caractéristiques dans le protocole +tutti.editProtocol.action.importProtocolColumns=Importer les colonnes d'import +tutti.editProtocol.action.importProtocolColumns.mnemonic=c +tutti.editProtocol.action.importProtocolColumns.tip=Importer les colonnes d'import tutti.editProtocol.action.importProtocolSpecies=Importer les espèces tutti.editProtocol.action.importProtocolSpecies.mnemonic=é tutti.editProtocol.action.importProtocolSpecies.speciesInBenthos=Les espèces suivantes n'ont pas été importées car elles sont déjà présentes dans le benthos \:<ul>%s</ul> tutti.editProtocol.action.importProtocolSpecies.speciesInBenthos.title=Espèces non importées tutti.editProtocol.action.importProtocolSpecies.tip=Importer les espèces dans le protocole +tutti.editProtocol.action.loadImportColumns.success=%s colonnes importées avec succès tutti.editProtocol.action.removeBenthosProtocol=Supprimer les benthos tutti.editProtocol.action.removeBenthosProtocol.mnemonic=S tutti.editProtocol.action.removeBenthosProtocol.tip=Supprimer les benthos sélectionnés @@ -920,6 +925,7 @@ tutti.editProtocol.action.selectOtherBenthos.tip=Sélectionner une autre espèce tutti.editProtocol.action.selectOtherSpecies=... tutti.editProtocol.action.selectOtherSpecies.mnemonic=. tutti.editProtocol.action.selectOtherSpecies.tip=Sélectionner une autre espèce (dans les synonymes) +tutti.editProtocol.action.title.choose.importColumnsFile=Importer les colonnes d'import tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveProtocol=Le protocole n'est pas valide et ne peut pas être enregistré tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel=La catégorisation n'est pas valide et ne peut pas être enregistré tutti.editProtocol.askSaveBeforeLeaving.saveProtocol=Des modifications sur le protocole n'ont pas été enregistrées -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit b0465940ceaa9e704ca6462d9a4d2ae4343eeda8 Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 2 19:09:14 2014 +0100 refs #6129 mapping des champs du trait avec les colonnes + début import dans le trait --- .../entities/protocol/TuttiProtocols.java | 4 + .../src/main/xmi/tutti-persistence.zargo | Bin 57440 -> 57963 bytes .../src/main/xmi/tutti-persistence.zargo~ | Bin 57378 -> 57440 bytes .../filtered-resources/tutti-help-fr.properties | 3 +- .../swing/action/ImportFromColumnFileAction.java | 187 +++++++++++++++++++ .../action/LoadProtocolImportColumnsAction.java | 13 +- .../tutti/ui/swing/action/SaveProtocolAction.java | 5 + .../content/operation/EditFishingOperationUI.css | 9 + .../content/operation/EditFishingOperationUI.jaxx | 1 + .../content/protocol/CaracteristicMappingUI.css | 13 ++ .../content/protocol/CaracteristicMappingUI.jaxx | 12 +- .../protocol/CaracteristicMappingUIHandler.java | 203 +++++++++++++++++---- .../protocol/CaracteristicMappingUIModel.java | 21 +++ .../EditProtocolOperationFieldsRowModel.java | 66 +++++++ .../EditProtocolOperationFieldsTableModel.java | 37 ++++ .../content/protocol/EditProtocolUIHandler.java | 4 + .../content/protocol/EditProtocolUIModel.java | 63 +++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 11 ++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 11 ++ 19 files changed, 614 insertions(+), 49 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index acfb9b9..afa555c 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -76,6 +76,8 @@ public class TuttiProtocols extends AbstractTuttiProtocols { /** Logger. */ private static final Log log = LogFactory.getLog(TuttiProtocols.class); + public static final int CURRENT_PROTOCOL_VERSION = 3; + public static void toFile(TuttiProtocol protocol, File file) { String id = protocol.getId(); @@ -353,6 +355,8 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } result.setCaracteristicMapping(caracteristicMappingRows); + //TODO finish + return result; } diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo b/tutti-persistence/src/main/xmi/tutti-persistence.zargo index b3c7107..4f0e671 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo differ diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ index 982bb6a..b3c7107 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ differ diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index 001e779..8529f64 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -22,7 +22,7 @@ # #L% ### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Mon Dec 01 10:21:58 CET 2014 +#Mon Dec 01 16:05:35 CET 2014 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -194,6 +194,7 @@ tutti.editCruise.help=editCruise.html tutti.editFishingOperation.action.attachments.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.action.cancelEditFishingOperation.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.action.importCasino.help=editFishingOperation.html\#traitActions +tutti.editFishingOperation.action.importFromColumnFile.help= tutti.editFishingOperation.action.resetFishingOperationValidState.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.action.saveEditFishingOperation.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.field.comment.help=editFishingOperation.html\#traitFields diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java new file mode 100644 index 0000000..259f96f --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -0,0 +1,187 @@ +package fr.ifremer.tutti.ui.swing.action; + +import com.csvreader.CsvReader; +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.FishingOperations; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.service.TuttiCsvUtil; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUIModel; +import org.apache.commons.io.Charsets; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Import; +import org.nuiton.csv.ValueParser; +import org.nuiton.csv.ext.CsvReaders; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { + + private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); + + protected File columnsFile; + + public ImportFromColumnFileAction(EditFishingOperationUIHandler handler) { + super(handler, true); + } + + @Override + public boolean prepareAction() throws Exception { + boolean result = super.prepareAction(); + + if (result) { + columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), + t("tutti.editFishingOperation.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); + + result = columnsFile != null; + } + + return result; + } + + @Override + public void doAction() throws Exception { + + Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); + + ImportFromColumnFile importModel = new ImportFromColumnFile(';', headers); + Import<FishingOperation> operationUIModelImport = + Import.newImport(importModel, new FileInputStream(columnsFile)); + + TuttiProtocol protocol = getDataContext().getProtocol(); + final Map<String, OperationFieldMappingRow> mappingRowsByField = + Maps.uniqueIndex(protocol.getOperationFieldMapping(), new Function<OperationFieldMappingRow, String>() { + @Override + public String apply(OperationFieldMappingRow operationFieldMappingRow) { + return operationFieldMappingRow.getField(); + } + }); + + // predicate to check if the row matches the model key defined by the protocol + Predicate<FishingOperation> predicate = new Predicate<FishingOperation>() { + @Override + public boolean apply(FishingOperation fishingOperation) { + + String operationNumberColumn = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER).getImportColumn(); + String stationColumn = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER).getImportColumn(); + String startDateColumn = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE).getImportColumn(); + + EditFishingOperationUIModel model = getModel(); + boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); + boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); + boolean sameGearShootingStartDate = Objects.equals(fishingOperation.getGearShootingStartDate(), model.getGearShootingStartDate()); + + return (StringUtils.isBlank(stationColumn) || sameStationNumber) + && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) + && (StringUtils.isBlank(startDateColumn) || sameGearShootingStartDate); + } + }; + + boolean found = false; + while (!found && operationUIModelImport.iterator().hasNext()) { + FishingOperation next = operationUIModelImport.iterator().next(); + if (predicate.apply(next)) { + getModel().fromEntity(next); + found = true; + } + } + + if (!found) { + throw new Exception(t("tutti.editFishingOperation.action.importColumns.operationNotFound")); + } + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + } + + protected class ImportFromColumnFile extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { + + public ImportFromColumnFile(char separator, Set<String> headers) { + super(separator); + + TuttiProtocol protocol = getDataContext().getProtocol(); + Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); + + for (OperationFieldMappingRow mappingRow : operationFieldMapping) { + String importColumn = mappingRow.getImportColumn(); + if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { + + String field = mappingRow.getField(); + ValueParser valueParser; + switch (field) { + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_NUMBER: + valueParser = TuttiCsvUtil.INTEGER; + break; + + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE: + case EditFishingOperationUIModel.PROPERTY_TRAWL_DISTANCE: + valueParser = TuttiCsvUtil.FLOAT; + break; + + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_DATE: + valueParser = TuttiCsvUtil.DAY_TIME; + break; + + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE: + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: + valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; + break; + + case EditFishingOperationUIModel.PROPERTY_GEAR: + case EditFishingOperationUIModel.PROPERTY_VESSEL: + case EditFishingOperationUIModel.PROPERTY_STRATA: + case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: + case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: + case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: + + default: + valueParser = TuttiCsvUtil.STRING; + + } + newMandatoryColumn(importColumn, field, valueParser); + } + } + for (String header : headers) { + newIgnoredColumn(header); + } + } + + @Override + public FishingOperation newEmptyInstance() { + return FishingOperations.newFishingOperation(); + } + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java index 725e2cd..e807876 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java @@ -6,6 +6,7 @@ import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.ext.CsvReaders; import java.io.File; import java.io.FileInputStream; @@ -47,14 +48,10 @@ public class LoadProtocolImportColumnsAction extends AbstractTuttiAction<EditPro @Override public void doAction() throws Exception { - FileInputStream fileInputStream = new FileInputStream(columnsFile); - CsvReader csvReader = new CsvReader(fileInputStream, ';', Charset.forName("UTF-8")); - if (csvReader.readHeaders()) { - String[] headers = csvReader.getHeaders(); - List<String> importColumns = Arrays.asList(headers); - Collections.sort(importColumns); - getModel().setImportColumns(importColumns); - } + String[] headers = CsvReaders.getHeader(columnsFile, ';'); + List<String> importColumns = Arrays.asList(headers); + Collections.sort(importColumns); + getModel().setImportColumns(importColumns); } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java index c6378be..4d96eab 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java @@ -26,6 +26,7 @@ package fr.ifremer.tutti.ui.swing.action; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; @@ -74,6 +75,10 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, new ArrayList<>(getUI().getCaracteristicsTable().getModel().getCaracteristicMapping().values()); bean.setCaracteristicMapping(caracteristicMappingRows); + List<OperationFieldMappingRow> operationFieldMappingRows = + new ArrayList<>(getUI().getCaracteristicsTable().getModel().getOperationFieldMappingRows().values()); + bean.setOperationFieldMapping(operationFieldMappingRows); + // get the species protocols from the table List<SpeciesProtocol> speciesProtocols = Lists.newArrayList(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css index 8a362e6..fe79d09 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css @@ -80,6 +80,15 @@ JXDatePicker { _onlyVerticalScrollable: true; } +#importFromColumnFile { + actionIcon: import; + text: "tutti.editFishingOperation.action.importFromColumnFile"; + toolTipText: "tutti.editFishingOperation.action.importFromColumnFile.tip"; + i18nMnemonic: "tutti.editFishingOperation.action.importFromColumnFile.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFromColumnFileAction.class}; + _help: {"tutti.editFishingOperation.action.importFromColumnFile.help"}; +} + #fishingOperationAttachmentsButton { enabled: {model.getId() != null}; toolTipText: "tutti.editFishingOperation.action.attachments.tip"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx index 23b0c18..909b0d3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx @@ -154,6 +154,7 @@ public EditFishingOperationUI(FishingOperationsUI parentUI) { constructorParams='"tuttihelp.editeditFishingOperation.help"'/> <JToolBar id='traitGeneralTabPaneToolBar'> + <JButton id='importFromColumnFile'/> <ButtonAttachment id='fishingOperationAttachmentsButton' constructorParams='getHandler().getContext(), getModel()'/> </JToolBar> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css index 4773389..d92ab70 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css @@ -1,7 +1,20 @@ +#splitpane { + orientation: {JSplitPane.VERTICAL_SPLIT}; + resizeWeight: 1.0; +} + #caracteristicsTable { selectionMode: {ListSelectionModel.SINGLE_SELECTION}; selectionBackground: {null}; selectionForeground: {Color.BLACK}; sortable: false; enabled: true; +} + +#operationFieldsTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; + enabled: true; } \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx index 8706193..52c3949 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx @@ -34,7 +34,13 @@ <CaracteristicMappingUIModel id='model' initializer='getContextValue(CaracteristicMappingUIModel.class)'/> - <JScrollPane constraints="BorderLayout.CENTER"> - <JXTable id='caracteristicsTable'/> - </JScrollPane> + <JSplitPane id="splitpane" constraints="BorderLayout.CENTER"> + <JScrollPane> + <JXTable id='caracteristicsTable'/> + </JScrollPane> + <JScrollPane> + <JXTable id='operationFieldsMapping'/> + </JScrollPane> + </JSplitPane> + </JPanel> \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java index b3f2903..5c4252a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java @@ -1,31 +1,36 @@ package fr.ifremer.tutti.ui.swing.content.protocol; import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import jaxx.runtime.JAXXUtil; import jaxx.runtime.SwingUtil; -import jaxx.runtime.swing.editor.bean.BeanUIUtil; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor; -import org.jdesktop.swingx.autocomplete.ObjectToStringConverter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.jdesktop.swingx.table.TableColumnExt; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import javax.swing.*; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellRenderer; +import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static org.nuiton.i18n.I18n.t; /** * @author Kevin Morin (Code Lutin) @@ -100,6 +105,7 @@ public class CaracteristicMappingUIHandler CaracteristicMappingUIModel model = new CaracteristicMappingUIModel(); model.setCaracteristics(editProtocolUIModel.getCaracteristics()); + model.setOperationFieldMappingRows(editProtocolUIModel.getOperationFieldMapping()); editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_CARACTERISTIC_MAPPING, new PropertyChangeListener() { @Override @@ -108,6 +114,13 @@ public class CaracteristicMappingUIHandler } }); + editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_OPERATION_FIELD_MAPPING, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + getModel().setOperationFieldMappingRows((List<OperationFieldMappingRow>) evt.getNewValue()); + } + }); + editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_IMPORT_COLUMNS, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { @@ -127,12 +140,8 @@ public class CaracteristicMappingUIHandler dataToList.add(null); } - JComboBox comboBox = new JComboBox(); - SwingUtil.fillComboBox(comboBox, dataToList, null); - - TableColumnExt col = getTable().getColumnExt(2); - ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); - col.setCellEditor(editor); + populateImportColumnTableEditor(getTable(), 2, dataToList); + populateImportColumnTableEditor(getUI().getOperationFieldsMapping(), 1, dataToList); } }); @@ -140,54 +149,174 @@ public class CaracteristicMappingUIHandler ui.setContextValue(model); } + protected void populateImportColumnTableEditor(JXTable table, int columnIndex, ArrayList<String> dataToList) { + JComboBox comboBox = new JComboBox(); + SwingUtil.fillComboBox(comboBox, dataToList, null); + + TableColumnExt col = table.getColumnExt(columnIndex); + ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); + col.setCellEditor(editor); + } + @Override public void afterInit(CaracteristicMappingUI caracteristicMappingUI) { initUI(this.ui); - JXTable caracteristicsMappingTable = caracteristicMappingUI.getCaracteristicsTable(); + // init caracteristics mappingtable + { + JXTable caracteristicsMappingTable = getTable(); - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); -// getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, new PropertyChangeListener() { -// @Override -// public void propertyChange(PropertyChangeEvent evt) { -// List<String> ids = (List<String>) evt.getNewValue(); -// selectLengthClasses(ids, comboBox); -// } -// }); + // getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, new PropertyChangeListener() { + // @Override + // public void propertyChange(PropertyChangeEvent evt) { + // List<String> ids = (List<String>) evt.getNewValue(); + // selectLengthClasses(ids, comboBox); + // } + // }); - List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.PSFM_ID, - getDecorator(Caracteristic.class, null), - caracteristics); + List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.PSFM_ID, + getDecorator(Caracteristic.class, null), + caracteristics); - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.TYPE, - getDecorator(CaracteristicType.class, null), - Lists.newArrayList(CaracteristicType.getTabTypes())); + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.TYPE, + getDecorator(CaracteristicType.class, null), + Lists.newArrayList(CaracteristicType.getTabTypes())); - addColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); + addColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); - EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); - caracteristicsMappingTable.setModel(tableModel); - caracteristicsMappingTable.setColumnModel(columnModel); + EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); + caracteristicsMappingTable.setModel(tableModel); + caracteristicsMappingTable.setColumnModel(columnModel); - initTable(caracteristicsMappingTable); + initTable(caracteristicsMappingTable); + + getModel().setRows(new ArrayList<EditProtocolCaracteristicsRowModel>()); + } + + // init operation fields table + { + JXTable operationFieldsTable = getUI().getOperationFieldsMapping(); + + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + + addColumnToModel(columnModel, + null, + new DefaultTableCellRenderer() { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setText(t("tutti.editFishingOperation.field." + value.toString())); + return this; + } + }, + EditProtocolOperationFieldsTableModel.FIELD); + + addColumnToModel(columnModel, + EditProtocolOperationFieldsTableModel.IMPORT_FILE_COLUMN); + + EditProtocolOperationFieldsTableModel tableModel = new EditProtocolOperationFieldsTableModel(columnModel); + operationFieldsTable.setModel(tableModel); + operationFieldsTable.setColumnModel(columnModel); + + // by default do not authorize to change column orders + operationFieldsTable.getTableHeader().setReorderingAllowed(false); + + addHighlighters(operationFieldsTable); + + tableModel.setRows(new ArrayList<EditProtocolOperationFieldsRowModel>()); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_STATION_NUMBER); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_DATE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_TRAWL_DISTANCE); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_VALID); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_MULTIRIG_AGGREGATION); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_RECORDER_PERSON); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_VESSEL); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_STRATA); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_SUB_STRATA); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_LOCATION); + createOperationFieldRow(tableModel, FishingOperation.PROPERTY_SECONDARY_VESSEL); + //TODO voir avec Vincent comment on gère le cas où aucun des champs clé n'est renseigné + + // when model data change let's propagate it table model +// getModel().addPropertyChangeListener(AbstractTuttiTableUIModel.PROPERTY_ROWS, new PropertyChangeListener() { +// @Override +// public void propertyChange(PropertyChangeEvent evt) { +// log.info("row schanged"); +// onModelRowsChanged((List<R>) evt.getNewValue()); +// } +// }); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(operationFieldsTable); + } getModel().addPropertyChangeListener(CaracteristicMappingUIModel.PROPERTY_CARACTERISTIC_MAPPING_ROWS, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - populateTable((Collection<CaracteristicMappingRow>) evt.getNewValue()); + populateCaracteristicsTable((Collection<CaracteristicMappingRow>) evt.getNewValue()); } }); + getModel().addPropertyChangeListener(CaracteristicMappingUIModel.PROPERTY_OPERATION_FIELD_MAPPING_ROWS, + new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + populateFieldsTable((Map<String, OperationFieldMappingRow>) evt.getNewValue()); + } + }); + + } + + protected void createOperationFieldRow(EditProtocolOperationFieldsTableModel tableModel, String property) { + EditProtocolOperationFieldsRowModel row = tableModel.createNewRow(); + row.setField(property); + row.setValid(true); + row.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + EditProtocolOperationFieldsRowModel row = (EditProtocolOperationFieldsRowModel) evt.getSource(); + Map<String, OperationFieldMappingRow> operationFieldMappingRows = getModel().getOperationFieldMappingRows(); + + OperationFieldMappingRow operationFieldMappingRow = operationFieldMappingRows.get(row.getField()); + if (operationFieldMappingRow != null) { + operationFieldMappingRow.setImportColumn(row.getImportFileColumn()); + + } else { + operationFieldMappingRows.put(row.getField(), row.toBean()); + } + getModel().setModify(true); + } + }); + tableModel.addNewRow(row); + } + + protected void populateFieldsTable(Map<String, OperationFieldMappingRow> fieldRows) { + EditProtocolOperationFieldsTableModel tableModel = + (EditProtocolOperationFieldsTableModel) getUI().getOperationFieldsMapping().getModel(); + for (EditProtocolOperationFieldsRowModel row : tableModel.getRows()) { + OperationFieldMappingRow mappingRow = fieldRows.get(row.getField()); + if (mappingRow != null) { + row.setImportFileColumn(mappingRow.getImportColumn()); + } + } } - protected void populateTable(Collection<CaracteristicMappingRow> values) { + protected void populateCaracteristicsTable(Collection<CaracteristicMappingRow> values) { List<EditProtocolCaracteristicsRowModel> rows = new ArrayList<EditProtocolCaracteristicsRowModel>(); for (CaracteristicMappingRow row : values) { EditProtocolCaracteristicsRowModel rowModel = getTableModel().createNewRow(); @@ -195,7 +324,7 @@ public class CaracteristicMappingUIHandler recomputeRowValidState(rowModel); rows.add(rowModel); } - getTableModel().setRows(rows); + getModel().setRows(rows); } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java index 03538c9..a353eb5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java @@ -4,6 +4,7 @@ import com.google.common.base.Function; import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; import org.nuiton.util.beans.Binder; @@ -23,11 +24,14 @@ public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<Carac public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; public static final String PROPERTY_CARACTERISTICS_IN_MAPPING = "caracteristicsInMapping"; + public static final String PROPERTY_OPERATION_FIELD_MAPPING_ROWS = "operationFieldMappingRows"; protected List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(); protected Map<String, CaracteristicMappingRow> caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); + protected Map<String, OperationFieldMappingRow> operationFieldMappingRows = new HashMap<String, OperationFieldMappingRow>(); + protected List<String> importColumns = new ArrayList<String>(); public CaracteristicMappingUIModel() { @@ -60,6 +64,23 @@ public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<Carac firePropertyChanged(PROPERTY_CARACTERISTICS_IN_MAPPING, null, this.caracteristicMappingRows.values()); } + public Map<String, OperationFieldMappingRow> getOperationFieldMappingRows() { + return operationFieldMappingRows; + } + + public void setOperationFieldMappingRows(Collection<OperationFieldMappingRow> operationFieldMappingRows) { + this.operationFieldMappingRows = new HashMap<String, OperationFieldMappingRow>(); + if (operationFieldMappingRows != null) { + this.operationFieldMappingRows.putAll(Maps.uniqueIndex(operationFieldMappingRows, new Function<OperationFieldMappingRow, String>() { + @Override + public String apply(OperationFieldMappingRow operationFieldMappingRow) { + return operationFieldMappingRow.getField(); + } + })); + } + firePropertyChanged(PROPERTY_OPERATION_FIELD_MAPPING_ROWS, null, this.operationFieldMappingRows); + } + public List<String> getImportColumns() { return importColumns; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java new file mode 100644 index 0000000..ac16751 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java @@ -0,0 +1,66 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRowBean; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class EditProtocolOperationFieldsRowModel extends AbstractTuttiBeanUIModel<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> { + + public static final String PROPERTY_FIELD = "field"; + public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + + protected String field; + protected String importFileColumn; + + protected static final Binder<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> fromBeanBinder = + BinderFactory.newBinder(OperationFieldMappingRow.class, + EditProtocolOperationFieldsRowModel.class); + + protected static final Binder<EditProtocolOperationFieldsRowModel, OperationFieldMappingRow> toBeanBinder = + BinderFactory.newBinder(EditProtocolOperationFieldsRowModel.class, + OperationFieldMappingRow.class); + + public EditProtocolOperationFieldsRowModel() { + super(fromBeanBinder, toBeanBinder); + } + + public String getField() { + return field; + } + + public void setField(String field) { + Object oldValue = getField(); + this.field = field; + firePropertyChanged(PROPERTY_FIELD, oldValue, field); + } + + public String getImportFileColumn() { + return importFileColumn; + } + + public void setImportFileColumn(String importFileColumn) { + Object oldValue = getImportFileColumn(); + this.importFileColumn = importFileColumn; + firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); + } + + @Override + protected OperationFieldMappingRow newEntity() { + return new OperationFieldMappingRowBean(); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java new file mode 100644 index 0000000..5d636a9 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java @@ -0,0 +1,37 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import org.jdesktop.swingx.table.TableColumnModelExt; +import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; +import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; + +import java.util.Collection; + +import static org.nuiton.i18n.I18n.n; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class EditProtocolOperationFieldsTableModel extends AbstractApplicationTableModel<EditProtocolOperationFieldsRowModel> { + + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> FIELD = ColumnIdentifier.newId( + EditProtocolOperationFieldsRowModel.PROPERTY_FIELD, + n("tutti.editProtocol.table.header.operationFields.field"), + n("tutti.editProtocol.table.header.operationFields.field.tip")); + + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> IMPORT_FILE_COLUMN = ColumnIdentifier.newId( + EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_FILE_COLUMN, + n("tutti.editProtocol.table.header.operationFields.importFileColumn"), + n("tutti.editProtocol.table.header.operationFields.importFileColumn.tip")); + + public EditProtocolOperationFieldsTableModel(TableColumnModelExt columnModel) { + super(columnModel, false, false); + setNoneEditableCols(FIELD); + } + + @Override + public EditProtocolOperationFieldsRowModel createNewRow() { + return new EditProtocolOperationFieldsRowModel(); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index 5100218..a3012c3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -34,6 +34,7 @@ import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModelEntry; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Speciess; @@ -458,8 +459,11 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI } }); + model.setVersion(TuttiProtocols.CURRENT_PROTOCOL_VERSION); + dialog = new SelectSpeciesUI(false, this.ui); + ui.getCaracteristicsTable().getModel().setModify(false); listenModelModifiy(ui.getCaracteristicsTable().getModel()); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index 506a97b..5650ef4 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -26,6 +26,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; @@ -665,4 +666,66 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, editObject.setImportColumns(importColumns); firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns()); } + + @Override + public void setOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + editObject.setOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + } + + @Override + public Collection<OperationFieldMappingRow> getOperationFieldMapping() { + return editObject.getOperationFieldMapping(); + } + + @Override + public boolean containsAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + return editObject.containsAllOperationFieldMapping(operationFieldMapping); + } + + @Override + public boolean containsOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) { + return editObject.containsOperationFieldMapping(operationFieldMapping); + } + + @Override + public boolean removeAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + boolean removeAllOperationFieldMapping = editObject.removeAllOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + return removeAllOperationFieldMapping; + } + + @Override + public boolean removeOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) { + boolean removeOperationFieldMapping = editObject.removeOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + return removeOperationFieldMapping; + } + + @Override + public void addAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + editObject.addAllOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + } + + @Override + public void addOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) { + editObject.addOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + } + + @Override + public int sizeOperationFieldMapping() { + return editObject.sizeOperationFieldMapping(); + } + + @Override + public boolean isOperationFieldMappingEmpty() { + return editObject.isOperationFieldMappingEmpty(); + } + + @Override + public OperationFieldMappingRow getOperationFieldMapping(int index) { + return editObject.getOperationFieldMapping(index); + } } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 8fbf9d3..d2ec62e 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -695,10 +695,16 @@ tutti.editFishingOperation.action.attachments.tip= tutti.editFishingOperation.action.cancelEditFishingOperation= tutti.editFishingOperation.action.cancelEditFishingOperation.mnemonic= tutti.editFishingOperation.action.cancelEditFishingOperation.tip= +tutti.editFishingOperation.action.chooseColumnsFile.import= tutti.editFishingOperation.action.deleteFishingOperation.message= tutti.editFishingOperation.action.deleteFishingOperation.tip= tutti.editFishingOperation.action.deleteFishingOperation.title= tutti.editFishingOperation.action.editFishingOperation.tip= +tutti.editFishingOperation.action.importColumns.operationNotFound= +tutti.editFishingOperation.action.importColumns.success= +tutti.editFishingOperation.action.importFromColumnFile= +tutti.editFishingOperation.action.importFromColumnFile.mnemonic= +tutti.editFishingOperation.action.importFromColumnFile.tip= tutti.editFishingOperation.action.resetEditFishingOperation= tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic= tutti.editFishingOperation.action.resetEditFishingOperation.tip= @@ -708,6 +714,7 @@ tutti.editFishingOperation.action.resetFishingOperationValidState.tip= tutti.editFishingOperation.action.saveEditFishingOperation.mnemonic= tutti.editFishingOperation.action.saveEditFishingOperation.tip= tutti.editFishingOperation.action.saveFishingOperation= +tutti.editFishingOperation.action.title.choose.importColumnsFile= tutti.editFishingOperation.askCancelEditBeforeLeaving.cancelEditFishingOperation= tutti.editFishingOperation.askSaveBeforeLeaving.createFishingOperation= tutti.editFishingOperation.askSaveBeforeLeaving.saveFishingOperation= @@ -979,6 +986,10 @@ tutti.editProtocol.table.header.countIfNoFrequency= tutti.editProtocol.table.header.countIfNoFrequency.tip= tutti.editProtocol.table.header.lengthStep= tutti.editProtocol.table.header.lengthStep.tip= +tutti.editProtocol.table.header.operationFields.field= +tutti.editProtocol.table.header.operationFields.field.tip= +tutti.editProtocol.table.header.operationFields.importFileColumn= +tutti.editProtocol.table.header.operationFields.importFileColumn.tip= tutti.editProtocol.table.header.speciesReferenceTaxonId= tutti.editProtocol.table.header.speciesReferenceTaxonId.tip= tutti.editProtocol.table.header.speciesSurveyCode= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index d18ab1c..43e187b 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -677,10 +677,16 @@ tutti.editFishingOperation.action.attachments.tip=Pièces-jointes de l'opératio tutti.editFishingOperation.action.cancelEditFishingOperation=Annuler tutti.editFishingOperation.action.cancelEditFishingOperation.mnemonic=A tutti.editFishingOperation.action.cancelEditFishingOperation.tip=Annuler la création du trait +tutti.editFishingOperation.action.chooseColumnsFile.import=Choisir le fichier de colonnes tutti.editFishingOperation.action.deleteFishingOperation.message=Vous êtes sur le point de supprimer l'opération de pêche <strong>%s</strong> tutti.editFishingOperation.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.deleteFishingOperation.title=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.editFishingOperation.tip=Éditer l'opération de pêche +tutti.editFishingOperation.action.importColumns.operationNotFound=Le trait n'a pas été trouvé dans le fichier importé +tutti.editFishingOperation.action.importColumns.success=Les données du fichier ont été importées dans le trait +tutti.editFishingOperation.action.importFromColumnFile=Import du fichier de colonnes +tutti.editFishingOperation.action.importFromColumnFile.mnemonic=c +tutti.editFishingOperation.action.importFromColumnFile.tip=Import du fichier de colonnes tutti.editFishingOperation.action.resetEditFishingOperation=Réinitialiser tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic=R tutti.editFishingOperation.action.resetEditFishingOperation.tip=Réinitialiser l'édition du trait @@ -690,6 +696,7 @@ tutti.editFishingOperation.action.resetFishingOperationValidState.tip=Réinitial tutti.editFishingOperation.action.saveEditFishingOperation.mnemonic=E tutti.editFishingOperation.action.saveEditFishingOperation.tip=Enregistrer le trait tutti.editFishingOperation.action.saveFishingOperation=Enregistrer +tutti.editFishingOperation.action.title.choose.importColumnsFile=Importer par fichier de colonnes tutti.editFishingOperation.askCancelEditBeforeLeaving.cancelEditFishingOperation=Le trait modifié n'est pas valide et ne peut pas être enregistré tutti.editFishingOperation.askSaveBeforeLeaving.createFishingOperation=Le trait n'a pas été créé tutti.editFishingOperation.askSaveBeforeLeaving.saveFishingOperation=Des modifications sur le trait n'ont pas été enregistrées @@ -957,6 +964,10 @@ tutti.editProtocol.table.header.countIfNoFrequency=Dénombrement tutti.editProtocol.table.header.countIfNoFrequency.tip=L'espèce doit elle être dénombrée ? tutti.editProtocol.table.header.lengthStep=Mode de mensuration tutti.editProtocol.table.header.lengthStep.tip=Comment mesurer les classes de taille ? (si vide alors pas de mesure) +tutti.editProtocol.table.header.operationFields.field=Champ +tutti.editProtocol.table.header.operationFields.field.tip=Champ du formulaire de trait +tutti.editProtocol.table.header.operationFields.importFileColumn=Colonne du fichier d'import +tutti.editProtocol.table.header.operationFields.importFileColumn.tip=Colonne du fichier d'import tutti.editProtocol.table.header.speciesReferenceTaxonId=Espèce tutti.editProtocol.table.header.speciesReferenceTaxonId.tip=Code Rubin – Nom scientifique tutti.editProtocol.table.header.speciesSurveyCode=Code campagne -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 4085ac33909c11155d147699cab8ff455aad835f Author: Kevin Morin <morin@codelutin.com> Date: Mon Dec 8 17:38:25 2014 +0100 refactoring : table des caractéristiques non éditable, ajouter les caractéristiques depuis la liste déroulante au dessus --- .../entities/protocol/TuttiProtocols.java | 87 ++--- .../filtered-resources/tutti-help-fr.properties | 5 +- .../action/AddCaracteristicMappingAction.java | 96 ++++++ .../swing/action/ImportFromColumnFileAction.java | 87 +++-- .../swing/action/ImportProtocolBenthosAction.java | 2 +- .../swing/action/ImportProtocolSpeciesAction.java | 2 +- .../tutti/ui/swing/action/SaveProtocolAction.java | 24 +- .../content/protocol/CaracteristicMappingUI.css | 20 -- .../content/protocol/CaracteristicMappingUI.jaxx | 46 --- .../protocol/CaracteristicMappingUIHandler.java | 343 -------------------- .../protocol/CaracteristicMappingUIModel.java | 99 ------ .../EditProtocolCaracteristicsRowModel.java | 18 +- .../EditProtocolCaracteristicsTableModel.java | 6 +- .../EditProtocolOperationFieldsRowModel.java | 25 +- .../EditProtocolOperationFieldsTableModel.java | 5 +- .../ui/swing/content/protocol/EditProtocolUI.css | 31 ++ .../ui/swing/content/protocol/EditProtocolUI.jaxx | 30 +- .../content/protocol/EditProtocolUIHandler.java | 355 +++++++++++++++------ .../content/protocol/EditProtocolUIModel.java | 28 ++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 4 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 4 + 21 files changed, 610 insertions(+), 707 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index afa555c..eaeae66 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -76,7 +76,7 @@ public class TuttiProtocols extends AbstractTuttiProtocols { /** Logger. */ private static final Log log = LogFactory.getLog(TuttiProtocols.class); - public static final int CURRENT_PROTOCOL_VERSION = 3; + public static final Integer CURRENT_PROTOCOL_VERSION = 3; public static void toFile(TuttiProtocol protocol, File file) { @@ -97,63 +97,70 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } public static TuttiProtocol fromFile(File file) { - + TuttiProtocol result; Reader fileReader = null; try { fileReader = Files.newReader(file, Charsets.UTF_8); YamlReader reader = new YamlReader(fileReader, createConfig()); - TuttiProtocol result = reader.read(typeOfTuttiProtocol()); + result = reader.read(typeOfTuttiProtocol()); fileReader.close(); - // transform String to Integer... + if (!CURRENT_PROTOCOL_VERSION.equals(result.getVersion())) { + result = migrateProtocol(file); + } - Integer sampleCategoryIdToRemove = PmfmId.SORTED_UNSORTED.getValue(); + } catch (Exception e) { + result = migrateProtocol(file); - if (!result.isBenthosEmpty()) { - for (SpeciesProtocol speciesProtocol : result.getBenthos()) { - List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); - List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); - for (Object o : mandatorySampleCategoryId) { - mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); - } - mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); - speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + } finally { + IOUtils.closeQuietly(fileReader); + } + Integer sampleCategoryIdToRemove = PmfmId.SORTED_UNSORTED.getValue(); + // transform String to Integer... + if (!result.isBenthosEmpty()) { + for (SpeciesProtocol speciesProtocol : result.getBenthos()) { + List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); + List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); + for (Object o : mandatorySampleCategoryId) { + mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); } - } - if (!result.isSpeciesEmpty()) { - for (SpeciesProtocol speciesProtocol : result.getSpecies()) { - List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); - List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); - for (Object o : mandatorySampleCategoryId) { - mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); - } - mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); - speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); + speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + } + } + if (!result.isSpeciesEmpty()) { + for (SpeciesProtocol speciesProtocol : result.getSpecies()) { + List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); + List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); + for (Object o : mandatorySampleCategoryId) { + mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); } + mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); + speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + } - return result; + } - } catch (Exception e) { - //try to load a v2 - try { - // try to load a v1 - TuttiProtocol2 tuttiProtocol2 = fromFileV2(file); + return result; + } - TuttiProtocol result = fromTuttiProtocol2(tuttiProtocol2); - return result; + protected static TuttiProtocol migrateProtocol(File file) { + //try to load a v2 + try { + // try to load a v1 + TuttiProtocol2 tuttiProtocol2 = fromFileV2(file); - } catch (Exception ee) { - // try to load a v1 - TuttiProtocol1 tuttiProtocol1 = fromFileV1(file); + TuttiProtocol result = fromTuttiProtocol2(tuttiProtocol2); + return result; - TuttiProtocol result = fromTuttiProtocol1(tuttiProtocol1); - return result; - } + } catch (Exception ee) { + // try to load a v1 + TuttiProtocol1 tuttiProtocol1 = fromFileV1(file); - } finally { - IOUtils.closeQuietly(fileReader); + TuttiProtocol result = fromTuttiProtocol1(tuttiProtocol1); + return result; } } diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index 8529f64..2fe7a39 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -22,7 +22,8 @@ # #L% ### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Mon Dec 01 16:05:35 CET 2014 +#Mon Dec 08 17:29:36 CET 2014 +\ "tutti.editProtocol.action.addCaracteristicMapping.help"\ = tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -248,6 +249,7 @@ tutti.editProgram.field.name.help=editProgram.html\#fields tutti.editProgram.field.zone.help=editProgram.html\#fields tutti.editProgram.help=editProgram.html tutti.editProtocol.action.addBenthosProtocol.help=editProtocol.html\#actionsBenthos +tutti.editProtocol.action.addCaracteristicMapping.help= tutti.editProtocol.action.addSpeciesProtocol.help=editProtocol.html\#actionsSpecies tutti.editProtocol.action.closeEditProtocol.help=editProtocol.html\#actions tutti.editProtocol.action.exportProtocolAllCaracteristic.help=editProtocol.html\#actionsCaracteristics @@ -265,6 +267,7 @@ tutti.editProtocol.action.saveProtocol.help=editProtocol.html\#actions tutti.editProtocol.action.selectOtherBenthos.help=editProtocol.html\#actionsBenthos tutti.editProtocol.action.selectOtherSpecies.help=editProtocol.html\#actionsSpecies tutti.editProtocol.field.benthos.help=editProtocol.html\#fieldsBenthos +tutti.editProtocol.field.caracteristicMapping.help= tutti.editProtocol.field.comment.help=editProtocol.html\#fields tutti.editProtocol.field.gearUseFeature.help=editProtocol.html\#fieldsCaracteristics tutti.editProtocol.field.individualObservation.help=editProtocol.html\#fieldsCaracteristics diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java new file mode 100644 index 0000000..6b72393 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java @@ -0,0 +1,96 @@ +package fr.ifremer.tutti.ui.swing.action; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsRowModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsTableModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolSpeciesRowModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolSpeciesTableModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; + +import java.util.Collection; + +import static org.nuiton.i18n.I18n.t; + +/** + * To add a new species protocol. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class AddCaracteristicMappingAction extends AbstractTuttiAction<EditProtocolUIModel, EditProtocolUI, EditProtocolUIHandler> { + + public AddCaracteristicMappingAction(EditProtocolUIHandler handler) { + super(handler, false); + } + + protected Caracteristic caracteristic; + + protected EditProtocolCaracteristicsRowModel newRow; + + @Override + public void doAction() throws Exception { + + EditProtocolUI ui = getUI(); + + BeanFilterableComboBox<Caracteristic> caracteristicMappingCombBox = ui.getCaracteristicMappingComboBox(); + + caracteristic = (Caracteristic) caracteristicMappingCombBox.getSelectedItem(); + Preconditions.checkNotNull( + caracteristic, "Can't add a speciesProtocol with a null species"); + + // add new row to model (do it after combo stuff for ui best display) + newRow = handler.createEditProtocolCaracteristicsRowModel(); + newRow.setPsfm(caracteristic); + + getModel().getCaracteristicMappingRows().add(newRow); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + // update comboboxes + getUI().getCaracteristicMappingComboBox().removeItem(caracteristic); + + // fire row was inserted in table model + EditProtocolCaracteristicsTableModel tableModel = getHandler().getCaracteristicMappingTableModel(); + tableModel.fireTableRowsInserted(newRow); + + // select this new row + int rowIndex = tableModel.getRowIndex(newRow); + SwingUtil.setSelectionInterval(handler.getCaracteristicsMappingTable(), rowIndex); + + // add notification + String caracteristicStr = decorate(caracteristic); + sendMessage(t("tutti.flash.info.caracteristic.add.to.protocol", + caracteristicStr)); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index 259f96f..aaa73f6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -1,34 +1,36 @@ package fr.ifremer.tutti.ui.swing.action; -import com.csvreader.CsvReader; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.FishingOperations; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.service.TuttiCsvUtil; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; -import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUIModel; -import org.apache.commons.io.Charsets; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.csv.Import; +import org.nuiton.csv.Import2; +import org.nuiton.csv.ImportConf; +import org.nuiton.csv.ImportRow; import org.nuiton.csv.ValueParser; import org.nuiton.csv.ext.CsvReaders; import java.io.File; import java.io.FileInputStream; -import java.nio.charset.Charset; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -46,6 +48,8 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO protected File columnsFile; + protected String error; + public ImportFromColumnFileAction(EditFishingOperationUIHandler handler) { super(handler, true); } @@ -70,9 +74,12 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); - ImportFromColumnFile importModel = new ImportFromColumnFile(';', headers); - Import<FishingOperation> operationUIModelImport = - Import.newImport(importModel, new FileInputStream(columnsFile)); + ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); + ImportConf conf = new ImportConf(); + conf.setStrictMode(false); +// conf.setIgnoreUnknownHeader(true); + Import2<FishingOperation> operationUIModelImport = + Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); TuttiProtocol protocol = getDataContext().getProtocol(); final Map<String, OperationFieldMappingRow> mappingRowsByField = @@ -104,28 +111,44 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO }; boolean found = false; - while (!found && operationUIModelImport.iterator().hasNext()) { - FishingOperation next = operationUIModelImport.iterator().next(); - if (predicate.apply(next)) { - getModel().fromEntity(next); + Iterator<ImportRow<FishingOperation>> iterator = operationUIModelImport.iterator(); + while (!found && iterator.hasNext()) { + ImportRow<FishingOperation> next = iterator.next(); + FishingOperation fishingOperation = next.getBean(); + + if (predicate.apply(fishingOperation)) { + if (next.isValid()) { + getModel().fromEntity(fishingOperation); + + } else { + if (log.isErrorEnabled()) { + log.error(next.getErrors()); + } + error = next.getErrors().toString(); + } found = true; } } if (!found) { - throw new Exception(t("tutti.editFishingOperation.action.importColumns.operationNotFound")); + error = t("tutti.editFishingOperation.action.importColumns.operationNotFound"); } } @Override public void postSuccessAction() { super.postSuccessAction(); - sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + if (error != null) { + displayErrorMessage("error", error); + } else { + sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + } + error = null; } - protected class ImportFromColumnFile extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { + protected class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { - public ImportFromColumnFile(char separator, Set<String> headers) { + public ImportFromColumnFileModel(char separator, Set<String> headers) { super(separator); TuttiProtocol protocol = getDataContext().getProtocol(); @@ -156,16 +179,38 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO break; case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE: - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; break; + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: + valueParser = TuttiCsvUtil.BOOLEAN; + break; + case EditFishingOperationUIModel.PROPERTY_GEAR: + List<Gear> gears = new ArrayList<>(getDataContext().getFishingGears()); + gears.addAll(getDataContext().getScientificGears()); + Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears); + valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); + break; + case EditFishingOperationUIModel.PROPERTY_VESSEL: - case EditFishingOperationUIModel.PROPERTY_STRATA: - case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: + List<Vessel> vessels = new ArrayList<>(getDataContext().getFishingVessels()); + vessels.addAll(getDataContext().getScientificVessels()); + Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); + valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); + break; + +// case EditFishingOperationUIModel.PROPERTY_STRATA: +// case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: +// Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById(getDataContext().getL); +// valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); +// break; + case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: + Map<String, Person> personUniverse = TuttiEntities.splitById(getDataContext().getPersons()); + valueParser = newForeignKeyValue(Person.class, field, personUniverse); + break; default: valueParser = TuttiCsvUtil.STRING; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java index 377c076..b120e79 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java @@ -108,7 +108,7 @@ public class ImportProtocolBenthosAction extends AbstractTuttiAction<EditProtoco // build rows from imported+merged protocol // (will also remove all synonyms of species referent used) List<EditProtocolSpeciesRowModel> rows = - handler.toRows(protocol.getBenthos()); + handler.toSpeciesRows(protocol.getBenthos()); // update species comboBox getUI().getSpeciesComboBox().getHandler().reset(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java index 718d459..4a4a7f5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java @@ -108,7 +108,7 @@ public class ImportProtocolSpeciesAction extends AbstractTuttiAction<EditProtoco // build rows from imported+merged protocol // (will also remove all synonyms of species referent used) List<EditProtocolSpeciesRowModel> rows = - handler.toRows(protocol.getSpecies()); + handler.toSpeciesRows(protocol.getSpecies()); // update species comboBox getUI().getSpeciesComboBox().getHandler().reset(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java index 4d96eab..b1702f9 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java @@ -23,6 +23,8 @@ package fr.ifremer.tutti.ui.swing.action; * #L% */ +import com.google.common.base.Function; +import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; @@ -31,12 +33,16 @@ import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsRowModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolOperationFieldsRowModel; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolSpeciesRowModel; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.StringUtil; import java.util.ArrayList; import java.util.List; @@ -71,12 +77,22 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, TuttiProtocol bean = model.toBean(); - List<CaracteristicMappingRow> caracteristicMappingRows = - new ArrayList<>(getUI().getCaracteristicsTable().getModel().getCaracteristicMapping().values()); + List<EditProtocolCaracteristicsRowModel> protocolCaracteristicMappingRows = getUI().getModel().getCaracteristicMappingRows(); + List<CaracteristicMappingRow> caracteristicMappingRows = new ArrayList<CaracteristicMappingRow>(); + for (EditProtocolCaracteristicsRowModel row : protocolCaracteristicMappingRows) { + if (row.getPsfm() != null && row.getType() != null) { + caracteristicMappingRows.add(row.toEntity()); + } + } bean.setCaracteristicMapping(caracteristicMappingRows); - List<OperationFieldMappingRow> operationFieldMappingRows = - new ArrayList<>(getUI().getCaracteristicsTable().getModel().getOperationFieldMappingRows().values()); + List<EditProtocolOperationFieldsRowModel> protocolOperationFieldMappingRows = getUI().getModel().getOperationFieldMappingRows(); + List<OperationFieldMappingRow> operationFieldMappingRows = new ArrayList<OperationFieldMappingRow>(); + for (EditProtocolOperationFieldsRowModel row : protocolOperationFieldMappingRows) { + if (StringUtils.isNotBlank(row.getField()) && StringUtils.isNotBlank(row.getImportColumn())) { + operationFieldMappingRows.add(row.toEntity()); + } + } bean.setOperationFieldMapping(operationFieldMappingRows); // get the species protocols from the table diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css deleted file mode 100644 index d92ab70..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css +++ /dev/null @@ -1,20 +0,0 @@ -#splitpane { - orientation: {JSplitPane.VERTICAL_SPLIT}; - resizeWeight: 1.0; -} - -#caracteristicsTable { - selectionMode: {ListSelectionModel.SINGLE_SELECTION}; - selectionBackground: {null}; - selectionForeground: {Color.BLACK}; - sortable: false; - enabled: true; -} - -#operationFieldsTable { - selectionMode: {ListSelectionModel.SINGLE_SELECTION}; - selectionBackground: {null}; - selectionForeground: {Color.BLACK}; - sortable: false; - enabled: true; -} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx deleted file mode 100644 index 52c3949..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx +++ /dev/null @@ -1,46 +0,0 @@ -<JPanel layout="{new BorderLayout()}" - implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<CaracteristicMappingUIModel, CaracteristicMappingUIHandler>'> - - <import> - fr.ifremer.tutti.persistence.entities.referential.Caracteristic - fr.ifremer.tutti.persistence.entities.referential.Species - - fr.ifremer.tutti.ui.swing.TuttiHelpBroker - fr.ifremer.tutti.ui.swing.util.TuttiUI - fr.ifremer.tutti.ui.swing.util.TuttiUIUtil - - jaxx.runtime.swing.editor.bean.BeanFilterableComboBox - jaxx.runtime.swing.editor.bean.BeanDoubleList - - java.awt.Color - - javax.swing.ListSelectionModel - - org.jdesktop.swingx.JXTable - - static org.nuiton.i18n.I18n.t - static jaxx.runtime.SwingUtil.getStringValue - - </import> - - <script><![CDATA[ - - public CaracteristicMappingUI(TuttiUI parentUI) { - TuttiUIUtil.setParentUI(this, parentUI); - } - ]]> - </script> - - <CaracteristicMappingUIModel id='model' - initializer='getContextValue(CaracteristicMappingUIModel.class)'/> - - <JSplitPane id="splitpane" constraints="BorderLayout.CENTER"> - <JScrollPane> - <JXTable id='caracteristicsTable'/> - </JScrollPane> - <JScrollPane> - <JXTable id='operationFieldsMapping'/> - </JScrollPane> - </JSplitPane> - -</JPanel> \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java deleted file mode 100644 index 5c4252a..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java +++ /dev/null @@ -1,343 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.protocol; - -import com.google.common.collect.Lists; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; -import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import jaxx.runtime.SwingUtil; -import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor; -import org.jdesktop.swingx.table.DefaultTableColumnModelExt; -import org.jdesktop.swingx.table.TableColumnExt; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; - -import javax.swing.*; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableCellRenderer; -import java.awt.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static org.nuiton.i18n.I18n.t; - -/** - * @author Kevin Morin (Code Lutin) - * @since x.x - */ -public class CaracteristicMappingUIHandler - extends AbstractTuttiTableUIHandler<EditProtocolCaracteristicsRowModel, CaracteristicMappingUIModel, CaracteristicMappingUI> { - - private static final Log log = LogFactory.getLog(CaracteristicMappingUIHandler.class); - - public CaracteristicMappingUIHandler() { - super(EditProtocolCaracteristicsRowModel.PROPERTY_PSFM, - EditProtocolCaracteristicsRowModel.PROPERTY_TYPE, - EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_FILE_COLUMN); - } - - @Override - public AbstractApplicationTableModel<EditProtocolCaracteristicsRowModel> getTableModel() { - return (EditProtocolCaracteristicsTableModel) getTable().getModel(); - } - - @Override - public JXTable getTable() { - return getUI().getCaracteristicsTable(); - } - - @Override - protected boolean isRowValid(EditProtocolCaracteristicsRowModel row) { - return row.getPsfm() != null && row.getType() != null; - } - - @Override - protected void saveSelectedRowIfRequired(TuttiBeanMonitor<EditProtocolCaracteristicsRowModel> rowMonitor, - EditProtocolCaracteristicsRowModel row) { - if (row.isValid()) { - // there is a valid bean attached to the monitor - - if (rowMonitor.wasModified()) { - - // monitored bean was modified, save it - if (log.isInfoEnabled()) { - log.info("Row " + row + " was modified, will save it"); - } - - getModel().getCaracteristicMapping().put(row.getPsfm().getId(), row.toBean()); - } - } - - } - - @Override - public void onCloseUI() { - - } - - @Override - public SwingValidator<CaracteristicMappingUIModel> getValidator() { - return null; - } - - @Override - protected JComponent getComponentToFocus() { - return null; - } - - @Override - public void beforeInit(CaracteristicMappingUI ui) { - super.beforeInit(ui); - - EditProtocolUIModel editProtocolUIModel = - ui.getContextValue(EditProtocolUIModel.class); - - CaracteristicMappingUIModel model = new CaracteristicMappingUIModel(); - model.setCaracteristics(editProtocolUIModel.getCaracteristics()); - model.setOperationFieldMappingRows(editProtocolUIModel.getOperationFieldMapping()); - - editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_CARACTERISTIC_MAPPING, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - getModel().setCaracteristicMappingRows((List<CaracteristicMappingRow>) evt.getNewValue()); - } - }); - - editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_OPERATION_FIELD_MAPPING, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - getModel().setOperationFieldMappingRows((List<OperationFieldMappingRow>) evt.getNewValue()); - } - }); - - editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_IMPORT_COLUMNS, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - - Collection<String> newValue = (Collection<String>) evt.getNewValue(); - ArrayList<String> dataToList = new ArrayList<String>(); - - if (newValue != null) { - dataToList.addAll(newValue); - - // add a null value at first position - if (!dataToList.isEmpty() && dataToList.get(0) != null) { - dataToList.add(0, null); - } - - } else { - dataToList.add(null); - } - - populateImportColumnTableEditor(getTable(), 2, dataToList); - populateImportColumnTableEditor(getUI().getOperationFieldsMapping(), 1, dataToList); - - } - }); - - ui.setContextValue(model); - } - - protected void populateImportColumnTableEditor(JXTable table, int columnIndex, ArrayList<String> dataToList) { - JComboBox comboBox = new JComboBox(); - SwingUtil.fillComboBox(comboBox, dataToList, null); - - TableColumnExt col = table.getColumnExt(columnIndex); - ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); - col.setCellEditor(editor); - } - - @Override - public void afterInit(CaracteristicMappingUI caracteristicMappingUI) { - - initUI(this.ui); - - // init caracteristics mappingtable - { - JXTable caracteristicsMappingTable = getTable(); - - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); - - // getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, new PropertyChangeListener() { - // @Override - // public void propertyChange(PropertyChangeEvent evt) { - // List<String> ids = (List<String>) evt.getNewValue(); - // selectLengthClasses(ids, comboBox); - // } - // }); - - List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.PSFM_ID, - getDecorator(Caracteristic.class, null), - caracteristics); - - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.TYPE, - getDecorator(CaracteristicType.class, null), - Lists.newArrayList(CaracteristicType.getTabTypes())); - - addColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); - - EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); - caracteristicsMappingTable.setModel(tableModel); - caracteristicsMappingTable.setColumnModel(columnModel); - - initTable(caracteristicsMappingTable); - - getModel().setRows(new ArrayList<EditProtocolCaracteristicsRowModel>()); - } - - // init operation fields table - { - JXTable operationFieldsTable = getUI().getOperationFieldsMapping(); - - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); - - addColumnToModel(columnModel, - null, - new DefaultTableCellRenderer() { - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - setText(t("tutti.editFishingOperation.field." + value.toString())); - return this; - } - }, - EditProtocolOperationFieldsTableModel.FIELD); - - addColumnToModel(columnModel, - EditProtocolOperationFieldsTableModel.IMPORT_FILE_COLUMN); - - EditProtocolOperationFieldsTableModel tableModel = new EditProtocolOperationFieldsTableModel(columnModel); - operationFieldsTable.setModel(tableModel); - operationFieldsTable.setColumnModel(columnModel); - - // by default do not authorize to change column orders - operationFieldsTable.getTableHeader().setReorderingAllowed(false); - - addHighlighters(operationFieldsTable); - - tableModel.setRows(new ArrayList<EditProtocolOperationFieldsRowModel>()); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_STATION_NUMBER); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_DATE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_TRAWL_DISTANCE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_VALID); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_MULTIRIG_AGGREGATION); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_RECORDER_PERSON); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_VESSEL); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_STRATA); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_SUB_STRATA); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_LOCATION); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_SECONDARY_VESSEL); - //TODO voir avec Vincent comment on gère le cas où aucun des champs clé n'est renseigné - - // when model data change let's propagate it table model -// getModel().addPropertyChangeListener(AbstractTuttiTableUIModel.PROPERTY_ROWS, new PropertyChangeListener() { -// @Override -// public void propertyChange(PropertyChangeEvent evt) { -// log.info("row schanged"); -// onModelRowsChanged((List<R>) evt.getNewValue()); -// } -// }); - - // always scroll to selected row - SwingUtil.scrollToTableSelection(operationFieldsTable); - } - - getModel().addPropertyChangeListener(CaracteristicMappingUIModel.PROPERTY_CARACTERISTIC_MAPPING_ROWS, - new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - populateCaracteristicsTable((Collection<CaracteristicMappingRow>) evt.getNewValue()); - } - }); - - getModel().addPropertyChangeListener(CaracteristicMappingUIModel.PROPERTY_OPERATION_FIELD_MAPPING_ROWS, - new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - populateFieldsTable((Map<String, OperationFieldMappingRow>) evt.getNewValue()); - } - }); - - } - - protected void createOperationFieldRow(EditProtocolOperationFieldsTableModel tableModel, String property) { - EditProtocolOperationFieldsRowModel row = tableModel.createNewRow(); - row.setField(property); - row.setValid(true); - row.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - EditProtocolOperationFieldsRowModel row = (EditProtocolOperationFieldsRowModel) evt.getSource(); - Map<String, OperationFieldMappingRow> operationFieldMappingRows = getModel().getOperationFieldMappingRows(); - - OperationFieldMappingRow operationFieldMappingRow = operationFieldMappingRows.get(row.getField()); - if (operationFieldMappingRow != null) { - operationFieldMappingRow.setImportColumn(row.getImportFileColumn()); - - } else { - operationFieldMappingRows.put(row.getField(), row.toBean()); - } - getModel().setModify(true); - } - }); - tableModel.addNewRow(row); - } - - protected void populateFieldsTable(Map<String, OperationFieldMappingRow> fieldRows) { - EditProtocolOperationFieldsTableModel tableModel = - (EditProtocolOperationFieldsTableModel) getUI().getOperationFieldsMapping().getModel(); - for (EditProtocolOperationFieldsRowModel row : tableModel.getRows()) { - OperationFieldMappingRow mappingRow = fieldRows.get(row.getField()); - if (mappingRow != null) { - row.setImportFileColumn(mappingRow.getImportColumn()); - } - } - } - - protected void populateCaracteristicsTable(Collection<CaracteristicMappingRow> values) { - List<EditProtocolCaracteristicsRowModel> rows = new ArrayList<EditProtocolCaracteristicsRowModel>(); - for (CaracteristicMappingRow row : values) { - EditProtocolCaracteristicsRowModel rowModel = getTableModel().createNewRow(); - rowModel.fromEntity(row); - recomputeRowValidState(rowModel); - rows.add(rowModel); - } - getModel().setRows(rows); - } - - @Override - protected void initTable(JXTable table) { - super.initTable(table); - installTableKeyListener(table.getColumnModel(), table); - } - - @Override - protected void onRowModified(int rowIndex, EditProtocolCaracteristicsRowModel row, - String propertyName, Object oldValue, Object newValue) { - recomputeRowValidState(row); - super.onRowModified(rowIndex, row, propertyName, oldValue, newValue); - saveSelectedRowIfNeeded(); - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java deleted file mode 100644 index a353eb5..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java +++ /dev/null @@ -1,99 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.protocol; - -import com.google.common.base.Function; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; -import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author Kevin Morin (Code Lutin) - * @since x.x - */ -public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel, CaracteristicMappingUIModel> { - - public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; - public static final String PROPERTY_CARACTERISTICS_IN_MAPPING = "caracteristicsInMapping"; - public static final String PROPERTY_OPERATION_FIELD_MAPPING_ROWS = "operationFieldMappingRows"; - - protected List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(); - - protected Map<String, CaracteristicMappingRow> caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); - - protected Map<String, OperationFieldMappingRow> operationFieldMappingRows = new HashMap<String, OperationFieldMappingRow>(); - - protected List<String> importColumns = new ArrayList<String>(); - - public CaracteristicMappingUIModel() { - super(CaracteristicMappingRow.class, null, null); - } - - public List<Caracteristic> getCaracteristics() { - return caracteristics; - } - - public void setCaracteristics(List<Caracteristic> caracteristics) { - this.caracteristics = caracteristics; - } - - public Map<String, CaracteristicMappingRow> getCaracteristicMapping() { - return caracteristicMappingRows; - } - - public void setCaracteristicMappingRows(List<CaracteristicMappingRow> caracteristicMappingRows) { - this.caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); - if (caracteristicMappingRows != null) { - this.caracteristicMappingRows.putAll(Maps.uniqueIndex(caracteristicMappingRows, new Function<CaracteristicMappingRow, String>() { - @Override - public String apply(CaracteristicMappingRow caracteristicMappingRow) { - return caracteristicMappingRow.getPmfmId(); - } - })); - } - firePropertyChanged(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, caracteristicMappingRows); - firePropertyChanged(PROPERTY_CARACTERISTICS_IN_MAPPING, null, this.caracteristicMappingRows.values()); - } - - public Map<String, OperationFieldMappingRow> getOperationFieldMappingRows() { - return operationFieldMappingRows; - } - - public void setOperationFieldMappingRows(Collection<OperationFieldMappingRow> operationFieldMappingRows) { - this.operationFieldMappingRows = new HashMap<String, OperationFieldMappingRow>(); - if (operationFieldMappingRows != null) { - this.operationFieldMappingRows.putAll(Maps.uniqueIndex(operationFieldMappingRows, new Function<OperationFieldMappingRow, String>() { - @Override - public String apply(OperationFieldMappingRow operationFieldMappingRow) { - return operationFieldMappingRow.getField(); - } - })); - } - firePropertyChanged(PROPERTY_OPERATION_FIELD_MAPPING_ROWS, null, this.operationFieldMappingRows); - } - - public List<String> getImportColumns() { - return importColumns; - } - - public void setImportColumns(List<String> importColumns) { - this.importColumns.clear(); - if (importColumns != null) { - this.importColumns.addAll(importColumns); - } - } - - @Override - protected CaracteristicMappingRow newEntity() { - return new CaracteristicMappingRowBean(); - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java index c845b8e..d2ec82a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java @@ -1,7 +1,5 @@ package fr.ifremer.tutti.ui.swing.content.protocol; -import com.google.common.base.Function; -import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; @@ -23,12 +21,12 @@ public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel public static final String PROPERTY_PSFM = "psfm"; public static final String PROPERTY_TYPE = "type"; - public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + public static final String PROPERTY_IMPORT_COLUMN = "importColumn"; protected Map<String, Caracteristic> caracteristicMap; protected Caracteristic psfm; protected CaracteristicType type; - protected String importFileColumn; + protected String importColumn; protected static final Binder<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel> fromBeanBinder = BinderFactory.newBinder(CaracteristicMappingRow.class, @@ -63,14 +61,14 @@ public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel firePropertyChanged(PROPERTY_TYPE, oldValue, type); } - public String getImportFileColumn() { - return importFileColumn; + public String getImportColumn() { + return importColumn; } - public void setImportFileColumn(String importFileColumn) { - Object oldValue = getImportFileColumn(); - this.importFileColumn = importFileColumn; - firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); + public void setImportColumn(String importColumn) { + Object oldValue = getImportColumn(); + this.importColumn = importColumn; + firePropertyChanged(PROPERTY_IMPORT_COLUMN, oldValue, importColumn); } public String getPmfmId() { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java index 6e262ed..93de4ae 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java @@ -28,13 +28,13 @@ public class EditProtocolCaracteristicsTableModel extends AbstractApplicationTab n("tutti.editProtocol.table.header.caracteristics.type.tip")); public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> IMPORT_FILE_COLUMN = ColumnIdentifier.newId( - EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_FILE_COLUMN, + EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_COLUMN, n("tutti.editProtocol.table.header.caracteristics.importFileColumn"), n("tutti.editProtocol.table.header.caracteristics.importFileColumn.tip")); public EditProtocolCaracteristicsTableModel(TableColumnModelExt columnModel, Collection<Caracteristic> caracteristics) { - super(columnModel, true, true); - setNoneEditableCols(); + super(columnModel, false, false); + setNoneEditableCols(PSFM_ID); this.caracteristics = caracteristics; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java index ac16751..f0a9b53 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java @@ -1,20 +1,11 @@ package fr.ifremer.tutti.ui.swing.content.protocol; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRowBean; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - /** * @author Kevin Morin (Code Lutin) * @since 3.10 @@ -22,10 +13,10 @@ import java.util.Map; public class EditProtocolOperationFieldsRowModel extends AbstractTuttiBeanUIModel<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> { public static final String PROPERTY_FIELD = "field"; - public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + public static final String PROPERTY_IMPORT_COLUMN = "importColumn"; protected String field; - protected String importFileColumn; + protected String importColumn; protected static final Binder<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> fromBeanBinder = BinderFactory.newBinder(OperationFieldMappingRow.class, @@ -49,14 +40,14 @@ public class EditProtocolOperationFieldsRowModel extends AbstractTuttiBeanUIMode firePropertyChanged(PROPERTY_FIELD, oldValue, field); } - public String getImportFileColumn() { - return importFileColumn; + public String getImportColumn() { + return importColumn; } - public void setImportFileColumn(String importFileColumn) { - Object oldValue = getImportFileColumn(); - this.importFileColumn = importFileColumn; - firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); + public void setImportColumn(String importColumn) { + Object oldValue = getImportColumn(); + this.importColumn = importColumn; + firePropertyChanged(PROPERTY_IMPORT_COLUMN, oldValue, importColumn); } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java index 5d636a9..0be5d51 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java @@ -1,12 +1,9 @@ package fr.ifremer.tutti.ui.swing.content.protocol; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; -import java.util.Collection; - import static org.nuiton.i18n.I18n.n; /** @@ -21,7 +18,7 @@ public class EditProtocolOperationFieldsTableModel extends AbstractApplicationTa n("tutti.editProtocol.table.header.operationFields.field.tip")); public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> IMPORT_FILE_COLUMN = ColumnIdentifier.newId( - EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_FILE_COLUMN, + EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_COLUMN, n("tutti.editProtocol.table.header.operationFields.importFileColumn"), n("tutti.editProtocol.table.header.operationFields.importFileColumn.tip")); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css index aec68ad..d12659f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css @@ -76,6 +76,37 @@ JTextField { border: {new javax.swing.border.EmptyBorder(5, 10, 5, 10)}; } +#caracteristicMappingComboBox { + enabled: {!caracteristicMappingComboBox.isEmpty()}; + toolTipText: "tutti.editProtocol.field.caracteristicMapping.tip"; + _help: {"tutti.editProtocol.field.caracteristicMapping.help"}; +} + +#addCaracteristicMappingButton { + actionIcon: add; + toolTipText: "tutti.editProtocol.action.addCaracteristicMapping.tip"; + i18nMnemonic: "tutti.editProtocol.action.addCaracteristicMapping.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.AddCaracteristicMappingAction.class}; + enabled: { caracteristicMappingComboBox.getSelectedItem() != null }; + _help: { "tutti.editProtocol.action.addCaracteristicMapping.help" }; +} + +#caracteristicsMappingTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; + enabled: true; +} + +#operationFieldsMappingTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; + enabled: true; +} + #speciesComboBox { enabled: {!speciesComboBox.isEmpty()}; toolTipText: "tutti.editProtocol.field.species.tip"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx index 1644756..a976187 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx @@ -121,7 +121,35 @@ genericType='Caracteristic'/> </tab> <tab title='tutti.editProtocol.tab.caracteristic.mapping'> - <CaracteristicMappingUI id='caracteristicsTable' constructorParams="(TuttiUI)this"/> + <Table fill='both'> + + <row fill='both'> + <cell fill='both' weightx='1'> + <BeanFilterableComboBox id='caracteristicMappingComboBox' + constructorParams='this' + genericType='Caracteristic'/> + </cell> + <cell fill='both'> + <JButton id='addCaracteristicMappingButton'/> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both' columns='2'> + <JScrollPane> + <JXTable id='caracteristicsMappingTable'/> + </JScrollPane> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both' columns='2'> + <JScrollPane> + <JXTable id='operationFieldsMappingTable'/> + </JScrollPane> + </cell> + </row> + </Table> + <!--<CaracteristicMappingUI id='caracteristicsTable' constructorParams="(TuttiUI)this"/>--> + </tab> </JTabbedPane> </JPanel> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index a3012c3..278a2da 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -22,16 +22,20 @@ package fr.ifremer.tutti.ui.swing.content.protocol; * #L% */ +import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModelEntry; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; @@ -64,19 +68,17 @@ import org.jdesktop.swingx.table.TableColumnExt; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.swing.util.CloseableUI; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JTabbedPane; -import javax.swing.ListSelectionModel; +import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; +import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumnModel; -import java.awt.Dimension; +import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; @@ -123,6 +125,14 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return ui.getBenthosTable(); } + public JXTable getCaracteristicsMappingTable() { + return ui.getCaracteristicsMappingTable(); + } + + public JXTable getOperationFieldsMappingTable() { + return ui.getOperationFieldsMappingTable(); + } + public EditProtocolSpeciesTableModel getSpeciesTableModel() { return (EditProtocolSpeciesTableModel) getSpeciesTable().getModel(); } @@ -135,6 +145,14 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return selectedItem != null && selectedItem instanceof Species; } + public EditProtocolCaracteristicsTableModel getCaracteristicMappingTableModel() { + return (EditProtocolCaracteristicsTableModel) getCaracteristicsMappingTable().getModel(); + } + + public EditProtocolOperationFieldsTableModel getEditProtocolOperationFieldsMappingTableModel() { + return (EditProtocolOperationFieldsTableModel) getOperationFieldsMappingTable().getModel(); + } + //------------------------------------------------------------------------// //-- AbstractTuttiUIHandler methods --// //------------------------------------------------------------------------// @@ -265,20 +283,38 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI Lists.newArrayList(referents), null); initBeanFilterableComboBox(this.ui.getBenthosComboBox(), Lists.newArrayList(referents), null); + initBeanFilterableComboBox(ui.getCaracteristicMappingComboBox(), + new ArrayList<Caracteristic>(model.getCaracteristics()), + null); + List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows; + List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows; List<EditProtocolSpeciesRowModel> speciesRows; List<EditProtocolSpeciesRowModel> benthosRows; + model.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_IMPORT_COLUMNS, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + populateImportColumnTableEditors(); + + } + }); + incrementsMessage("Préparation des interfaces graphiques"); // build species and benthos rows if (protocol == null) { + caracteristicMappingRows = Lists.newArrayList(); + operationFieldMappingRows = Lists.newArrayList(); speciesRows = Lists.newArrayList(); benthosRows = Lists.newArrayList(); } else { - speciesRows = toRows(protocol.getSpecies()); - benthosRows = toRows(protocol.getBenthos()); + caracteristicMappingRows = toProtocolCaracteristicRows(protocol.getCaracteristicMapping()); + operationFieldMappingRows = toProtocolOperationFieldsRows(protocol.getOperationFieldMapping()); + + speciesRows = toSpeciesRows(protocol.getSpecies()); + benthosRows = toSpeciesRows(protocol.getBenthos()); if (log.isDebugEnabled()) { log.debug("Will edit protocol with " + @@ -290,9 +326,12 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI // set to model (will propagate to tableModel) model.setSpeciesRow(speciesRows); model.setBenthosRow(benthosRows); + model.setCaracteristicMappingRows(caracteristicMappingRows); + model.setOperationFieldMappingRows(operationFieldMappingRows); this.ui.getSpeciesComboBox().reset(); this.ui.getBenthosComboBox().reset(); + this.ui.getCaracteristicMappingComboBox().reset(); { // create species table model @@ -427,6 +466,78 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI Lists.newArrayList(model.getCaracteristics()), model.getIndividualObservationPmfmId()); + // init caracteristics mappingtable + { + JXTable caracteristicsMappingTable = getCaracteristicsMappingTable(); + + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + + addColumnToModel(columnModel, + null, + newTableCellRender(Caracteristic.class), + EditProtocolCaracteristicsTableModel.PSFM_ID); + + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.TYPE, + getDecorator(CaracteristicType.class, null), + Lists.newArrayList(CaracteristicType.getTabTypes())); + + addColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); + + List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); + EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); + caracteristicsMappingTable.setModel(tableModel); + caracteristicsMappingTable.setColumnModel(columnModel); + + // by default do not authorize to change column orders + caracteristicsMappingTable.getTableHeader().setReorderingAllowed(false); + + addHighlighters(caracteristicsMappingTable); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(caracteristicsMappingTable); + + tableModel.setRows(caracteristicMappingRows); + } + + // init operation fields table + { + JXTable operationFieldsTable = getUI().getOperationFieldsMappingTable(); + + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + + addColumnToModel(columnModel, + null, + new DefaultTableCellRenderer() { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setText(t("tutti.editFishingOperation.field." + value.toString())); + return this; + } + }, + EditProtocolOperationFieldsTableModel.FIELD); + + addColumnToModel(columnModel, + EditProtocolOperationFieldsTableModel.IMPORT_FILE_COLUMN); + + EditProtocolOperationFieldsTableModel tableModel = new EditProtocolOperationFieldsTableModel(columnModel); + operationFieldsTable.setModel(tableModel); + operationFieldsTable.setColumnModel(columnModel); + + // by default do not authorize to change column orders + operationFieldsTable.getTableHeader().setReorderingAllowed(false); + + addHighlighters(operationFieldsTable); + + tableModel.setRows(operationFieldMappingRows); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(operationFieldsTable); + } + + populateImportColumnTableEditors(); + // if new protocol can already cancel his creation model.setModify(model.isCreate() || model.isCleaned()); @@ -443,10 +554,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI break; case 1: -// selectedDoubleList = EditProtocolUIHandler.this.ui.getGearUseFeatureList(); -// break; -// -// case 2: selectedDoubleList = EditProtocolUIHandler.this.ui.getIndividualObservationList(); break; @@ -463,8 +570,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI dialog = new SelectSpeciesUI(false, this.ui); - ui.getCaracteristicsTable().getModel().setModify(false); - listenModelModifiy(ui.getCaracteristicsTable().getModel()); } @Override @@ -472,7 +577,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return getUI().getNameField(); } - public List<EditProtocolSpeciesRowModel> toRows(List<SpeciesProtocol> speciesProtocols) { + public List<EditProtocolSpeciesRowModel> toSpeciesRows(List<SpeciesProtocol> speciesProtocols) { BeanFilterableComboBox<Species> speciesComboBox = ui.getSpeciesComboBox(); Preconditions.checkNotNull(speciesComboBox.getData()); BeanFilterableComboBox<Species> benthosComboBox = ui.getBenthosComboBox(); @@ -547,6 +652,84 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return result; } + public List<EditProtocolCaracteristicsRowModel> toProtocolCaracteristicRows(List<CaracteristicMappingRow> caracteristicMappingRows) { + BeanFilterableComboBox<Caracteristic> caracteristicMappingComboBox = ui.getCaracteristicMappingComboBox(); + Preconditions.checkNotNull(caracteristicMappingComboBox.getData()); + + EditProtocolUIModel model = getModel(); + + Set<Caracteristic> caracteristicSet = Sets.newHashSet(); + List<EditProtocolCaracteristicsRowModel> result = Lists.newArrayList(); + if (CollectionUtils.isNotEmpty(caracteristicMappingRows)) { + for (CaracteristicMappingRow caracteristicMappingRow : caracteristicMappingRows) { + String pmfmId = caracteristicMappingRow.getPmfmId(); + + if (pmfmId == null) { + + continue; + } + + // make sure it exists + caracteristicSet.add(model.getAllCaracteristic().get(pmfmId)); + + EditProtocolCaracteristicsRowModel row = createEditProtocolCaracteristicsRowModel(); + row.fromBean(caracteristicMappingRow); + row.setValid(row.getType() != null); + + result.add(row); + } + + caracteristicMappingComboBox.removeItems(caracteristicSet); + } + + return result; + } + + public List<EditProtocolOperationFieldsRowModel> toProtocolOperationFieldsRows(Collection<OperationFieldMappingRow> operationFieldMappingRows) { + List<EditProtocolOperationFieldsRowModel> result = Lists.newArrayList(); + + if (operationFieldMappingRows == null) { + operationFieldMappingRows = new ArrayList<OperationFieldMappingRow>(); + } + Map<String, OperationFieldMappingRow> rowsByField = Maps.uniqueIndex(operationFieldMappingRows, + new Function<OperationFieldMappingRow, String>() { + @Override + public String apply(OperationFieldMappingRow operationFieldMappingRow) { + return operationFieldMappingRow.getField(); + } + }); + + List<String> properties = Lists.newArrayList( + FishingOperation.PROPERTY_STATION_NUMBER, + FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER, + FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE, + FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE, + FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE, + FishingOperation.PROPERTY_GEAR_SHOOTING_END_DATE, + FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE, + FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE, + FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE, + FishingOperation.PROPERTY_TRAWL_DISTANCE, + FishingOperation.PROPERTY_FISHING_OPERATION_VALID, + FishingOperation.PROPERTY_MULTIRIG_AGGREGATION, + FishingOperation.PROPERTY_RECORDER_PERSON, + FishingOperation.PROPERTY_GEAR, + FishingOperation.PROPERTY_VESSEL, + FishingOperation.PROPERTY_STRATA, + FishingOperation.PROPERTY_SUB_STRATA, + FishingOperation.PROPERTY_LOCATION, + FishingOperation.PROPERTY_SECONDARY_VESSEL + ); + //TODO voir avec Vincent comment on gère le cas où aucun des champs clé n'est renseigné + + for (String property : properties) { + OperationFieldMappingRow row = rowsByField.get(property); + EditProtocolOperationFieldsRowModel newRow = createOperationFieldRow(property, row != null ? row.getImportColumn() : null); + result.add(newRow); + } + return result; + } + @Override public void onCloseUI() { if (log.isDebugEnabled()) { @@ -555,7 +738,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI clearValidators(); ui.getTabPanel().setSelectedIndex(0); - closeUI(ui.getCaracteristicsTable()); } @Override @@ -605,6 +787,24 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return model.getSelectedSpecies(); } + public EditProtocolCaracteristicsRowModel createEditProtocolCaracteristicsRowModel() { + EditProtocolCaracteristicsRowModel newRow = new EditProtocolCaracteristicsRowModel(getModel().getCaracteristics()); + + newRow.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + EditProtocolCaracteristicsRowModel row = (EditProtocolCaracteristicsRowModel) evt.getSource(); + row.setValid(row.getType() != null); + + if (row.isValid()) { + getModel().setModify(true); + } + } + }); + + return newRow; + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -758,6 +958,49 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI tableModel.setRows(rows); } + protected EditProtocolOperationFieldsRowModel createOperationFieldRow(String property, String column) { + EditProtocolOperationFieldsRowModel newRow = new EditProtocolOperationFieldsRowModel(); + newRow.setField(property); + newRow.setImportColumn(column); + newRow.setValid(true); + newRow.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + getModel().setModify(true); + } + }); + return newRow; + } + + protected void populateImportColumnTableEditors() { + Collection<String> importColumns = getModel().getImportColumns(); + ArrayList<String> dataToList = new ArrayList<String>(); + + if (importColumns != null) { + dataToList.addAll(importColumns); + + // add a null value at first position + if (!dataToList.isEmpty() && dataToList.get(0) != null) { + dataToList.add(0, null); + } + + } else { + dataToList.add(null); + } + + populateImportColumnTableEditor(getUI().getCaracteristicsMappingTable(), 2, dataToList); + populateImportColumnTableEditor(getUI().getOperationFieldsMappingTable(), 1, dataToList); + } + + protected void populateImportColumnTableEditor(JXTable table, int columnIndex, ArrayList<String> dataToList) { + JComboBox comboBox = new JComboBox(); + SwingUtil.fillComboBox(comboBox, dataToList, null); + + TableColumnExt col = table.getColumnExt(columnIndex); + ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); + col.setCellEditor(editor); + } + protected static class UpdateSelectedList implements PropertyChangeListener { private final BeanDoubleListModel<Caracteristic> model; @@ -828,84 +1071,4 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI } } -// public static class SpeciesDecoratorListener implements ActionListener { -// -// protected final JXTable table; -// -// protected final ButtonGroup buttonGroup; -// -// protected final TuttiDecorator<Species> decorator; -// -// protected final TableColumnExt column; -// -// public SpeciesDecoratorListener(JXTable table, -// ButtonGroup buttonGroup) { -// this.table = table; -// this.buttonGroup = buttonGroup; -// this.column = (TableColumnExt) table.getColumn(0); -// this.decorator = TuttiUIUtil.getSpeciesColumnDecorator(column); -// } -// -// @Override -// public void actionPerformed(ActionEvent e) { -// -// JRadioButtonMenuItem source = (JRadioButtonMenuItem) e.getSource(); -// buttonGroup.setSelected(source.getModel(), true); -// -// Integer index = -// (Integer) source.getClientProperty(SPECIES_DECORATOR_INDEX); -// -// if (log.isInfoEnabled()) { -// log.info("Selected decorator context index: " + index); -// } -// -// decorator.setContextIndex(index); -// -// column.setComparator(decorator.getCurrentComparator()); -// -// -// EditProtocolSpeciesTableModel tableModel = -// (EditProtocolSpeciesTableModel) table.getModel(); -// -// // keep selected rows -// int[] rowIndexes = table.getSelectedRows(); -// List<EditProtocolSpeciesRowModel> rowsToReSelect = Lists.newArrayList(); -// for (int viewRowIndex : rowIndexes) { -// int modelRowIndex = table.convertRowIndexToModel(viewRowIndex); -// EditProtocolSpeciesRowModel row = tableModel.getEntry(modelRowIndex); -// rowsToReSelect.add(row); -// } -// -// // fire model (will reload the comparator) -// tableModel.fireTableDataChanged(); -// -// // reselect rows -// for (EditProtocolSpeciesRowModel row : rowsToReSelect) { -// int modelRowIndex = tableModel.getRowIndex(row); -// int viewRowIndex = table.convertRowIndexToView(modelRowIndex); -// table.addRowSelectionInterval(viewRowIndex, viewRowIndex); -// } -// } -// } -// -// private static class ShowSpeciesDecoratorPopupListener extends MouseAdapter { -// private final JPopupMenu popup; -// -// public ShowSpeciesDecoratorPopupListener(JPopupMenu popup) { -// this.popup = popup; -// } -// -// @Override -// public void mouseClicked(MouseEvent e) { -// JTableHeader source = (JTableHeader) e.getSource(); -// Point point = e.getPoint(); -// int columnIndex = source.columnAtPoint(point); -// -// boolean rightClick = SwingUtilities.isRightMouseButton(e); -// if (columnIndex == 0 && rightClick) { -// e.consume(); -// popup.show(source, e.getX(), e.getY()); -// } -// } -// } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index 5650ef4..ec9f584 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -48,6 +48,10 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, private static final long serialVersionUID = 1L; + public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; + + public static final String PROPERTY_OPERATION_FIELD_MAPPING_ROWS = "operationFieldMappingRows"; + public static final String PROPERTY_SPECIES_ROW = "speciesRow"; public static final String PROPERTY_BENTHOS_ROW = "benthosRow"; @@ -116,6 +120,10 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, protected Map<String, Caracteristic> allCaracteristic; + protected List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows; + + protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows; + protected List<EditProtocolSpeciesRowModel> speciesRow; protected List<EditProtocolSpeciesRowModel> benthosRow; @@ -151,6 +159,26 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, setIndividualObservationPmfmId(ids); } + public List<EditProtocolCaracteristicsRowModel> getCaracteristicMappingRows() { + return caracteristicMappingRows; + } + + public void setCaracteristicMappingRows(List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows) { + Object oldValue = getCaracteristicMappingRows(); + this.caracteristicMappingRows = caracteristicMappingRows; + firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, oldValue, caracteristicMappingRows); + } + + public List<EditProtocolOperationFieldsRowModel> getOperationFieldMappingRows() { + return operationFieldMappingRows; + } + + public void setOperationFieldMappingRows(List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows) { + Object oldValue = getOperationFieldMappingRows(); + this.operationFieldMappingRows = operationFieldMappingRows; + firePropertyChange(PROPERTY_OPERATION_FIELD_MAPPING_ROWS, oldValue, operationFieldMappingRows); + } + public List<EditProtocolSpeciesRowModel> getSpeciesRow() { return speciesRow; } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index d2ec62e..9cb8670 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -894,6 +894,8 @@ tutti.editProgram.title.create.program= tutti.editProgram.title.edit.program= tutti.editProtocol.action.addBenthosProtocol.mnemonic= tutti.editProtocol.action.addBenthosProtocol.tip= +tutti.editProtocol.action.addCaracteristicMapping.mnemonic= +tutti.editProtocol.action.addCaracteristicMapping.tip= tutti.editProtocol.action.addSpeciesProtocol.mnemonic= tutti.editProtocol.action.addSpeciesProtocol.tip= tutti.editProtocol.action.chooseColumnsFile.import= @@ -960,6 +962,7 @@ tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel= tutti.editProtocol.askSaveBeforeLeaving.saveProtocol= tutti.editProtocol.askSaveBeforeLeaving.saveSampleCategoryModel= tutti.editProtocol.field.benthos.tip= +tutti.editProtocol.field.caracteristicMapping.tip= tutti.editProtocol.field.comment= tutti.editProtocol.field.comment.tip= tutti.editProtocol.field.protocol.name= @@ -1308,6 +1311,7 @@ tutti.flash.info.benthos.imported.in.protocol.oneReplaced= tutti.flash.info.benthos.imported.in.protocol.severalReplaced= tutti.flash.info.benthos.remove.from.protocol= tutti.flash.info.benthos.replaced= +tutti.flash.info.caracteristic.add.to.protocol= tutti.flash.info.caracteristic.imported.in.protocol= tutti.flash.info.caractristic.exported.from.protocol= tutti.flash.info.cruiseCreated= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 43e187b..b902985 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -876,6 +876,8 @@ tutti.editProgram.title.create.program=Créer une nouvelle série de campagne tutti.editProgram.title.edit.program=Éditer une série de campagne existante tutti.editProtocol.action.addBenthosProtocol.mnemonic=j tutti.editProtocol.action.addBenthosProtocol.tip=Ajouter une espèce du benthos au protocole +tutti.editProtocol.action.addCaracteristicMapping.mnemonic= +tutti.editProtocol.action.addCaracteristicMapping.tip= tutti.editProtocol.action.addSpeciesProtocol.mnemonic=j tutti.editProtocol.action.addSpeciesProtocol.tip=Ajouter une espèce au protocole tutti.editProtocol.action.chooseColumnsFile.import=Choisir le fichier contenant les colonnes @@ -938,6 +940,7 @@ tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel=La c tutti.editProtocol.askSaveBeforeLeaving.saveProtocol=Des modifications sur le protocole n'ont pas été enregistrées tutti.editProtocol.askSaveBeforeLeaving.saveSampleCategoryModel=Des modifications sur la catégorisation n'ont pas été enregistrées tutti.editProtocol.field.benthos.tip=Benthos +tutti.editProtocol.field.caracteristicMapping.tip= tutti.editProtocol.field.comment=Commentaire tutti.editProtocol.field.comment.tip=Commentaire tutti.editProtocol.field.protocol.name=Nom @@ -1260,6 +1263,7 @@ tutti.flash.info.benthos.imported.in.protocol.oneReplaced=Benthos importés dans tutti.flash.info.benthos.imported.in.protocol.severalReplaced=Benthos importés dans le protocole depuis le fichier <strong>%s</strong>. %s remplacées par leur référent. tutti.flash.info.benthos.remove.from.protocol=Les benthos ont été retirés du protocole. tutti.flash.info.benthos.replaced=Le benthos <strong>%s</strong> a été remplacé par son référent <strong>%s</strong>. +tutti.flash.info.caracteristic.add.to.protocol= tutti.flash.info.caracteristic.imported.in.protocol=Caractéristiques importées dans le protocole depuis le fichier <strong>%s</strong>. tutti.flash.info.caractristic.exported.from.protocol=Caractéristiques du protocole exportées dans le fichier <strong>%s</strong>. tutti.flash.info.cruiseCreated=La campagne <strong>%s</strong> a été créée. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit c2893a748ac4ed780cab491239b0800aef5d8819 Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 9 10:28:40 2014 +0100 - ne pas proposer les caractéristiques déjà ajoutées dans d'autres onglets - possibilité de supprimer des caractéristiques dans le tableau (clic droit) --- .../filtered-resources/tutti-help-fr.properties | 3 +- .../action/AddCaracteristicMappingAction.java | 10 +-- .../action/RemoveCaracteristicMappingAction.java | 93 ++++++++++++++++++++++ .../tutti/ui/swing/action/SaveProtocolAction.java | 3 +- .../ui/swing/content/protocol/EditProtocolUI.css | 14 ++++ .../ui/swing/content/protocol/EditProtocolUI.jaxx | 8 +- .../content/protocol/EditProtocolUIHandler.java | 28 ++++++- .../content/protocol/EditProtocolUIModel.java | 60 +++++++++++--- .../resources/i18n/tutti-ui-swing_en_GB.properties | 4 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 16 ++-- 10 files changed, 209 insertions(+), 30 deletions(-) diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index 2fe7a39..1fa9eb7 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -22,7 +22,7 @@ # #L% ### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Mon Dec 08 17:29:36 CET 2014 +#Mon Dec 08 18:37:45 CET 2014 \ "tutti.editProtocol.action.addCaracteristicMapping.help"\ = tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -262,6 +262,7 @@ tutti.editProtocol.action.importProtocolCaracteristic.help=editProtocol.html\#ac tutti.editProtocol.action.importProtocolColumns.help= tutti.editProtocol.action.importProtocolSpecies.help=editProtocol.html\#actionsSpecies tutti.editProtocol.action.removeBenthosProtocol.help=editProtocol.html\#actionsBenthos +tutti.editProtocol.action.removeCaracteristicMapping.help= tutti.editProtocol.action.removeSpeciesProtocol.help=editProtocol.html\#actionsSpecies tutti.editProtocol.action.saveProtocol.help=editProtocol.html\#actions tutti.editProtocol.action.selectOtherBenthos.help=editProtocol.html\#actionsBenthos diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java index 6b72393..b05d872 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java @@ -63,14 +63,13 @@ public class AddCaracteristicMappingAction extends AbstractTuttiAction<EditProto BeanFilterableComboBox<Caracteristic> caracteristicMappingCombBox = ui.getCaracteristicMappingComboBox(); caracteristic = (Caracteristic) caracteristicMappingCombBox.getSelectedItem(); - Preconditions.checkNotNull( - caracteristic, "Can't add a speciesProtocol with a null species"); + Preconditions.checkNotNull(caracteristic, "Can't add a speciesProtocol with a null species"); // add new row to model (do it after combo stuff for ui best display) newRow = handler.createEditProtocolCaracteristicsRowModel(); newRow.setPsfm(caracteristic); - getModel().getCaracteristicMappingRows().add(newRow); + getModel().addCaracteristicMappingRow(newRow); } @Override @@ -82,7 +81,7 @@ public class AddCaracteristicMappingAction extends AbstractTuttiAction<EditProto // fire row was inserted in table model EditProtocolCaracteristicsTableModel tableModel = getHandler().getCaracteristicMappingTableModel(); - tableModel.fireTableRowsInserted(newRow); + tableModel.addNewRow(newRow); // select this new row int rowIndex = tableModel.getRowIndex(newRow); @@ -90,7 +89,6 @@ public class AddCaracteristicMappingAction extends AbstractTuttiAction<EditProto // add notification String caracteristicStr = decorate(caracteristic); - sendMessage(t("tutti.flash.info.caracteristic.add.to.protocol", - caracteristicStr)); + sendMessage(t("tutti.flash.info.caracteristic.add.to.protocol", caracteristicStr)); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java new file mode 100644 index 0000000..ce0732d --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java @@ -0,0 +1,93 @@ +package fr.ifremer.tutti.ui.swing.action; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsRowModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsTableModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; +import jaxx.runtime.SwingUtil; + +import javax.swing.*; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class RemoveCaracteristicMappingAction extends AbstractTuttiAction<EditProtocolUIModel, EditProtocolUI, EditProtocolUIHandler> { + + + /** + * Set of removed caracteristics. + */ + protected Set<Caracteristic> removedCarateristics; + + /** + * Set of removed rows. + */ + protected Set<EditProtocolCaracteristicsRowModel> removedRows; + + + public RemoveCaracteristicMappingAction(EditProtocolUIHandler handler) { + super(handler, false); + } + + @Override + public void doAction() throws Exception { + + JTable table = handler.getCaracteristicsMappingTable(); + + // need to have a selection + Preconditions.checkState(!table.getSelectionModel().isSelectionEmpty()); + + EditProtocolCaracteristicsTableModel tableModel = + (EditProtocolCaracteristicsTableModel) table.getModel(); + + removedCarateristics = Sets.newHashSet(); + removedRows = Sets.newHashSet(); + + for (Integer rowIndex : SwingUtil.getSelectedModelRows(table)) { + + // get row to remove + EditProtocolCaracteristicsRowModel selectedRow = + tableModel.getEntry(rowIndex); + + // re-add all synonym of this taxon to the species / benthos combobox + Caracteristic caracteristic = selectedRow.getPsfm(); + removedCarateristics.add(caracteristic); + + // mark row to be removed at the very last moment + removedRows.add(selectedRow); + } + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + // update comboboxes + getUI().getCaracteristicMappingComboBox().addItems(removedCarateristics); + + // remove all rows from model + getModel().removeCaracteristicMappingRows(removedRows); + + // fire table data changed + JTable table = handler.getCaracteristicsMappingTable(); + EditProtocolCaracteristicsTableModel tableModel = + (EditProtocolCaracteristicsTableModel) table.getModel(); + for (Integer rowIndex : SwingUtil.getSelectedModelRows(table)) { + tableModel.removeRow(rowIndex); + } + + // clear table selection + table.clearSelection(); + + // notify user + sendMessage(t("tutti.flash.info.caracteristicMapping.remove.from.protocol")); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java index b1702f9..be1ba1a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java @@ -45,6 +45,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.StringUtil; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -77,7 +78,7 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, TuttiProtocol bean = model.toBean(); - List<EditProtocolCaracteristicsRowModel> protocolCaracteristicMappingRows = getUI().getModel().getCaracteristicMappingRows(); + Collection<EditProtocolCaracteristicsRowModel> protocolCaracteristicMappingRows = getUI().getModel().getCaracteristicMappingRows(); List<CaracteristicMappingRow> caracteristicMappingRows = new ArrayList<CaracteristicMappingRow>(); for (EditProtocolCaracteristicsRowModel row : protocolCaracteristicMappingRows) { if (row.getPsfm() != null && row.getType() != null) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css index d12659f..5bd6f32 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css @@ -91,6 +91,11 @@ JTextField { _help: { "tutti.editProtocol.action.addCaracteristicMapping.help" }; } + +#caracteristicMappingTablePopup { + label: "tutti.editProtocol.title.batchActions"; +} + #caracteristicsMappingTable { selectionMode: {ListSelectionModel.SINGLE_SELECTION}; selectionBackground: {null}; @@ -308,3 +313,12 @@ JTextField { _help: {"tutti.editProtocol.action.importProtocolColumns.help"}; } +#removeCaracteristicMappingButton { + actionIcon: delete; + text: "tutti.editProtocol.action.removeCaracteristicMapping"; + toolTipText: "tutti.editProtocol.action.removeCaracteristicMapping.tip"; + i18nMnemonic: "tutti.editProtocol.action.removeCaracteristicMapping.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.RemoveCaracteristicMappingAction.class}; + enabled: {model.isRemoveCaracteristicMappingEnabled()}; + _help: {"tutti.editProtocol.action.removeCaracteristicMapping.help"}; +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx index a976187..7be67a1 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx @@ -71,6 +71,10 @@ <JMenuItem id='removeBenthosProtocolButton'/> </JPopupMenu> + <JPopupMenu id='caracteristicMappingTablePopup'> + <JMenuItem id='removeCaracteristicMappingButton'/> + </JPopupMenu> + <JTabbedPane id='tabPanel' constraints='BorderLayout.CENTER'> <tab title='tutti.editProtocol.tab.info'> @@ -136,7 +140,9 @@ <row fill='both' weighty='1'> <cell fill='both' columns='2'> <JScrollPane> - <JXTable id='caracteristicsMappingTable'/> + <JXTable id='caracteristicsMappingTable' + onMouseClicked='handler.autoSelectRowInTable(event, caracteristicMappingTablePopup)' + onKeyPressed='handler.openRowMenu(event, caracteristicMappingTablePopup)'/> </JScrollPane> </cell> </row> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index 278a2da..de0aed7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.content.protocol; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -495,6 +496,14 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI addHighlighters(caracteristicsMappingTable); + caracteristicsMappingTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + ListSelectionModel source = (ListSelectionModel) e.getSource(); + getModel().setRemoveCaracteristicMappingEnabled(!source.isSelectionEmpty()); + } + }); + // always scroll to selected row SwingUtil.scrollToTableSelection(caracteristicsMappingTable); @@ -562,6 +571,15 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI } if (selectedDoubleList != null) { selectedDoubleList.getHandler().refreshFilteredElements(); + + } else { + // if the selected tab is the operation caracteristic mapping tab, then update the combobox + List<Caracteristic> selectedCaracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); + for (BeanDoubleList<Caracteristic> doubleList : allDoubleLists) { + selectedCaracteristics.removeAll(doubleList.getModel().getSelected()); + } + selectedCaracteristics.removeAll(getModel().getUsedCaracteristics()); + getUI().getCaracteristicMappingComboBox().setData(selectedCaracteristics); } } }); @@ -817,9 +835,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI initBeanList(widget, availableCaracteristics, Lists.<Caracteristic>newArrayList()); - UpdateSelectedList listener = new UpdateSelectedList( - widget, - getModel().getAllCaracteristic()); + UpdateSelectedList listener = new UpdateSelectedList(widget, getModel().getAllCaracteristic()); widget.putClientProperty("_updateListener", listener); widget.putClientProperty("_updateListenerId", propertyId); listener.select(selectedCaracteristics); @@ -828,6 +844,12 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI List<BeanDoubleList<Caracteristic>> list = Lists.newArrayList(allDoubleLists); list.remove(widget); widget.getHandler().addFilter(new SelectValuePredicate(list)); + widget.getHandler().addFilter(new Predicate<Caracteristic>() { + @Override + public boolean apply(Caracteristic caracteristic) { + return !getModel().isCaracteristicUsedInMapping(caracteristic); + } + }); } protected void selectLengthClasses(List<String> ids, JComboBox comboBox) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index ec9f584..ef50154 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -22,7 +22,9 @@ package fr.ifremer.tutti.ui.swing.content.protocol; * #L% */ +import com.google.common.base.Function; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; @@ -37,6 +39,7 @@ import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -60,6 +63,8 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, public static final String PROPERTY_REMOVE_BENTHOS_ENABLED = "removeBenthosEnabled"; + public static final String PROPERTY_REMOVE_CARACTERISTIC_MAPPING_ENABLED = "removeCaracteristicMappingEnabled"; + public static final String PROPERTY_IMPORTED = "imported"; public static final String PROPERTY_CLONED = "cloned"; @@ -108,6 +113,8 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, */ protected boolean removeBenthosEnabled; + protected boolean removeCaracteristicMappingEnabled; + protected List<Species> allSpecies; protected List<Species> allSynonyms; @@ -120,7 +127,7 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, protected Map<String, Caracteristic> allCaracteristic; - protected List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows; + protected Map<Caracteristic, EditProtocolCaracteristicsRowModel> caracteristicMappingRows; protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows; @@ -149,24 +156,46 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, setLengthClassesPmfmId(ids); } -// public void setGearUseFeaturePmfm(List<Caracteristic> gearUseFeaturePmfm) { -// List<String> ids = TuttiEntities.collecIds(gearUseFeaturePmfm); -// setGearUseFeaturePmfmId(ids); -// } - public void setIndividualObservationPmfm(List<Caracteristic> individualObservationPmfm) { List<String> ids = TuttiEntities.collecIds(individualObservationPmfm); setIndividualObservationPmfmId(ids); } - public List<EditProtocolCaracteristicsRowModel> getCaracteristicMappingRows() { - return caracteristicMappingRows; + public Collection<EditProtocolCaracteristicsRowModel> getCaracteristicMappingRows() { + return caracteristicMappingRows.values(); + } + + public void addCaracteristicMappingRow(EditProtocolCaracteristicsRowModel newRow) { + caracteristicMappingRows.put(newRow.getPsfm(), newRow); + firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, getCaracteristicMappingRows()); + } + + public void removeCaracteristicMappingRows(Collection<EditProtocolCaracteristicsRowModel> rowsToRemove) { + for (EditProtocolCaracteristicsRowModel row : rowsToRemove) { + caracteristicMappingRows.remove(row.getPsfm()); + } + firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, getCaracteristicMappingRows()); } public void setCaracteristicMappingRows(List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows) { - Object oldValue = getCaracteristicMappingRows(); - this.caracteristicMappingRows = caracteristicMappingRows; - firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, oldValue, caracteristicMappingRows); + this.caracteristicMappingRows = new HashMap<Caracteristic, EditProtocolCaracteristicsRowModel>( + Maps.uniqueIndex(caracteristicMappingRows, + new Function<EditProtocolCaracteristicsRowModel, Caracteristic>() { + @Override + public Caracteristic apply(EditProtocolCaracteristicsRowModel editProtocolCaracteristicsRowModel) { + return editProtocolCaracteristicsRowModel.getPsfm(); + } + }) + ); + firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, caracteristicMappingRows); + } + + public boolean isCaracteristicUsedInMapping(Caracteristic caracteristic) { + return caracteristicMappingRows.containsKey(caracteristic); + } + + public Collection<Caracteristic> getUsedCaracteristics() { + return caracteristicMappingRows.keySet(); } public List<EditProtocolOperationFieldsRowModel> getOperationFieldMappingRows() { @@ -217,6 +246,15 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, firePropertyChange(PROPERTY_REMOVE_BENTHOS_ENABLED, null, removeBenthosEnabled); } + public boolean isRemoveCaracteristicMappingEnabled() { + return removeCaracteristicMappingEnabled; + } + + public void setRemoveCaracteristicMappingEnabled(boolean removeCaracteristicMappingEnabled) { + this.removeCaracteristicMappingEnabled = removeCaracteristicMappingEnabled; + firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_MAPPING_ENABLED, null, removeCaracteristicMappingEnabled); + } + public boolean isImported() { return imported; } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 9cb8670..785ecc6 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -944,6 +944,9 @@ tutti.editProtocol.action.loadImportColumns.success= tutti.editProtocol.action.removeBenthosProtocol= tutti.editProtocol.action.removeBenthosProtocol.mnemonic= tutti.editProtocol.action.removeBenthosProtocol.tip= +tutti.editProtocol.action.removeCaracteristicMapping= +tutti.editProtocol.action.removeCaracteristicMapping.mnemonic= +tutti.editProtocol.action.removeCaracteristicMapping.tip= tutti.editProtocol.action.removeSpeciesProtocol= tutti.editProtocol.action.removeSpeciesProtocol.mnemonic= tutti.editProtocol.action.removeSpeciesProtocol.tip= @@ -1313,6 +1316,7 @@ tutti.flash.info.benthos.remove.from.protocol= tutti.flash.info.benthos.replaced= tutti.flash.info.caracteristic.add.to.protocol= tutti.flash.info.caracteristic.imported.in.protocol= +tutti.flash.info.caracteristicMapping.remove.from.protocol= tutti.flash.info.caractristic.exported.from.protocol= tutti.flash.info.cruiseCreated= tutti.flash.info.cruiseSaved= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index b902985..a79fdca 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -876,8 +876,8 @@ tutti.editProgram.title.create.program=Créer une nouvelle série de campagne tutti.editProgram.title.edit.program=Éditer une série de campagne existante tutti.editProtocol.action.addBenthosProtocol.mnemonic=j tutti.editProtocol.action.addBenthosProtocol.tip=Ajouter une espèce du benthos au protocole -tutti.editProtocol.action.addCaracteristicMapping.mnemonic= -tutti.editProtocol.action.addCaracteristicMapping.tip= +tutti.editProtocol.action.addCaracteristicMapping.mnemonic=j +tutti.editProtocol.action.addCaracteristicMapping.tip=Ajouter aux caractéristiques du trait tutti.editProtocol.action.addSpeciesProtocol.mnemonic=j tutti.editProtocol.action.addSpeciesProtocol.tip=Ajouter une espèce au protocole tutti.editProtocol.action.chooseColumnsFile.import=Choisir le fichier contenant les colonnes @@ -922,6 +922,9 @@ tutti.editProtocol.action.loadImportColumns.success=%s colonnes importées avec tutti.editProtocol.action.removeBenthosProtocol=Supprimer les benthos tutti.editProtocol.action.removeBenthosProtocol.mnemonic=S tutti.editProtocol.action.removeBenthosProtocol.tip=Supprimer les benthos sélectionnés +tutti.editProtocol.action.removeCaracteristicMapping=Supprimer les caractéristiques +tutti.editProtocol.action.removeCaracteristicMapping.mnemonic=S +tutti.editProtocol.action.removeCaracteristicMapping.tip=Supprimer les caractéristiques sélectionnés tutti.editProtocol.action.removeSpeciesProtocol=Supprimer les espèces tutti.editProtocol.action.removeSpeciesProtocol.mnemonic=S tutti.editProtocol.action.removeSpeciesProtocol.tip=Supprimer les espèces sélectionnées @@ -940,7 +943,7 @@ tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel=La c tutti.editProtocol.askSaveBeforeLeaving.saveProtocol=Des modifications sur le protocole n'ont pas été enregistrées tutti.editProtocol.askSaveBeforeLeaving.saveSampleCategoryModel=Des modifications sur la catégorisation n'ont pas été enregistrées tutti.editProtocol.field.benthos.tip=Benthos -tutti.editProtocol.field.caracteristicMapping.tip= +tutti.editProtocol.field.caracteristicMapping.tip=Caractéristiques tutti.editProtocol.field.comment=Commentaire tutti.editProtocol.field.comment.tip=Commentaire tutti.editProtocol.field.protocol.name=Nom @@ -948,11 +951,9 @@ tutti.editProtocol.field.protocol.name.tip=Nom du protocole tutti.editProtocol.field.species.tip=Espèces tutti.editProtocol.tab.benthos=Benthos tutti.editProtocol.tab.caracteristic=Caractéristiques -tutti.editProtocol.tab.caracteristic.gearUseFeature=Mise en œuvre de l'engin tutti.editProtocol.tab.caracteristic.individualObservation=Observations individuelles tutti.editProtocol.tab.caracteristic.lengthClasses=Classes de taille tutti.editProtocol.tab.caracteristic.mapping=Caractéristiques du trait -tutti.editProtocol.tab.caracteristic.vesselUseFeature=Autres caractéristiques tutti.editProtocol.tab.info=Informations générales tutti.editProtocol.tab.species=Espèces tutti.editProtocol.table.header.calcifySample=Prélèvement de pièces calcifiées @@ -1257,14 +1258,15 @@ tutti.fishingOperations.warn.catchBatch.notFound=Pas d'arbre d’échantillonnag tutti.fishingOperations.warn.invalid.batch=<html><body>Les erreurs suivantes ont été détectées, impossible d'afficher les captures \:<br/><ul>%s</ul></body></html>. tutti.fishingOperations.warn.invalid.batch.model=L'arbre d’échantillonnage n'est pas compatible. Les captures ne seront pas visibles. tutti.flash.info.all.caractristic.exported=Toutes les caractéristiques exportées dans le fichier <strong>%s</strong>. -tutti.flash.info.benthos.add.to.protocol=Le benthos <strong>%s</strong> a été ajoutée au protocole. +tutti.flash.info.benthos.add.to.protocol=Le benthos <strong>%s</strong> a été ajouté au protocole. tutti.flash.info.benthos.imported.in.protocol=Benthos importés dans le protocole depuis le fichier <strong>%s</strong>. tutti.flash.info.benthos.imported.in.protocol.oneReplaced=Benthos importés dans le protocole depuis le fichier <strong>%s</strong>. 1 remplacée par son référent. tutti.flash.info.benthos.imported.in.protocol.severalReplaced=Benthos importés dans le protocole depuis le fichier <strong>%s</strong>. %s remplacées par leur référent. tutti.flash.info.benthos.remove.from.protocol=Les benthos ont été retirés du protocole. tutti.flash.info.benthos.replaced=Le benthos <strong>%s</strong> a été remplacé par son référent <strong>%s</strong>. -tutti.flash.info.caracteristic.add.to.protocol= +tutti.flash.info.caracteristic.add.to.protocol=La caractéristique <strong>%s</strong> a été ajoutée au protocole. tutti.flash.info.caracteristic.imported.in.protocol=Caractéristiques importées dans le protocole depuis le fichier <strong>%s</strong>. +tutti.flash.info.caracteristicMapping.remove.from.protocol=Les caractéristiques ont été retirées du protocole. tutti.flash.info.caractristic.exported.from.protocol=Caractéristiques du protocole exportées dans le fichier <strong>%s</strong>. tutti.flash.info.cruiseCreated=La campagne <strong>%s</strong> a été créée. tutti.flash.info.cruiseSaved=La campagne <strong>%s</strong> a été enregistrée. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 4b7efb2105e9a90667277c15ad8e2d5fc904fddc Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 9 12:21:12 2014 +0100 correction de la suppression --- .../persistence/entities/protocol/TuttiProtocols.java | 3 +-- .../ui/swing/action/RemoveCaracteristicMappingAction.java | 14 +++++++++++++- .../tutti/ui/swing/content/protocol/EditProtocolUI.css | 1 - 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index eaeae66..bad4ce2 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -147,9 +147,8 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } protected static TuttiProtocol migrateProtocol(File file) { - //try to load a v2 try { - // try to load a v1 + //try to load a v2 TuttiProtocol2 tuttiProtocol2 = fromFileV2(file); TuttiProtocol result = fromTuttiProtocol2(tuttiProtocol2); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java index ce0732d..bc7eb03 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/RemoveCaracteristicMappingAction.java @@ -9,8 +9,12 @@ import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; import jaxx.runtime.SwingUtil; +import org.apache.commons.collections4.ComparatorUtils; import javax.swing.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -32,6 +36,8 @@ public class RemoveCaracteristicMappingAction extends AbstractTuttiAction<EditPr */ protected Set<EditProtocolCaracteristicsRowModel> removedRows; + protected List<Integer> removedRowIndexes; + public RemoveCaracteristicMappingAction(EditProtocolUIHandler handler) { super(handler, false); @@ -50,9 +56,12 @@ public class RemoveCaracteristicMappingAction extends AbstractTuttiAction<EditPr removedCarateristics = Sets.newHashSet(); removedRows = Sets.newHashSet(); + removedRowIndexes = new ArrayList<Integer>(); for (Integer rowIndex : SwingUtil.getSelectedModelRows(table)) { + removedRowIndexes.add(rowIndex); + // get row to remove EditProtocolCaracteristicsRowModel selectedRow = tableModel.getEntry(rowIndex); @@ -64,6 +73,8 @@ public class RemoveCaracteristicMappingAction extends AbstractTuttiAction<EditPr // mark row to be removed at the very last moment removedRows.add(selectedRow); } + + Collections.sort(removedRowIndexes, Collections.reverseOrder()); } @Override @@ -80,7 +91,8 @@ public class RemoveCaracteristicMappingAction extends AbstractTuttiAction<EditPr JTable table = handler.getCaracteristicsMappingTable(); EditProtocolCaracteristicsTableModel tableModel = (EditProtocolCaracteristicsTableModel) table.getModel(); - for (Integer rowIndex : SwingUtil.getSelectedModelRows(table)) { + + for (Integer rowIndex : removedRowIndexes) { tableModel.removeRow(rowIndex); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css index 5bd6f32..022ca7c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css @@ -97,7 +97,6 @@ JTextField { } #caracteristicsMappingTable { - selectionMode: {ListSelectionModel.SINGLE_SELECTION}; selectionBackground: {null}; selectionForeground: {Color.BLACK}; sortable: false; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 490685cf85e9b1e2989419a82b7926153bc5df67 Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 9 18:23:03 2014 +0100 import --- .../entities/protocol/TuttiProtocols.java | 10 ++- .../src/main/xmi/tutti-persistence.zargo | Bin 57963 -> 57983 bytes .../src/main/xmi/tutti-persistence.zargo~ | Bin 57440 -> 57983 bytes .../swing/action/ImportFromColumnFileAction.java | 89 ++++++++++++++++++++- .../fishing/AbstractCaracteristicTabUIHandler.java | 25 +++++- .../util/table/AbstractTuttiTableUIHandler.java | 1 - 6 files changed, 113 insertions(+), 12 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index bad4ce2..8d3baeb 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -158,7 +158,9 @@ public class TuttiProtocols extends AbstractTuttiProtocols { // try to load a v1 TuttiProtocol1 tuttiProtocol1 = fromFileV1(file); - TuttiProtocol result = fromTuttiProtocol1(tuttiProtocol1); + TuttiProtocol2 tuttiProtocol2 = fromTuttiProtocol1(tuttiProtocol1); + + TuttiProtocol result = fromTuttiProtocol2(tuttiProtocol2); return result; } } @@ -290,9 +292,9 @@ public class TuttiProtocols extends AbstractTuttiProtocols { return message; } - protected static TuttiProtocol fromTuttiProtocol1(TuttiProtocol1 tuttiProtocol1) { - TuttiProtocol result = newTuttiProtocol(); - Binder<TuttiProtocol1, TuttiProtocol> binder = BinderFactory.newBinder(TuttiProtocol1.class, TuttiProtocol.class); + protected static TuttiProtocol2 fromTuttiProtocol1(TuttiProtocol1 tuttiProtocol1) { + TuttiProtocol2 result = new TuttiProtocolBean2(); + Binder<TuttiProtocol1, TuttiProtocol2> binder = BinderFactory.newBinder(TuttiProtocol1.class, TuttiProtocol2.class); binder.copy(tuttiProtocol1, result); if (!tuttiProtocol1.isSpeciesEmpty()) { result.setSpecies(Lists.<SpeciesProtocol>newArrayList()); diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo b/tutti-persistence/src/main/xmi/tutti-persistence.zargo index 4f0e671..86f4fb3 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo differ diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ index b3c7107..69721e7 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ differ diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index aaa73f6..53fe596 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -4,11 +4,16 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.FishingOperations; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -23,10 +28,14 @@ import org.nuiton.csv.Import2; import org.nuiton.csv.ImportConf; import org.nuiton.csv.ImportRow; import org.nuiton.csv.ValueParser; +import org.nuiton.csv.ValueSetter; import org.nuiton.csv.ext.CsvReaders; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; import java.io.File; import java.io.FileInputStream; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -78,6 +87,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO ImportConf conf = new ImportConf(); conf.setStrictMode(false); // conf.setIgnoreUnknownHeader(true); + Import2<FishingOperation> operationUIModelImport = Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); @@ -95,9 +105,13 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO @Override public boolean apply(FishingOperation fishingOperation) { - String operationNumberColumn = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER).getImportColumn(); - String stationColumn = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER).getImportColumn(); - String startDateColumn = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE).getImportColumn(); + OperationFieldMappingRow operationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); + OperationFieldMappingRow stationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER); + OperationFieldMappingRow startDateRow = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); + + String operationNumberColumn = operationNumberRow != null ? operationNumberRow.getImportColumn() : null; + String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; + String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; EditFishingOperationUIModel model = getModel(); boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); @@ -119,6 +133,8 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO if (predicate.apply(fishingOperation)) { if (next.isValid()) { getModel().fromEntity(fishingOperation); + getUI().getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); + getUI().getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); } else { if (log.isErrorEnabled()) { @@ -148,6 +164,10 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO protected class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { + protected Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = + BinderFactory.newBinder(EditFishingOperationUIModel.class, + FishingOperation.class); + public ImportFromColumnFileModel(char separator, Set<String> headers) { super(separator); @@ -219,6 +239,65 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO newMandatoryColumn(importColumn, field, valueParser); } } + + Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping(); + for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) { + String importColumn = mappingRow.getImportColumn(); + if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { + + int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); + final Caracteristic caracteristic = getContext().getPersistenceService().getCaracteristic(pmfmId); + + ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { + @Override + public void set(FishingOperation fishingOperation, String value) throws Exception { + + Serializable realValue = null; + if (StringUtils.isNotBlank(value)) { + switch (caracteristic.getCaracteristicType()) { + case QUALITATIVE: + for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) { + if (value.equals(cqv.getId())) { + realValue = cqv; + break; + } + } + break; + + case NUMBER: + realValue = Float.parseFloat(value); + break; + + default: + realValue = value; + } + } + + CaracteristicMap caracteristicMap; + if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) { + caracteristicMap = fishingOperation.getGearUseFeatures(); + if (caracteristicMap == null) { + caracteristicMap = new CaracteristicMap(); + fishingOperation.setGearUseFeatures(caracteristicMap); + } + + } else { + caracteristicMap = fishingOperation.getVesselUseFeatures(); + if (caracteristicMap == null) { + caracteristicMap = new CaracteristicMap(); + fishingOperation.setVesselUseFeatures(caracteristicMap); + } + } + caracteristicMap.put(caracteristic, realValue); + + } + }; + newMandatoryColumn(importColumn, setter); + + } + } + + for (String header : headers) { newIgnoredColumn(header); } @@ -226,7 +305,9 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO @Override public FishingOperation newEmptyInstance() { - return FishingOperations.newFishingOperation(); + FishingOperation fishingOperation = FishingOperations.newFishingOperation(); + toBeanBinder.copy(getModel(), fishingOperation); + return fishingOperation; } } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java index 7c6e71c..c8a8317 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java @@ -193,7 +193,6 @@ public abstract class AbstractCaracteristicTabUIHandler /** Resets the table with the data from the database */ public void reset(FishingOperation fishingOperation) { - TM tableModel = getTableModel(); M model = getModel(); CaracteristicMap caracteristicMap = getCaracteristics(fishingOperation); @@ -202,8 +201,28 @@ public abstract class AbstractCaracteristicTabUIHandler } model.setCaracteristicMap(caracteristicMap); -// TuttiProtocol protocol = getDataContext().getProtocol(); + updateRows(); + model.setModify(false); + } + + /** Resets the table with the data from the database */ + public void mergeCaracteristics(FishingOperation fishingOperation) { + CaracteristicMap caracteristicMap = getCaracteristics(fishingOperation); + if (caracteristicMap != null) { + CaracteristicMap thisCaracteristicMap = getModel().getCaracteristicMap(); + for (Caracteristic caracteristic : caracteristicMap.keySet()) { + thisCaracteristicMap.put(caracteristic, caracteristicMap.get(caracteristic)); + } + + updateRows(); + } + } + + protected void updateRows() { + TM tableModel = getTableModel(); + M model = getModel(); List<String> pmfmIds = Lists.newArrayList(); + if (getDataContext().isProtocolFilled()) { List<String> protocolPmfmId = getProtocolPmfmIds(); if (protocolPmfmId != null) { @@ -211,6 +230,7 @@ public abstract class AbstractCaracteristicTabUIHandler } } + CaracteristicMap caracteristicMap = model.getCaracteristicMap(); List<RM> rows = Lists.newArrayList(); List<Caracteristic> caracteristics = Lists.newArrayList(caracteristicMap.keySet()); @@ -243,7 +263,6 @@ public abstract class AbstractCaracteristicTabUIHandler keyCombo.setData(caracteristicList); // selectFirstInCombo(keyCombo); keyCombo.getHandler().reset(); - model.setModify(false); } public void removeCaracteristic() { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java index 335d832..ab99b41 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java @@ -264,7 +264,6 @@ public abstract class AbstractTuttiTableUIHandler<R extends AbstractTuttiBeanUIM getModel().addPropertyChangeListener(AbstractTuttiTableUIModel.PROPERTY_ROWS, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - log.info("row schanged"); onModelRowsChanged((List<R>) evt.getNewValue()); } }); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 65484e68b6aaf38f8b8039a26cf878aab06528cd Author: Kevin Morin <morin@codelutin.com> Date: Wed Dec 10 09:22:20 2014 +0100 empecher de saisir plusieurs fois la même colonne dans les caracteristiques --- .../tutti/ui/swing/action/SaveProtocolAction.java | 5 +- .../fishing/AbstractCaracteristicTabUIHandler.java | 1 + .../content/protocol/EditProtocolUIHandler.java | 70 +++++++++++++++++++++- .../content/protocol/EditProtocolUIModel.java | 50 +++++++++++++++- .../resources/i18n/tutti-ui-swing_fr_FR.properties | 16 ++--- 5 files changed, 128 insertions(+), 14 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java index be1ba1a..c0a14f6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java @@ -81,7 +81,7 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, Collection<EditProtocolCaracteristicsRowModel> protocolCaracteristicMappingRows = getUI().getModel().getCaracteristicMappingRows(); List<CaracteristicMappingRow> caracteristicMappingRows = new ArrayList<CaracteristicMappingRow>(); for (EditProtocolCaracteristicsRowModel row : protocolCaracteristicMappingRows) { - if (row.getPsfm() != null && row.getType() != null) { + if (row.isValid()) { caracteristicMappingRows.add(row.toEntity()); } } @@ -90,7 +90,8 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, List<EditProtocolOperationFieldsRowModel> protocolOperationFieldMappingRows = getUI().getModel().getOperationFieldMappingRows(); List<OperationFieldMappingRow> operationFieldMappingRows = new ArrayList<OperationFieldMappingRow>(); for (EditProtocolOperationFieldsRowModel row : protocolOperationFieldMappingRows) { - if (StringUtils.isNotBlank(row.getField()) && StringUtils.isNotBlank(row.getImportColumn())) { + if (StringUtils.isNotBlank(row.getField()) && StringUtils.isNotBlank(row.getImportColumn()) + && row.isValid()) { operationFieldMappingRows.add(row.toEntity()); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java index c8a8317..a4cab77 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java @@ -213,6 +213,7 @@ public abstract class AbstractCaracteristicTabUIHandler for (Caracteristic caracteristic : caracteristicMap.keySet()) { thisCaracteristicMap.put(caracteristic, caracteristicMap.get(caracteristic)); } + getModel().setModify(true); updateRows(); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index de0aed7..8333438 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -812,10 +812,26 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI @Override public void propertyChange(PropertyChangeEvent evt) { EditProtocolCaracteristicsRowModel row = (EditProtocolCaracteristicsRowModel) evt.getSource(); - row.setValid(row.getType() != null); + EditProtocolUIModel model = getModel(); + + if (EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_COLUMN.equals(evt.getPropertyName())) { + String oldValue = (String) evt.getOldValue(); + if (oldValue != null) { + model.decNumberOfRows(oldValue); + } + String newValue = (String) evt.getNewValue(); + if (newValue != null) { + model.incNumberOfRows(newValue); + } + + recomputeRowsValidState(); + + } else { + row.setValid(isCaracteristicsRowValid(row)); + } if (row.isValid()) { - getModel().setModify(true); + model.setModify(true); } } }); @@ -982,6 +998,28 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI protected EditProtocolOperationFieldsRowModel createOperationFieldRow(String property, String column) { EditProtocolOperationFieldsRowModel newRow = new EditProtocolOperationFieldsRowModel(); + newRow.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + EditProtocolOperationFieldsRowModel row = (EditProtocolOperationFieldsRowModel) evt.getSource(); + EditProtocolUIModel model = getModel(); + + //update number of rows by column + if (EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_COLUMN.equals(evt.getPropertyName())) { + String oldValue = (String) evt.getOldValue(); + if (oldValue != null) { + model.decNumberOfRows(oldValue); + } + String newValue = (String) evt.getNewValue(); + if (newValue != null) { + model.incNumberOfRows(newValue); + } + + recomputeRowsValidState(); + } + } + }); + newRow.setValid(true); newRow.setField(property); newRow.setImportColumn(column); newRow.setValid(true); @@ -994,6 +1032,34 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return newRow; } + protected void recomputeRowsValidState() { + EditProtocolUIModel model = getModel(); + + for (EditProtocolCaracteristicsRowModel row : model.getCaracteristicMappingRows()) { + row.setValid(isCaracteristicsRowValid(row)); + } + + for (EditProtocolOperationFieldsRowModel row : model.getOperationFieldMappingRows()) { + row.setValid(isOperationFieldsRowValid(row)); + } + + getCaracteristicsMappingTable().repaint(); + getOperationFieldsMappingTable().repaint(); + } + + protected boolean isOperationFieldsRowValid(EditProtocolOperationFieldsRowModel row) { + EditProtocolUIModel model = getModel(); + String importColumn = row.getImportColumn(); + return importColumn == null || model.numberOfRows(importColumn) < 2; + } + + protected boolean isCaracteristicsRowValid(EditProtocolCaracteristicsRowModel row) { + EditProtocolUIModel model = getModel(); + String importColumn = row.getImportColumn(); + return row.getType() != null && + (importColumn == null || model.numberOfRows(importColumn) < 2); + } + protected void populateImportColumnTableEditors() { Collection<String> importColumns = getModel().getImportColumns(); ArrayList<String> dataToList = new ArrayList<String>(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index ef50154..0ef2903 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -23,6 +23,7 @@ package fr.ifremer.tutti.ui.swing.content.protocol; */ import com.google.common.base.Function; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -35,9 +36,11 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; +import org.apache.commons.lang3.mutable.MutableInt; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -127,9 +130,18 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, protected Map<String, Caracteristic> allCaracteristic; - protected Map<Caracteristic, EditProtocolCaracteristicsRowModel> caracteristicMappingRows; + protected Map<Caracteristic, EditProtocolCaracteristicsRowModel> caracteristicMappingRows = + new HashMap<Caracteristic, EditProtocolCaracteristicsRowModel>(); - protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows; + protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows = + new ArrayList<EditProtocolOperationFieldsRowModel>(); + + /** + * Number of rows for each column + * + * @since 3.10 + */ + protected Map<String, MutableInt> numberOfRowsByColumn = new HashMap<String, MutableInt>(); protected List<EditProtocolSpeciesRowModel> speciesRow; @@ -794,4 +806,38 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, public OperationFieldMappingRow getOperationFieldMapping(int index) { return editObject.getOperationFieldMapping(index); } + + public int numberOfRows(String column) { + int result = 0; + MutableInt mutableInt = numberOfRowsByColumn.get(column); + if (mutableInt != null) { + result = mutableInt.intValue(); + } + return result; + } + + public void resetNumbersOfRows() { + numberOfRowsByColumn = new HashMap<String, MutableInt>(); + } + + public int incNumberOfRows(String column) { + MutableInt mutableInt = numberOfRowsByColumn.get(column); + if (mutableInt == null) { + mutableInt = new MutableInt(1); + numberOfRowsByColumn.put(column, mutableInt); + } else { + mutableInt.increment(); + } + return mutableInt.intValue(); + + } + + public int decNumberOfRows(String column) { + MutableInt mutableInt = numberOfRowsByColumn.get(column); + Preconditions.checkNotNull(mutableInt); + Preconditions.checkArgument(mutableInt.intValue() > 0); + mutableInt.decrement(); + return mutableInt.intValue(); + } + } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index a79fdca..fc0ec56 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -677,16 +677,16 @@ tutti.editFishingOperation.action.attachments.tip=Pièces-jointes de l'opératio tutti.editFishingOperation.action.cancelEditFishingOperation=Annuler tutti.editFishingOperation.action.cancelEditFishingOperation.mnemonic=A tutti.editFishingOperation.action.cancelEditFishingOperation.tip=Annuler la création du trait -tutti.editFishingOperation.action.chooseColumnsFile.import=Choisir le fichier de colonnes +tutti.editFishingOperation.action.chooseColumnsFile.import=Choisir le fichier de paramètres tutti.editFishingOperation.action.deleteFishingOperation.message=Vous êtes sur le point de supprimer l'opération de pêche <strong>%s</strong> tutti.editFishingOperation.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.deleteFishingOperation.title=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.editFishingOperation.tip=Éditer l'opération de pêche tutti.editFishingOperation.action.importColumns.operationNotFound=Le trait n'a pas été trouvé dans le fichier importé tutti.editFishingOperation.action.importColumns.success=Les données du fichier ont été importées dans le trait -tutti.editFishingOperation.action.importFromColumnFile=Import du fichier de colonnes +tutti.editFishingOperation.action.importFromColumnFile=Import du fichier de paramètre tutti.editFishingOperation.action.importFromColumnFile.mnemonic=c -tutti.editFishingOperation.action.importFromColumnFile.tip=Import du fichier de colonnes +tutti.editFishingOperation.action.importFromColumnFile.tip=Import du fichier de paramètres tutti.editFishingOperation.action.resetEditFishingOperation=Réinitialiser tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic=R tutti.editFishingOperation.action.resetEditFishingOperation.tip=Réinitialiser l'édition du trait @@ -696,7 +696,7 @@ tutti.editFishingOperation.action.resetFishingOperationValidState.tip=Réinitial tutti.editFishingOperation.action.saveEditFishingOperation.mnemonic=E tutti.editFishingOperation.action.saveEditFishingOperation.tip=Enregistrer le trait tutti.editFishingOperation.action.saveFishingOperation=Enregistrer -tutti.editFishingOperation.action.title.choose.importColumnsFile=Importer par fichier de colonnes +tutti.editFishingOperation.action.title.choose.importColumnsFile=Importer le fichier de paramètres tutti.editFishingOperation.askCancelEditBeforeLeaving.cancelEditFishingOperation=Le trait modifié n'est pas valide et ne peut pas être enregistré tutti.editFishingOperation.askSaveBeforeLeaving.createFishingOperation=Le trait n'a pas été créé tutti.editFishingOperation.askSaveBeforeLeaving.saveFishingOperation=Des modifications sur le trait n'ont pas été enregistrées @@ -880,7 +880,7 @@ tutti.editProtocol.action.addCaracteristicMapping.mnemonic=j tutti.editProtocol.action.addCaracteristicMapping.tip=Ajouter aux caractéristiques du trait tutti.editProtocol.action.addSpeciesProtocol.mnemonic=j tutti.editProtocol.action.addSpeciesProtocol.tip=Ajouter une espèce au protocole -tutti.editProtocol.action.chooseColumnsFile.import=Choisir le fichier contenant les colonnes +tutti.editProtocol.action.chooseColumnsFile.import=Choisir le fichier de paramètres tutti.editProtocol.action.chooseProtocolBenthosFile=Choisir le fichier des benthos tutti.editProtocol.action.chooseProtocolCaracteristicFile=Choisir le fichier des caractéristiques tutti.editProtocol.action.chooseProtocolSpeciesFile=Choisir le fichier des espèces @@ -910,9 +910,9 @@ tutti.editProtocol.action.importProtocolBenthos.tip=Importer les benthos dans le tutti.editProtocol.action.importProtocolCaracteristic=Importer les caractéristiques tutti.editProtocol.action.importProtocolCaracteristic.mnemonic=i tutti.editProtocol.action.importProtocolCaracteristic.tip=Importer les caractéristiques dans le protocole -tutti.editProtocol.action.importProtocolColumns=Importer les colonnes d'import +tutti.editProtocol.action.importProtocolColumns=Importer le fichier de paramètres tutti.editProtocol.action.importProtocolColumns.mnemonic=c -tutti.editProtocol.action.importProtocolColumns.tip=Importer les colonnes d'import +tutti.editProtocol.action.importProtocolColumns.tip=Importer le fichier de paramètres tutti.editProtocol.action.importProtocolSpecies=Importer les espèces tutti.editProtocol.action.importProtocolSpecies.mnemonic=é tutti.editProtocol.action.importProtocolSpecies.speciesInBenthos=Les espèces suivantes n'ont pas été importées car elles sont déjà présentes dans le benthos \:<ul>%s</ul> @@ -937,7 +937,7 @@ tutti.editProtocol.action.selectOtherBenthos.tip=Sélectionner une autre espèce tutti.editProtocol.action.selectOtherSpecies=... tutti.editProtocol.action.selectOtherSpecies.mnemonic=. tutti.editProtocol.action.selectOtherSpecies.tip=Sélectionner une autre espèce (dans les synonymes) -tutti.editProtocol.action.title.choose.importColumnsFile=Importer les colonnes d'import +tutti.editProtocol.action.title.choose.importColumnsFile=Importer le fichier de paramètres tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveProtocol=Le protocole n'est pas valide et ne peut pas être enregistré tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel=La catégorisation n'est pas valide et ne peut pas être enregistré tutti.editProtocol.askSaveBeforeLeaving.saveProtocol=Des modifications sur le protocole n'ont pas été enregistrées -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit b3ac98d4023cbe64baa8f4ae47d7cbed9b141d55 Author: Kevin Morin <morin@codelutin.com> Date: Wed Dec 10 09:30:38 2014 +0100 add todo --- .../fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index 53fe596..87f9359 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -221,10 +221,11 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); break; + //TODO comment on recupere les tuttilocation qui vont bien ? // case EditFishingOperationUIModel.PROPERTY_STRATA: // case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: // Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById(getDataContext().getL); -// valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); +// valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); // break; case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 34b8502bf937aab63b64aa6951cb757d6fa72607 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 11:10:25 2014 +0100 - error management - check the operation key to enable or not the import - import locations --- .../swing/action/ImportFromColumnFileAction.java | 75 ++++++++++++++++------ .../content/operation/EditFishingOperationUI.css | 1 + .../operation/EditFishingOperationUIHandler.java | 18 ++++++ .../operation/EditFishingOperationUIModel.java | 10 +++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 3 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 3 + 6 files changed, 89 insertions(+), 21 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index 87f9359..17c7b18 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -16,20 +16,26 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiCsvUtil; +import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.AbstractImportErrorInfo; import org.nuiton.csv.Import2; import org.nuiton.csv.ImportConf; import org.nuiton.csv.ImportRow; +import org.nuiton.csv.ImportRuntimeException; import org.nuiton.csv.ValueParser; import org.nuiton.csv.ValueSetter; import org.nuiton.csv.ext.CsvReaders; +import org.nuiton.util.DateUtil; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; @@ -38,6 +44,7 @@ import java.io.FileInputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -65,7 +72,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO @Override public boolean prepareAction() throws Exception { - boolean result = super.prepareAction(); + boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); if (result) { columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), @@ -86,7 +93,6 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); ImportConf conf = new ImportConf(); conf.setStrictMode(false); -// conf.setIgnoreUnknownHeader(true); Import2<FishingOperation> operationUIModelImport = Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); @@ -116,7 +122,16 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO EditFishingOperationUIModel model = getModel(); boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); - boolean sameGearShootingStartDate = Objects.equals(fishingOperation.getGearShootingStartDate(), model.getGearShootingStartDate()); + // check if the dates (not time) are equals, but push the time to the model + Date modelGearShootingStartDate = model.getGearShootingStartDate(); + if (modelGearShootingStartDate != null) { + modelGearShootingStartDate = DateUtil.getDay(modelGearShootingStartDate); + } + Date gearShootingStartDate = fishingOperation.getGearShootingStartDate(); + if (gearShootingStartDate != null) { + gearShootingStartDate = DateUtil.getDay(gearShootingStartDate); + } + boolean sameGearShootingStartDate = Objects.equals(modelGearShootingStartDate, gearShootingStartDate); return (StringUtils.isBlank(stationColumn) || sameStationNumber) && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) @@ -137,10 +152,13 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO getUI().getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); } else { - if (log.isErrorEnabled()) { - log.error(next.getErrors()); + error = ""; + for (AbstractImportErrorInfo<FishingOperation> errorInfo : next.getErrors()) { + if (log.isErrorEnabled()) { + log.error(errorInfo.getCause().getLocalizedMessage()); + } + error += "<li>" + errorInfo.getCause().getLocalizedMessage() + "</li>"; } - error = next.getErrors().toString(); } found = true; } @@ -155,7 +173,8 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO public void postSuccessAction() { super.postSuccessAction(); if (error != null) { - displayErrorMessage("error", error); + displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), + t("tutti.editFishingOperation.action.importColumns.error", error)); } else { sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); } @@ -171,12 +190,18 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO public ImportFromColumnFileModel(char separator, Set<String> headers) { super(separator); - TuttiProtocol protocol = getDataContext().getProtocol(); + PersistenceService persistenceService = getContext().getPersistenceService(); + TuttiDataContext dataContext = getDataContext(); + + TuttiProtocol protocol = dataContext.getProtocol(); Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); + String zoneId = dataContext.getProgram().getZone().getId(); + for (OperationFieldMappingRow mappingRow : operationFieldMapping) { String importColumn = mappingRow.getImportColumn(); - if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { + boolean importColumnsInHeaders = headers.remove(importColumn); + if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) { String field = mappingRow.getField(); ValueParser valueParser; @@ -207,29 +232,34 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO break; case EditFishingOperationUIModel.PROPERTY_GEAR: - List<Gear> gears = new ArrayList<>(getDataContext().getFishingGears()); - gears.addAll(getDataContext().getScientificGears()); + List<Gear> gears = new ArrayList<>(dataContext.getFishingGears()); + gears.addAll(dataContext.getScientificGears()); Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears); valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); break; case EditFishingOperationUIModel.PROPERTY_VESSEL: case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: - List<Vessel> vessels = new ArrayList<>(getDataContext().getFishingVessels()); - vessels.addAll(getDataContext().getScientificVessels()); + List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels()); + vessels.addAll(dataContext.getScientificVessels()); Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); break; - //TODO comment on recupere les tuttilocation qui vont bien ? -// case EditFishingOperationUIModel.PROPERTY_STRATA: -// case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: -// Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById(getDataContext().getL); -// valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); -// break; + case EditFishingOperationUIModel.PROPERTY_STRATA: + Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationStrata(zoneId)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, strataUniverse); + break; + + case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: + Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationSubStrata(zoneId, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); + break; case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: - Map<String, Person> personUniverse = TuttiEntities.splitById(getDataContext().getPersons()); + Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); valueParser = newForeignKeyValue(Person.class, field, personUniverse); break; @@ -238,6 +268,9 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO } newMandatoryColumn(importColumn, field, valueParser); + + } else if (!importColumnsInHeaders) { + throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); } } @@ -247,7 +280,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); - final Caracteristic caracteristic = getContext().getPersistenceService().getCaracteristic(pmfmId); + final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId); ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css index fe79d09..d5a42ed 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css @@ -87,6 +87,7 @@ JXDatePicker { i18nMnemonic: "tutti.editFishingOperation.action.importFromColumnFile.mnemonic"; _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFromColumnFileAction.class}; _help: {"tutti.editFishingOperation.action.importFromColumnFile.help"}; + enabled: {model.isImportFromColumnFileEnabled()} } #fishingOperationAttachmentsButton { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java index 3105fe4..3a2ec3c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java @@ -28,6 +28,7 @@ import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Program; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.Person; @@ -49,6 +50,7 @@ import fr.ifremer.tutti.util.Distances; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -70,6 +72,7 @@ import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; @@ -308,6 +311,21 @@ public class EditFishingOperationUIHandler extends AbstractTuttiTabContainerUIHa } }); + // enable or not the import from column file + if (getDataContext().isProtocolFilled()) { + Collection<OperationFieldMappingRow> operationFieldMapping = getDataContext().getProtocol().getOperationFieldMapping(); + for (OperationFieldMappingRow row : operationFieldMapping) { + if ((EditFishingOperationUIModel.PROPERTY_STATION_NUMBER.equals(row.getField()) + || EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_NUMBER.equals(row.getField()) + || EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE.equals(row.getField())) + && StringUtils.isNotBlank(row.getImportColumn())) { + + model.setImportFromColumnFileEnabled(true); + break; + } + } + } + ui.setContextValue(model); fishingOperationMonitor.setBean(model); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java index 4f8adac..477c76a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java @@ -256,6 +256,8 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin protected SecondaryVesselTypeEnum secondaryVesselType; + protected boolean importFromColumnFileEnabled; + protected static Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); @@ -1462,4 +1464,12 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin public boolean containsAllRecorderPerson(Collection<Person> recorderPerson) { return false; } + + public boolean isImportFromColumnFileEnabled() { + return importFromColumnFileEnabled; + } + + public void setImportFromColumnFileEnabled(boolean importFromColumnFileEnabled) { + this.importFromColumnFileEnabled = importFromColumnFileEnabled; + } } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 785ecc6..c807422 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -700,6 +700,9 @@ tutti.editFishingOperation.action.deleteFishingOperation.message= tutti.editFishingOperation.action.deleteFishingOperation.tip= tutti.editFishingOperation.action.deleteFishingOperation.title= tutti.editFishingOperation.action.editFishingOperation.tip= +tutti.editFishingOperation.action.importColumns.error= +tutti.editFishingOperation.action.importColumns.error.title= +tutti.editFishingOperation.action.importColumns.missingHeader= tutti.editFishingOperation.action.importColumns.operationNotFound= tutti.editFishingOperation.action.importColumns.success= tutti.editFishingOperation.action.importFromColumnFile= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index fc0ec56..9e5aafc 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -682,6 +682,9 @@ tutti.editFishingOperation.action.deleteFishingOperation.message=Vous êtes sur tutti.editFishingOperation.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.deleteFishingOperation.title=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.editFishingOperation.tip=Éditer l'opération de pêche +tutti.editFishingOperation.action.importColumns.error=<html><body>L'import des paramètres a échoué pour les raisons suivantes \:<ul>%s</ul></body></html> +tutti.editFishingOperation.action.importColumns.error.title=Erreur lors de l'import des paramètres +tutti.editFishingOperation.action.importColumns.missingHeader=Le fichier de paramètre ne contient pas la colonne '%s'. tutti.editFishingOperation.action.importColumns.operationNotFound=Le trait n'a pas été trouvé dans le fichier importé tutti.editFishingOperation.action.importColumns.success=Les données du fichier ont été importées dans le trait tutti.editFishingOperation.action.importFromColumnFile=Import du fichier de paramètre -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 8cb32da105caf5bc9ff8117404e4e1995ae6b536 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 12:09:26 2014 +0100 fix import of lists --- .../fr/ifremer/tutti/service/TuttiCsvUtil.java | 70 ++++++++++++++++++++++ .../swing/action/ImportFromColumnFileAction.java | 40 +++++++++---- .../operation/EditFishingOperationUIModel.java | 3 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 2 +- 4 files changed, 104 insertions(+), 11 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java index 919db0d..3206ce0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java @@ -57,6 +57,7 @@ import java.io.Serializable; import java.io.Writer; import java.lang.reflect.InvocationTargetException; import java.text.ParseException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -278,6 +279,18 @@ public class TuttiCsvUtil extends Common { return new ForeignKeyValue<E>(type, propertyName, universe); } + public <E extends TuttiEntity> void newForeignKeyListColumn(String headerName, String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(headerName, propertyName, newForeignKeyListValue(entityType, foreignKeyName, universe)); + } + + public <E extends TuttiEntity> void newForeignKeyListColumn(String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(propertyName, propertyName, newForeignKeyListValue(entityType, foreignKeyName, universe)); + } + + public <E extends TuttiEntity> ForeignKeyListValue<E> newForeignKeyListValue(Class<E> type, String propertyName, Map<String, E> universe) { + return new ForeignKeyListValue<E>(type, propertyName, universe); + } + public void newNotExistingValueColumn(String propertyName, Set<String> universe) { newNotExistingValueColumn(propertyName, propertyName, universe); } @@ -479,6 +492,63 @@ public class TuttiCsvUtil extends Common { } } + /** + * @param <E> + * @author kmorin <morin@codelutin.com> + * @since 3.10 + */ + public static class ForeignKeyListValue<E extends TuttiEntity> implements ValueParserFormatter<List<E>> { + + public static final String LIST_SEPARATOR = ","; + + protected final String propertyName; + + protected final Class<E> entityType; + + protected final Map<String, E> universe; + + public ForeignKeyListValue(Class<E> entityType, + String propertyName, + Map<String, E> universe) { + this.entityType = entityType; + this.propertyName = propertyName; + this.universe = universe; + } + + @Override + public List<E> parse(String value) throws ParseException { + List<E> result = new ArrayList<E>(); + if (StringUtils.isNotBlank(value)) { + + String[] ids = value.split(LIST_SEPARATOR); + for (String id : ids) { + // get entity from universe + E entity = universe.get(id); + + if (entity == null) { + + // can not find entity this is a big problem for us... + throw new ImportRuntimeException(t("tutti.service.csv.parse.entityNotFound", entityType.getSimpleName(), propertyName, id)); + } + + result.add(entity); + } + } + return result; + } + + @Override + public String format(List<E> e) { + List<String> ids = new ArrayList<String>(); + for (E entity : e) { + if (entity != null) { + ids.add(entity.getId()); + } + } + return StringUtils.join(ids, LIST_SEPARATOR); + } + } + public static class BeanNullableGetter<E, T> implements ValueGetter<E, T> { protected String propertyName; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index 17c7b18..4a84e47 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -88,6 +88,8 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO @Override public void doAction() throws Exception { + final EditFishingOperationUIModel model = getModel(); + Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); @@ -106,7 +108,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO } }); - // predicate to check if the row matches the model key defined by the protocol + // predicate to check if the row matches the model key defined by the protocol< Predicate<FishingOperation> predicate = new Predicate<FishingOperation>() { @Override public boolean apply(FishingOperation fishingOperation) { @@ -119,7 +121,6 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; - EditFishingOperationUIModel model = getModel(); boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); // check if the dates (not time) are equals, but push the time to the model @@ -147,9 +148,14 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO if (predicate.apply(fishingOperation)) { if (next.isValid()) { - getModel().fromEntity(fishingOperation); - getUI().getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - getUI().getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); + EditFishingOperationUI ui = getUI(); + model.fromEntity(fishingOperation); + //these 2 do not refresh correctly + ui.getRecorderPersonList().getHandler().setSelected(model.getRecorderPerson()); + ui.getSecondaryVesselList().getHandler().setSelected(model.getSecondaryVessel()); + + ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); + ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); } else { error = ""; @@ -157,7 +163,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO if (log.isErrorEnabled()) { log.error(errorInfo.getCause().getLocalizedMessage()); } - error += "<li>" + errorInfo.getCause().getLocalizedMessage() + "</li>"; + error += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; } } found = true; @@ -165,7 +171,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO } if (!found) { - error = t("tutti.editFishingOperation.action.importColumns.operationNotFound"); + error = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; } } @@ -174,7 +180,9 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO super.postSuccessAction(); if (error != null) { displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), - t("tutti.editFishingOperation.action.importColumns.error", error)); + "<html><body>" + + t("tutti.editFishingOperation.action.importColumns.error", error) + + "</body></html>"); } else { sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); } @@ -239,13 +247,19 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO break; case EditFishingOperationUIModel.PROPERTY_VESSEL: - case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels()); vessels.addAll(dataContext.getScientificVessels()); Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); break; + case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: + vessels = new ArrayList<>(dataContext.getFishingVessels()); + vessels.addAll(dataContext.getScientificVessels()); + vesselUniverse = TuttiEntities.splitById(vessels); + valueParser = newForeignKeyListValue(Vessel.class, field, vesselUniverse); + break; + case EditFishingOperationUIModel.PROPERTY_STRATA: Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( persistenceService.getAllFishingOperationStrata(zoneId)); @@ -258,9 +272,15 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); break; + case EditFishingOperationUIModel.PROPERTY_LOCATION: + Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationLocation(zoneId, null, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); + break; + case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); - valueParser = newForeignKeyValue(Person.class, field, personUniverse); + valueParser = newForeignKeyListValue(Person.class, field, personUniverse); break; default: diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java index 477c76a..b0911d2 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java @@ -1236,6 +1236,7 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin @Override public void setRecorderPerson(List<Person> recorderPerson) { + System.out.println("rec " + recorderPerson); Object oldValue = null; List<Person> oldRecorderPerson = getRecorderPerson(); if (oldRecorderPerson != null) { @@ -1302,6 +1303,7 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin @Override public void addSecondaryVessel(Vessel secondaryVessel) { editObject.addSecondaryVessel(secondaryVessel); + System.out.println("sec vessel " + secondaryVessel.getId()); firePropertyChange(PROPERTY_SECONDARY_VESSEL, null, getSecondaryVessel()); } @@ -1342,6 +1344,7 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin @Override public void setSecondaryVessel(List<Vessel> secondaryVessel) { + System.out.println("sec vessels " + secondaryVessel); editObject.setSecondaryVessel(secondaryVessel); firePropertyChange(PROPERTY_SECONDARY_VESSEL, null, getSecondaryVessel()); } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 9e5aafc..09b59bf 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -682,7 +682,7 @@ tutti.editFishingOperation.action.deleteFishingOperation.message=Vous êtes sur tutti.editFishingOperation.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.deleteFishingOperation.title=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.editFishingOperation.tip=Éditer l'opération de pêche -tutti.editFishingOperation.action.importColumns.error=<html><body>L'import des paramètres a échoué pour les raisons suivantes \:<ul>%s</ul></body></html> +tutti.editFishingOperation.action.importColumns.error=L'import des paramètres a échoué pour les raisons suivantes \:<ul>%s</ul> tutti.editFishingOperation.action.importColumns.error.title=Erreur lors de l'import des paramètres tutti.editFishingOperation.action.importColumns.missingHeader=Le fichier de paramètre ne contient pas la colonne '%s'. tutti.editFishingOperation.action.importColumns.operationNotFound=Le trait n'a pas été trouvé dans le fichier importé -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit a899157b71c88fedf2bce5904e4b69beb03c7e71 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:49:30 2014 +0100 ajout javadoc + nettoyage imports --- .../tutti/persistence/entities/protocol/v2/TuttiProtocol2.java | 4 ++++ .../tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java index a67f592..df7322c 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocol2.java @@ -8,6 +8,10 @@ import javax.annotation.Generated; import java.util.Collection; import java.util.List; +/** + * @author kmorin - morin@codelutin.com + * @since 3.9 + */ @Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Mon Nov 24 12:54:48 CET 2014") public interface TuttiProtocol2 extends CommentAware, TuttiEntity { diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java index 0405b21..76ac378 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/v2/TuttiProtocolBean2.java @@ -1,9 +1,7 @@ package fr.ifremer.tutti.persistence.entities.protocol.v2; import fr.ifremer.tutti.persistence.entities.TuttiEntityBean; -import fr.ifremer.tutti.persistence.entities.protocol.AbstractTuttiProtocolBean; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import javax.annotation.Generated; import java.util.Collection; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 45aacd562efa18241aba5280b93d851112a67dbb Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:11 2014 +0100 ajout service d'import des caractéristicques d'un trait --- .../FishingOperationImportService.java | 167 ++++++++++++++++ ...olumnFileFishingOperationNotFoundException.java | 15 ++ .../ImportFromColumnFileInvalidRowException.java | 29 +++ .../operationimport/ImportFromColumnFileModel.java | 213 +++++++++++++++++++++ 4 files changed, 424 insertions(+) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java new file mode 100644 index 0000000..89709e4 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java @@ -0,0 +1,167 @@ +package fr.ifremer.tutti.service.operationimport; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiDataContext; +import fr.ifremer.tutti.service.TuttiServiceContext; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.csv.AbstractImportErrorInfo; +import org.nuiton.csv.Import2; +import org.nuiton.csv.ImportConf; +import org.nuiton.csv.ImportRow; +import org.nuiton.csv.ext.CsvReaders; +import org.nuiton.jaxx.application.ApplicationTechnicalException; +import org.nuiton.util.DateUtil; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.Date; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class FishingOperationImportService extends AbstractTuttiService { + + protected PersistenceService persistenceService; + + private TuttiDataContext dataContext; + + @Override + public void setServiceContext(TuttiServiceContext context) { + super.setServiceContext(context); + persistenceService = getService(PersistenceService.class); + dataContext = context.getDataContext(); + } + + public void importCaracteristicsFromColumnFile(File columnsFile, FishingOperation fishingoperation) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + + // Get import file headers + Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); + + // Create import model + ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers), persistenceService, dataContext, fishingoperation); + ImportConf conf = new ImportConf(); + conf.setStrictMode(false); + + // Create matching row predicate + MatchingFishingOperationNaturalIdPredicate matchingRowPredicate = new MatchingFishingOperationNaturalIdPredicate( + fishingoperation.getStationNumber(), + fishingoperation.getFishingOperationNumber(), + fishingoperation.getGearShootingStartDate(), + dataContext.getProtocol()); + + try (Import2<FishingOperation> operationUIModelImport = Import2.newImport(conf, importModel, new FileInputStream(columnsFile))) { + + doImport(operationUIModelImport, matchingRowPredicate); + + } catch (FileNotFoundException e) { + throw new ApplicationTechnicalException("Could not find import file " + columnsFile); + } + + } + + protected void doImport(Import2<FishingOperation> operationUIModelImport, + MatchingFishingOperationNaturalIdPredicate matchingRowPredicate) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + + + boolean found = false; + for (ImportRow<FishingOperation> next : operationUIModelImport) { + + FishingOperation fishingOperation = next.getBean(); + + if (matchingRowPredicate.apply(fishingOperation)) { + if (!next.isValid()) { + + Set<AbstractImportErrorInfo<FishingOperation>> errors = next.getErrors(); + throw new ImportFromColumnFileInvalidRowException(errors); + + } + + // valid row was found + // can quit right now the import + found = true; + + break; + } + + } + + if (!found) { + throw new ImportFromColumnFileFishingOperationNotFoundException(); + } + + } + + protected static class MatchingFishingOperationNaturalIdPredicate implements Predicate<FishingOperation> { + + protected final String stationNumber; + + protected final Integer fishingOperationNumber; + + protected final Date modelGearShootingStartOnlyDate; + + protected final Map<String, OperationFieldMappingRow> mappingRowsByField; + + MatchingFishingOperationNaturalIdPredicate(String stationNumber, + Integer fishingOperationNumber, + Date modelGearShootingStartDate, + TuttiProtocol protocol) { + this.stationNumber = stationNumber; + this.fishingOperationNumber = fishingOperationNumber; + + if (modelGearShootingStartDate != null) { + this.modelGearShootingStartOnlyDate = DateUtil.getDay(modelGearShootingStartDate); + } else { + this.modelGearShootingStartOnlyDate = null; + } + + this.mappingRowsByField = Maps.uniqueIndex(protocol.getOperationFieldMapping(), new Function<OperationFieldMappingRow, String>() { + @Override + public String apply(OperationFieldMappingRow operationFieldMappingRow) { + return operationFieldMappingRow.getField(); + } + }); + } + + @Override + public boolean apply(FishingOperation fishingOperation) { + + OperationFieldMappingRow operationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); + OperationFieldMappingRow stationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER); + OperationFieldMappingRow startDateRow = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); + + String operationNumberColumn = operationNumberRow != null ? operationNumberRow.getImportColumn() : null; + String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; + String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; + + boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), stationNumber); + boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), fishingOperationNumber); + // check if the dates (not time) are equals, but push the time to the model + Date gearShootingStartDate = fishingOperation.getGearShootingStartDate(); + if (gearShootingStartDate != null) { + gearShootingStartDate = DateUtil.getDay(gearShootingStartDate); + } + boolean sameGearShootingStartDate = Objects.equals(modelGearShootingStartOnlyDate, gearShootingStartDate); + + return (StringUtils.isBlank(stationColumn) || sameStationNumber) + && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) + && (StringUtils.isBlank(startDateColumn) || sameGearShootingStartDate); + } + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java new file mode 100644 index 0000000..66cb57e --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileFishingOperationNotFoundException.java @@ -0,0 +1,15 @@ +package fr.ifremer.tutti.service.operationimport; + +/** + * When no matching fishing operation was found in from column file import file. + * + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileFishingOperationNotFoundException extends Exception { + + private static final long serialVersionUID = 1L; + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java new file mode 100644 index 0000000..03771fe --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileInvalidRowException.java @@ -0,0 +1,29 @@ +package fr.ifremer.tutti.service.operationimport; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import org.nuiton.csv.AbstractImportErrorInfo; + +import java.util.Set; + +/** + * When the row to match in fishing operation import from column file is not valid. + * + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileInvalidRowException extends Exception { + + private static final long serialVersionUID = 1L; + + private final Set<AbstractImportErrorInfo<FishingOperation>> errors; + + public ImportFromColumnFileInvalidRowException(Set<AbstractImportErrorInfo<FishingOperation>> errors) { + this.errors = errors; + } + + public Set<AbstractImportErrorInfo<FishingOperation>> getErrors() { + return errors; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java new file mode 100644 index 0000000..fdfb2ed --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java @@ -0,0 +1,213 @@ +package fr.ifremer.tutti.service.operationimport; + +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; +import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiCsvUtil; +import fr.ifremer.tutti.service.TuttiDataContext; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.csv.ValueParser; +import org.nuiton.csv.ValueSetter; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 12/11/14. + * + * @author Kevin Morin - morin@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { + + private final FishingOperation fishingOperation; + + public ImportFromColumnFileModel(char separator, Set<String> headers, + PersistenceService persistenceService, + TuttiDataContext dataContext, + FishingOperation fishingOperation) { + super(separator); + this.fishingOperation = fishingOperation; + + TuttiProtocol protocol = dataContext.getProtocol(); + Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); + + String zoneId = dataContext.getProgram().getZone().getId(); + + for (OperationFieldMappingRow mappingRow : operationFieldMapping) { + String importColumn = mappingRow.getImportColumn(); + boolean importColumnsInHeaders = headers.remove(importColumn); + if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) { + + String field = mappingRow.getField(); + ValueParser valueParser; + switch (field) { + case FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER: + valueParser = TuttiCsvUtil.INTEGER; + break; + + case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE: + case FishingOperation.PROPERTY_TRAWL_DISTANCE: + valueParser = TuttiCsvUtil.FLOAT; + break; + + case FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE: + case FishingOperation.PROPERTY_GEAR_SHOOTING_END_DATE: + valueParser = TuttiCsvUtil.DAY_TIME; + break; + + case FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE: + valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; + break; + + case FishingOperation.PROPERTY_FISHING_OPERATION_VALID: + valueParser = TuttiCsvUtil.BOOLEAN; + break; + + case FishingOperation.PROPERTY_GEAR: + List<Gear> gears = new ArrayList<>(dataContext.getFishingGears()); + gears.addAll(dataContext.getScientificGears()); + Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears); + valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); + break; + + case FishingOperation.PROPERTY_VESSEL: + List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels()); + vessels.addAll(dataContext.getScientificVessels()); + Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); + valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); + break; + + case FishingOperation.PROPERTY_SECONDARY_VESSEL: + vessels = new ArrayList<>(dataContext.getFishingVessels()); + vessels.addAll(dataContext.getScientificVessels()); + vesselUniverse = TuttiEntities.splitById(vessels); + valueParser = newForeignKeyListValue(Vessel.class, field, vesselUniverse); + break; + + case FishingOperation.PROPERTY_STRATA: + Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationStrata(zoneId)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, strataUniverse); + break; + + case FishingOperation.PROPERTY_SUB_STRATA: + Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationSubStrata(zoneId, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); + break; + + case FishingOperation.PROPERTY_LOCATION: + Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationLocation(zoneId, null, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); + break; + + case FishingOperation.PROPERTY_RECORDER_PERSON: + Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); + valueParser = newForeignKeyListValue(Person.class, field, personUniverse); + break; + + default: + valueParser = TuttiCsvUtil.STRING; + + } + newMandatoryColumn(importColumn, field, valueParser); + + } else if (!importColumnsInHeaders) { + throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); + } + } + + Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping(); + for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) { + String importColumn = mappingRow.getImportColumn(); + if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { + + int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); + final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId); + + ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { + @Override + public void set(FishingOperation fishingOperation, String value) throws Exception { + + Serializable realValue = null; + if (StringUtils.isNotBlank(value)) { + switch (caracteristic.getCaracteristicType()) { + case QUALITATIVE: + for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) { + if (value.equals(cqv.getId())) { + realValue = cqv; + break; + } + } + break; + + case NUMBER: + realValue = Float.parseFloat(value); + break; + + default: + realValue = value; + } + } + + CaracteristicMap caracteristicMap; + if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) { + caracteristicMap = fishingOperation.getGearUseFeatures(); + if (caracteristicMap == null) { + caracteristicMap = new CaracteristicMap(); + fishingOperation.setGearUseFeatures(caracteristicMap); + } + + } else { + caracteristicMap = fishingOperation.getVesselUseFeatures(); + if (caracteristicMap == null) { + caracteristicMap = new CaracteristicMap(); + fishingOperation.setVesselUseFeatures(caracteristicMap); + } + } + caracteristicMap.put(caracteristic, realValue); + + } + }; + newMandatoryColumn(importColumn, setter); + + } + } + + + for (String header : headers) { + newIgnoredColumn(header); + } + } + + @Override + public FishingOperation newEmptyInstance() { +// FishingOperation fishingOperation = FishingOperations.newFishingOperation(); +// EditFishingOperationUIModel model = getModel(); +// toBeanBinder.copy(model, fishingOperation); + return fishingOperation; + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 51e78a270fc20df29a75fd8a7f2a52c026b9661a Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:44 2014 +0100 renommage de l'action d'import de caracteristiques d'un trait + utilisation du service dédié --- .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 5 + ...perationCaracteristicsFromColumnFileAction.java | 138 ++++++++ .../swing/action/ImportFromColumnFileAction.java | 367 --------------------- .../content/operation/EditFishingOperationUI.css | 2 +- 4 files changed, 144 insertions(+), 368 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java index 01b117f..cce58d1 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java @@ -42,6 +42,7 @@ import fr.ifremer.tutti.service.catches.multipost.MultiPostImportService; import fr.ifremer.tutti.service.export.generic.TuttiExportService; import fr.ifremer.tutti.service.export.pdf.CatchesPdfExportService; import fr.ifremer.tutti.service.export.sumatra.CatchesSumatraExportService; +import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; import fr.ifremer.tutti.service.psionimport.PsionImportService; import fr.ifremer.tutti.service.pupitri.PupitriExportService; @@ -736,6 +737,10 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage return serviceContext.getService(MultiPostExportService.class); } + public FishingOperationImportService getFishingOperationImportService() { + return serviceContext.getService(FishingOperationImportService.class); + } + public ReportService getReportService() { return serviceContext.getService(ReportService.class); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java new file mode 100644 index 0000000..c3382d2 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java @@ -0,0 +1,138 @@ +package fr.ifremer.tutti.ui.swing.action; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileFishingOperationNotFoundException; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileInvalidRowException; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.AbstractImportErrorInfo; +import org.nuiton.jaxx.application.ApplicationBusinessException; + +import java.io.File; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class ImportFishingOperationCaracteristicsFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { + + private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); + + /** + * File to import. + */ + protected File columnsFile; + + /** + * Result fishing operation after import to merge back to ui model. + */ + protected FishingOperation fishingOperationToMerge; + + public ImportFishingOperationCaracteristicsFromColumnFileAction(EditFishingOperationUIHandler handler) { + super(handler, true); + } + + @Override + public boolean prepareAction() throws Exception { + boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); + + if (result) { + columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), + t("tutti.editFishingOperation.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); + + result = columnsFile != null; + } + + return result; + } + + @Override + public void doAction() throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + + EditFishingOperationUIModel model = getModel(); + + // Create a copy of the ui model to use in the import + // this bean will be merged back after import into ui model + fishingOperationToMerge = model.toEntity(); + + //FIXME Check we don't need this ? +// fishingOperationToMerge = FishingOperations.newFishingOperation(); +// Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); +// toBeanBinder.copy(model, fishingOperationToMerge); + + FishingOperationImportService fishingOperationImportService = getContext().getFishingOperationImportService(); + + fishingOperationImportService.importCaracteristicsFromColumnFile(columnsFile, fishingOperationToMerge); + + } + + @Override + public void postSuccessAction() { + + super.postSuccessAction(); + + // Merge result to ui model + EditFishingOperationUI ui = getUI(); + EditFishingOperationUIModel model = getModel(); + + model.fromEntity(fishingOperationToMerge); + + //FIXME Find out why ? + //these 2 do not refresh correctly + ui.getRecorderPersonList().getHandler().setSelected(fishingOperationToMerge.getRecorderPerson()); + ui.getSecondaryVesselList().getHandler().setSelected(fishingOperationToMerge.getSecondaryVessel()); + + ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperationToMerge); + ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperationToMerge); + + sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + + } + + @Override + public void postFailedAction(Throwable error) { + + String errorMessage = null; + if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { + + // no matching fishing operation + errorMessage = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; + + } + + if (error instanceof ImportFromColumnFileInvalidRowException) { + + // matching row is not valid + ImportFromColumnFileInvalidRowException importFromColumnFileInvalidRowException = (ImportFromColumnFileInvalidRowException) error; + + errorMessage = ""; + for (AbstractImportErrorInfo<FishingOperation> errorInfo : importFromColumnFileInvalidRowException.getErrors()) { + if (log.isErrorEnabled()) { + log.error(errorInfo.getCause().getLocalizedMessage()); + } + errorMessage += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; + } + + } + + //TODO Check this is ok, otherwise use below code + throw new ApplicationBusinessException(t("tutti.editFishingOperation.action.importColumns.error", errorMessage)); + +// if (errorMessage != null) { +// +// displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), +// "<html><body>" + +// t("tutti.editFishingOperation.action.importColumns.error", errorMessage) +// + "</body></html>"); +// +// } + + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java deleted file mode 100644 index 4a84e47..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ /dev/null @@ -1,367 +0,0 @@ -package fr.ifremer.tutti.ui.swing.action; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.FishingOperations; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; -import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; -import fr.ifremer.tutti.persistence.entities.referential.Gear; -import fr.ifremer.tutti.persistence.entities.referential.Person; -import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; -import fr.ifremer.tutti.persistence.entities.referential.Vessel; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.TuttiCsvUtil; -import fr.ifremer.tutti.service.TuttiDataContext; -import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; -import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; -import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.csv.AbstractImportErrorInfo; -import org.nuiton.csv.Import2; -import org.nuiton.csv.ImportConf; -import org.nuiton.csv.ImportRow; -import org.nuiton.csv.ImportRuntimeException; -import org.nuiton.csv.ValueParser; -import org.nuiton.csv.ValueSetter; -import org.nuiton.csv.ext.CsvReaders; -import org.nuiton.util.DateUtil; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.io.File; -import java.io.FileInputStream; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -import static org.nuiton.i18n.I18n.t; - -/** - * @author Kevin Morin (Code Lutin) - * @since 3.10 - */ -public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { - - private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); - - protected File columnsFile; - - protected String error; - - public ImportFromColumnFileAction(EditFishingOperationUIHandler handler) { - super(handler, true); - } - - @Override - public boolean prepareAction() throws Exception { - boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); - - if (result) { - columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), - t("tutti.editFishingOperation.action.chooseColumnsFile.import"), - "^.*\\.csv", t("tutti.common.file.csv")); - - result = columnsFile != null; - } - - return result; - } - - @Override - public void doAction() throws Exception { - - final EditFishingOperationUIModel model = getModel(); - - Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); - - ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); - ImportConf conf = new ImportConf(); - conf.setStrictMode(false); - - Import2<FishingOperation> operationUIModelImport = - Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); - - TuttiProtocol protocol = getDataContext().getProtocol(); - final Map<String, OperationFieldMappingRow> mappingRowsByField = - Maps.uniqueIndex(protocol.getOperationFieldMapping(), new Function<OperationFieldMappingRow, String>() { - @Override - public String apply(OperationFieldMappingRow operationFieldMappingRow) { - return operationFieldMappingRow.getField(); - } - }); - - // predicate to check if the row matches the model key defined by the protocol< - Predicate<FishingOperation> predicate = new Predicate<FishingOperation>() { - @Override - public boolean apply(FishingOperation fishingOperation) { - - OperationFieldMappingRow operationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); - OperationFieldMappingRow stationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER); - OperationFieldMappingRow startDateRow = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); - - String operationNumberColumn = operationNumberRow != null ? operationNumberRow.getImportColumn() : null; - String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; - String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; - - boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); - boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); - // check if the dates (not time) are equals, but push the time to the model - Date modelGearShootingStartDate = model.getGearShootingStartDate(); - if (modelGearShootingStartDate != null) { - modelGearShootingStartDate = DateUtil.getDay(modelGearShootingStartDate); - } - Date gearShootingStartDate = fishingOperation.getGearShootingStartDate(); - if (gearShootingStartDate != null) { - gearShootingStartDate = DateUtil.getDay(gearShootingStartDate); - } - boolean sameGearShootingStartDate = Objects.equals(modelGearShootingStartDate, gearShootingStartDate); - - return (StringUtils.isBlank(stationColumn) || sameStationNumber) - && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) - && (StringUtils.isBlank(startDateColumn) || sameGearShootingStartDate); - } - }; - - boolean found = false; - Iterator<ImportRow<FishingOperation>> iterator = operationUIModelImport.iterator(); - while (!found && iterator.hasNext()) { - ImportRow<FishingOperation> next = iterator.next(); - FishingOperation fishingOperation = next.getBean(); - - if (predicate.apply(fishingOperation)) { - if (next.isValid()) { - EditFishingOperationUI ui = getUI(); - model.fromEntity(fishingOperation); - //these 2 do not refresh correctly - ui.getRecorderPersonList().getHandler().setSelected(model.getRecorderPerson()); - ui.getSecondaryVesselList().getHandler().setSelected(model.getSecondaryVessel()); - - ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - - } else { - error = ""; - for (AbstractImportErrorInfo<FishingOperation> errorInfo : next.getErrors()) { - if (log.isErrorEnabled()) { - log.error(errorInfo.getCause().getLocalizedMessage()); - } - error += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; - } - } - found = true; - } - } - - if (!found) { - error = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; - } - } - - @Override - public void postSuccessAction() { - super.postSuccessAction(); - if (error != null) { - displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), - "<html><body>" + - t("tutti.editFishingOperation.action.importColumns.error", error) - + "</body></html>"); - } else { - sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); - } - error = null; - } - - protected class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { - - protected Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = - BinderFactory.newBinder(EditFishingOperationUIModel.class, - FishingOperation.class); - - public ImportFromColumnFileModel(char separator, Set<String> headers) { - super(separator); - - PersistenceService persistenceService = getContext().getPersistenceService(); - TuttiDataContext dataContext = getDataContext(); - - TuttiProtocol protocol = dataContext.getProtocol(); - Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); - - String zoneId = dataContext.getProgram().getZone().getId(); - - for (OperationFieldMappingRow mappingRow : operationFieldMapping) { - String importColumn = mappingRow.getImportColumn(); - boolean importColumnsInHeaders = headers.remove(importColumn); - if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) { - - String field = mappingRow.getField(); - ValueParser valueParser; - switch (field) { - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_NUMBER: - valueParser = TuttiCsvUtil.INTEGER; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE: - case EditFishingOperationUIModel.PROPERTY_TRAWL_DISTANCE: - valueParser = TuttiCsvUtil.FLOAT; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_DATE: - valueParser = TuttiCsvUtil.DAY_TIME; - break; - - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE: - valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; - break; - - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: - valueParser = TuttiCsvUtil.BOOLEAN; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR: - List<Gear> gears = new ArrayList<>(dataContext.getFishingGears()); - gears.addAll(dataContext.getScientificGears()); - Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears); - valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_VESSEL: - List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels()); - vessels.addAll(dataContext.getScientificVessels()); - Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); - valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: - vessels = new ArrayList<>(dataContext.getFishingVessels()); - vessels.addAll(dataContext.getScientificVessels()); - vesselUniverse = TuttiEntities.splitById(vessels); - valueParser = newForeignKeyListValue(Vessel.class, field, vesselUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_STRATA: - Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( - persistenceService.getAllFishingOperationStrata(zoneId)); - valueParser = newForeignKeyValue(TuttiLocation.class, field, strataUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: - Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById( - persistenceService.getAllFishingOperationSubStrata(zoneId, null)); - valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_LOCATION: - Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById( - persistenceService.getAllFishingOperationLocation(zoneId, null, null)); - valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: - Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); - valueParser = newForeignKeyListValue(Person.class, field, personUniverse); - break; - - default: - valueParser = TuttiCsvUtil.STRING; - - } - newMandatoryColumn(importColumn, field, valueParser); - - } else if (!importColumnsInHeaders) { - throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); - } - } - - Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping(); - for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) { - String importColumn = mappingRow.getImportColumn(); - if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { - - int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); - final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId); - - ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { - @Override - public void set(FishingOperation fishingOperation, String value) throws Exception { - - Serializable realValue = null; - if (StringUtils.isNotBlank(value)) { - switch (caracteristic.getCaracteristicType()) { - case QUALITATIVE: - for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) { - if (value.equals(cqv.getId())) { - realValue = cqv; - break; - } - } - break; - - case NUMBER: - realValue = Float.parseFloat(value); - break; - - default: - realValue = value; - } - } - - CaracteristicMap caracteristicMap; - if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) { - caracteristicMap = fishingOperation.getGearUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - fishingOperation.setGearUseFeatures(caracteristicMap); - } - - } else { - caracteristicMap = fishingOperation.getVesselUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - fishingOperation.setVesselUseFeatures(caracteristicMap); - } - } - caracteristicMap.put(caracteristic, realValue); - - } - }; - newMandatoryColumn(importColumn, setter); - - } - } - - - for (String header : headers) { - newIgnoredColumn(header); - } - } - - @Override - public FishingOperation newEmptyInstance() { - FishingOperation fishingOperation = FishingOperations.newFishingOperation(); - toBeanBinder.copy(getModel(), fishingOperation); - return fishingOperation; - } - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css index d5a42ed..dede964 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css @@ -85,7 +85,7 @@ JXDatePicker { text: "tutti.editFishingOperation.action.importFromColumnFile"; toolTipText: "tutti.editFishingOperation.action.importFromColumnFile.tip"; i18nMnemonic: "tutti.editFishingOperation.action.importFromColumnFile.mnemonic"; - _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFromColumnFileAction.class}; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFishingOperationCaracteristicsFromColumnFileAction.class}; _help: {"tutti.editFishingOperation.action.importFromColumnFile.help"}; enabled: {model.isImportFromColumnFileEnabled()} } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit e62c69c78d2b2f1a46220eebec34a75b64bcb9d5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:58:19 2014 +0100 utilisation d'une exception si colonne non trouvee dans le header --- .../FishingOperationImportService.java | 2 +- ...ImportFromColumnFileMissingHeaderException.java | 24 +++++++++++++++++ .../operationimport/ImportFromColumnFileModel.java | 7 ++--- ...perationCaracteristicsFromColumnFileAction.java | 30 ++++++++++++---------- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java index 89709e4..a68cbb2 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/FishingOperationImportService.java @@ -48,7 +48,7 @@ public class FishingOperationImportService extends AbstractTuttiService { dataContext = context.getDataContext(); } - public void importCaracteristicsFromColumnFile(File columnsFile, FishingOperation fishingoperation) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + public void importCaracteristicsFromColumnFile(File columnsFile, FishingOperation fishingoperation) throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException, ImportFromColumnFileMissingHeaderException { // Get import file headers Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java new file mode 100644 index 0000000..21702e2 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileMissingHeaderException.java @@ -0,0 +1,24 @@ +package fr.ifremer.tutti.service.operationimport; + +/** + * when a column header is missing in the import file. + * + * Created on 12/11/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class ImportFromColumnFileMissingHeaderException extends Exception { + + private static final long serialVersionUID = 1L; + + private final String importColumn; + + public ImportFromColumnFileMissingHeaderException(String importColumn) { + this.importColumn = importColumn; + } + + public String getImportColumn() { + return importColumn; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java index fdfb2ed..742a381 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/operationimport/ImportFromColumnFileModel.java @@ -17,7 +17,6 @@ import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiCsvUtil; import fr.ifremer.tutti.service.TuttiDataContext; import org.apache.commons.lang3.StringUtils; -import org.nuiton.csv.ImportRuntimeException; import org.nuiton.csv.ValueParser; import org.nuiton.csv.ValueSetter; @@ -28,8 +27,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static org.nuiton.i18n.I18n.t; - /** * Created on 12/11/14. * @@ -43,7 +40,7 @@ public class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportM public ImportFromColumnFileModel(char separator, Set<String> headers, PersistenceService persistenceService, TuttiDataContext dataContext, - FishingOperation fishingOperation) { + FishingOperation fishingOperation) throws ImportFromColumnFileMissingHeaderException { super(separator); this.fishingOperation = fishingOperation; @@ -136,7 +133,7 @@ public class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportM newMandatoryColumn(importColumn, field, valueParser); } else if (!importColumnsInHeaders) { - throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); + throw new ImportFromColumnFileMissingHeaderException(importColumn); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java index c3382d2..b1eadc7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java @@ -4,6 +4,7 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileFishingOperationNotFoundException; import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileInvalidRowException; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileMissingHeaderException; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; @@ -27,7 +28,7 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab /** * File to import. */ - protected File columnsFile; + protected File importFile; /** * Result fishing operation after import to merge back to ui model. @@ -43,18 +44,18 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); if (result) { - columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), - t("tutti.editFishingOperation.action.chooseColumnsFile.import"), - "^.*\\.csv", t("tutti.common.file.csv")); + importFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), + t("tutti.editFishingOperation.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); - result = columnsFile != null; + result = importFile != null; } return result; } @Override - public void doAction() throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + public void doAction() throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException, ImportFromColumnFileMissingHeaderException { EditFishingOperationUIModel model = getModel(); @@ -67,9 +68,8 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab // Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); // toBeanBinder.copy(model, fishingOperationToMerge); - FishingOperationImportService fishingOperationImportService = getContext().getFishingOperationImportService(); - - fishingOperationImportService.importCaracteristicsFromColumnFile(columnsFile, fishingOperationToMerge); + FishingOperationImportService importService = getContext().getFishingOperationImportService(); + importService.importCaracteristicsFromColumnFile(importFile, fishingOperationToMerge); } @@ -100,14 +100,18 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab public void postFailedAction(Throwable error) { String errorMessage = null; - if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { + + if (error instanceof ImportFromColumnFileMissingHeaderException) { + ImportFromColumnFileMissingHeaderException importFromColumnFileMissingHeaderException = (ImportFromColumnFileMissingHeaderException) error; + + errorMessage = t("tutti.editFishingOperation.action.importColumns.missingHeader", importFromColumnFileMissingHeaderException.getImportColumn()); + + } else if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { // no matching fishing operation errorMessage = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; - } - - if (error instanceof ImportFromColumnFileInvalidRowException) { + } else if (error instanceof ImportFromColumnFileInvalidRowException) { // matching row is not valid ImportFromColumnFileInvalidRowException importFromColumnFileInvalidRowException = (ImportFromColumnFileInvalidRowException) error; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 97b6318484b7899d9d97ac5525896ccefb915367 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 16:01:05 2014 +0100 fix imports --- .../protocol/ProtocolImportExportService.java | 58 ++++++++++----- ...perationCaracteristicsFromColumnFileAction.java | 86 +++++++++------------- 2 files changed, 75 insertions(+), 69 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java index 442f8e9..f9a3a79 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java @@ -31,6 +31,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; import com.google.common.io.Files; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocols; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -129,22 +130,27 @@ public class ProtocolImportExportService extends AbstractTuttiService { ids.get(CaracteristicType.LENGTH_STEP)) ); - //FIXME -// protocol.setVesselUseFeaturePmfmId( -// mergeIds(protocol.getVesselUseFeaturePmfmId(), -// ids.get(CaracteristicType.VESSEL_USE_FEATURE)) -// ); -// -// protocol.setGearUseFeaturePmfmId( -// mergeIds(protocol.getGearUseFeaturePmfmId(), -// ids.get(CaracteristicType.GEAR_USE_FEATURE)) -// ); - protocol.setIndividualObservationPmfmId( mergeIds(protocol.getIndividualObservationPmfmId(), ids.get(CaracteristicType.INDIVIDUAL_OBSERVATION)) ); + List<CaracteristicMappingRow> caracteristicMapping = protocol.getCaracteristicMapping(); + if (caracteristicMapping == null) { + caracteristicMapping = new ArrayList<CaracteristicMappingRow>(); + } + Map<String, CaracteristicMappingRow> rowsByCaracteristicId = + Maps.uniqueIndex(caracteristicMapping, + new Function<CaracteristicMappingRow, String>() { + @Override + public String apply(CaracteristicMappingRow caracteristicMappingRow) { + return caracteristicMappingRow.getPmfmId(); + } + }); + + mergeCaracteristicMappingRows(ids, rowsByCaracteristicId, CaracteristicType.GEAR_USE_FEATURE); + mergeCaracteristicMappingRows(ids, rowsByCaracteristicId, CaracteristicType.VESSEL_USE_FEATURE); + } public void exportAllCaracteristic(File file, @@ -196,14 +202,14 @@ public class ProtocolImportExportService extends AbstractTuttiService { rows.addAll(Lists.transform(protocol.getLengthClassesPmfmId(), function)); } - //FIXME - if (!protocol.isCaracteristicMappingEmpty()) { - function.setType(CaracteristicType.VESSEL_USE_FEATURE); - for (CaracteristicMappingRow mappingRow : protocol.getCaracteristicMapping()) { - function.setType(CaracteristicType.valueOf(mappingRow.getTab())); - rows.add(function.apply(mappingRow.getPmfmId())); - } - } + //FIXME kmorin do export +// if (!protocol.isCaracteristicMappingEmpty()) { +// function.setType(CaracteristicType.VESSEL_USE_FEATURE); +// for (CaracteristicMappingRow mappingRow : protocol.getCaracteristicMapping()) { +// function.setType(CaracteristicType.valueOf(mappingRow.getTab())); +// rows.add(function.apply(mappingRow.getPmfmId())); +// } +// } if (!protocol.isIndividualObservationPmfmIdEmpty()) { @@ -514,6 +520,20 @@ public class ProtocolImportExportService extends AbstractTuttiService { return result; } + + protected void mergeCaracteristicMappingRows(Multimap<CaracteristicType, String> ids, + Map<String, CaracteristicMappingRow> rowsByCaracteristicId, + CaracteristicType type) { + for (String id : ids.get(type)) { + CaracteristicMappingRow row = rowsByCaracteristicId.get(id); + if (row == null) { + row = new CaracteristicMappingRowBean(); + row.setPmfmId(id); + } + row.setTab(type.name()); + } + } + private static class PmfmIdToCaracteristicRowFunction implements Function<String, CaracteristicRow> { private CaracteristicType type; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java index b1eadc7..d5dd486 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java @@ -1,6 +1,7 @@ package fr.ifremer.tutti.ui.swing.action; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.FishingOperations; import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileFishingOperationNotFoundException; import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileInvalidRowException; @@ -12,6 +13,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.AbstractImportErrorInfo; import org.nuiton.jaxx.application.ApplicationBusinessException; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; import java.io.File; @@ -61,16 +64,42 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab // Create a copy of the ui model to use in the import // this bean will be merged back after import into ui model - fishingOperationToMerge = model.toEntity(); - - //FIXME Check we don't need this ? -// fishingOperationToMerge = FishingOperations.newFishingOperation(); -// Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); -// toBeanBinder.copy(model, fishingOperationToMerge); + // use the binder, cause EditFishingOperationUIModel.newEntity() returns always the same instance + fishingOperationToMerge = FishingOperations.newFishingOperation(); + Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = + BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); + toBeanBinder.copy(model, fishingOperationToMerge); FishingOperationImportService importService = getContext().getFishingOperationImportService(); - importService.importCaracteristicsFromColumnFile(importFile, fishingOperationToMerge); + String errorMessage = null; + try { + importService.importCaracteristicsFromColumnFile(importFile, fishingOperationToMerge); + + } catch (ImportFromColumnFileInvalidRowException error) { + // matching row is not valid + ImportFromColumnFileInvalidRowException importFromColumnFileInvalidRowException = (ImportFromColumnFileInvalidRowException) error; + + errorMessage = ""; + for (AbstractImportErrorInfo<FishingOperation> errorInfo : importFromColumnFileInvalidRowException.getErrors()) { + if (log.isErrorEnabled()) { + log.error(errorInfo.getCause().getLocalizedMessage()); + } + errorMessage += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; + } + + } catch (ImportFromColumnFileFishingOperationNotFoundException error) { + // no matching fishing operation + errorMessage = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; + + } catch (ImportFromColumnFileMissingHeaderException error) { + ImportFromColumnFileMissingHeaderException importFromColumnFileMissingHeaderException = (ImportFromColumnFileMissingHeaderException) error; + errorMessage = t("tutti.editFishingOperation.action.importColumns.missingHeader", importFromColumnFileMissingHeaderException.getImportColumn()); + } + + if (errorMessage != null) { + throw new ApplicationBusinessException(t("tutti.editFishingOperation.action.importColumns.error", errorMessage)); + } } @Override @@ -96,47 +125,4 @@ public class ImportFishingOperationCaracteristicsFromColumnFileAction extends Ab } - @Override - public void postFailedAction(Throwable error) { - - String errorMessage = null; - - if (error instanceof ImportFromColumnFileMissingHeaderException) { - ImportFromColumnFileMissingHeaderException importFromColumnFileMissingHeaderException = (ImportFromColumnFileMissingHeaderException) error; - - errorMessage = t("tutti.editFishingOperation.action.importColumns.missingHeader", importFromColumnFileMissingHeaderException.getImportColumn()); - - } else if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { - - // no matching fishing operation - errorMessage = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; - - } else if (error instanceof ImportFromColumnFileInvalidRowException) { - - // matching row is not valid - ImportFromColumnFileInvalidRowException importFromColumnFileInvalidRowException = (ImportFromColumnFileInvalidRowException) error; - - errorMessage = ""; - for (AbstractImportErrorInfo<FishingOperation> errorInfo : importFromColumnFileInvalidRowException.getErrors()) { - if (log.isErrorEnabled()) { - log.error(errorInfo.getCause().getLocalizedMessage()); - } - errorMessage += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; - } - - } - - //TODO Check this is ok, otherwise use below code - throw new ApplicationBusinessException(t("tutti.editFishingOperation.action.importColumns.error", errorMessage)); - -// if (errorMessage != null) { -// -// displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), -// "<html><body>" + -// t("tutti.editFishingOperation.action.importColumns.error", errorMessage) -// + "</body></html>"); -// -// } - - } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit d5d12920c295169afe48f8b856c0c207f6425e94 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 16:14:39 2014 +0100 refs #6129 fix export --- .../tutti/service/protocol/ProtocolImportExportService.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java index f9a3a79..01d98e3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java @@ -203,13 +203,12 @@ public class ProtocolImportExportService extends AbstractTuttiService { } //FIXME kmorin do export -// if (!protocol.isCaracteristicMappingEmpty()) { -// function.setType(CaracteristicType.VESSEL_USE_FEATURE); -// for (CaracteristicMappingRow mappingRow : protocol.getCaracteristicMapping()) { -// function.setType(CaracteristicType.valueOf(mappingRow.getTab())); -// rows.add(function.apply(mappingRow.getPmfmId())); -// } -// } + if (!protocol.isCaracteristicMappingEmpty()) { + for (CaracteristicMappingRow mappingRow : protocol.getCaracteristicMapping()) { + function.setType(CaracteristicType.valueOf(mappingRow.getTab())); + rows.add(function.apply(mappingRow.getPmfmId())); + } + } if (!protocol.isIndividualObservationPmfmIdEmpty()) { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 7c138f2df004a99203c4c69467f7cfceffdbba08 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 16:15:49 2014 +0100 remove fixme --- .../fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java index 01d98e3..72832eb 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/protocol/ProtocolImportExportService.java @@ -202,7 +202,6 @@ public class ProtocolImportExportService extends AbstractTuttiService { rows.addAll(Lists.transform(protocol.getLengthClassesPmfmId(), function)); } - //FIXME kmorin do export if (!protocol.isCaracteristicMappingEmpty()) { for (CaracteristicMappingRow mappingRow : protocol.getCaracteristicMapping()) { function.setType(CaracteristicType.valueOf(mappingRow.getTab())); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm