branch feature/7017 updated (7b6c125 -> 4f5f524)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7017 in repository observe. See http://git.codelutin.com/observe.git from 7b6c125 - Suppression dans les handlers to code avec les transactions - Amélioration du code dans les services - faire fonctionner la sauvegarde de CatchLongine refs #7017 new 4f5f524 - Amélioration de la validation des activités - Revue de la cinématiques pour les écrans de type Open (ajout méthode onOpenUI) - implantation du service pour les TargetCatch - ménache! The 1 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 4f5f524e255c453f96277b4ba1a8c0f91c03a8df Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat May 2 15:16:21 2015 +0200 - Amélioration de la validation des activités - Revue de la cinématiques pour les écrans de type Open (ajout méthode onOpenUI) - implantation du service pour les TargetCatch - ménache! refs #7017 Summary of changes: .../main/java/fr/ird/observe/BinderService.java | 128 ++--- .../fr/ird/observe/ObserveApplicationContext.java | 8 - .../java/fr/ird/observe/entities/Entities.java | 14 +- .../observe/entities/seine/ActivitySeineImpl.java | 38 +- .../ird/observe/entities/seine/ActivitySeines.java | 3 +- .../java/fr/ird/observe/entities/seine/Routes.java | 22 + .../ird/observe/entities/seine/TargetCatches.java | 24 + .../observe/services/AbstractObserveService.java | 31 -- .../data/longline/ActivityLonglineService.java | 2 - .../data/longline/ActivityLonglineServiceImpl.java | 7 +- .../services/data/longline/SetLonglineService.java | 2 +- .../data/longline/SetLonglineServiceImpl.java | 34 +- .../services/data/seine/NonTargetCatchService.java | 2 +- .../data/seine/NonTargetCatchServiceImpl.java | 13 +- .../data/seine/NonTargetSampleService.java | 13 +- .../data/seine/NonTargetSampleServiceImpl.java | 58 +-- .../observe/services/data/seine/RouteService.java | 2 - .../services/data/seine/RouteServiceImpl.java | 8 +- .../services/data/seine/SetSeineServiceImpl.java | 5 +- .../services/data/seine/TargetCatchService.java | 28 ++ .../data/seine/TargetCatchServiceImpl.java | 164 +++++++ .../services/data/seine/TargetSampleService.java | 16 +- .../data/seine/TargetSampleServiceImpl.java | 75 +-- .../services/referential/ReferentialService.java | 2 + .../referential/ReferentialServiceImpl.java | 8 + .../ird/observe/ui/content/ContentUIHandler.java | 69 +-- .../fr/ird/observe/ui/content/ContentUIModel.java | 26 -- .../LonglineGlobalCompositionUIHandler.java | 6 +- .../impl/longline/SetLonglineUIHandler.java | 10 +- .../ActivitySeineObservedSystemUIHandler.java | 1 + .../ui/content/impl/seine/SetSeineUIHandler.java | 6 +- .../ui/content/open/ContentOpenableUIHandler.java | 43 +- .../impl/longline/ActivityLonglineUIHandler.java | 62 +-- .../open/impl/longline/TripLonglineUIHandler.java | 39 +- .../open/impl/seine/ActivitySeineUIHandler.java | 79 ++-- .../ui/content/open/impl/seine/RouteUIHandler.java | 139 ++---- .../open/impl/seine/TripSeineUIHandler.java | 38 +- .../ui/content/table/ContentTableUIHandler.java | 450 ++++++------------ .../ui/content/table/ContentTableUIModel.java | 2 +- .../impl/longline/SizeMeasuresTableModel.java | 3 +- .../impl/longline/WeightMeasuresTableModel.java | 3 +- .../table/impl/seine/NonTargetCatchUIHandler.java | 299 ++++++------ .../table/impl/seine/NonTargetSampleUIHandler.java | 134 +++--- .../impl/seine/ObjectObservedSpeciesUIHandler.java | 8 +- .../table/impl/seine/TargetCatchUIHandler.java | 293 +++++------- .../impl/seine/TargetDiscardCatchUIHandler.java | 514 +++++++++------------ .../table/impl/seine/TargetSampleUIHandler.java | 2 +- .../fr/ird/observe/ui/tree/SetLonglineNode.java | 2 +- .../field/VesselActivityFieldValidator.java | 52 +-- 49 files changed, 1343 insertions(+), 1644 deletions(-) create mode 100644 observe-entities/src/main/java/fr/ird/observe/entities/seine/TargetCatches.java create mode 100644 observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchService.java create mode 100644 observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchServiceImpl.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7017 in repository observe. See http://git.codelutin.com/observe.git commit 4f5f524e255c453f96277b4ba1a8c0f91c03a8df Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat May 2 15:16:21 2015 +0200 - Amélioration de la validation des activités - Revue de la cinématiques pour les écrans de type Open (ajout méthode onOpenUI) - implantation du service pour les TargetCatch - ménache! refs #7017 --- .../main/java/fr/ird/observe/BinderService.java | 128 ++--- .../fr/ird/observe/ObserveApplicationContext.java | 8 - .../java/fr/ird/observe/entities/Entities.java | 14 +- .../observe/entities/seine/ActivitySeineImpl.java | 38 +- .../ird/observe/entities/seine/ActivitySeines.java | 3 +- .../java/fr/ird/observe/entities/seine/Routes.java | 22 + .../ird/observe/entities/seine/TargetCatches.java | 24 + .../observe/services/AbstractObserveService.java | 31 -- .../data/longline/ActivityLonglineService.java | 2 - .../data/longline/ActivityLonglineServiceImpl.java | 7 +- .../services/data/longline/SetLonglineService.java | 2 +- .../data/longline/SetLonglineServiceImpl.java | 34 +- .../services/data/seine/NonTargetCatchService.java | 2 +- .../data/seine/NonTargetCatchServiceImpl.java | 13 +- .../data/seine/NonTargetSampleService.java | 13 +- .../data/seine/NonTargetSampleServiceImpl.java | 58 +-- .../observe/services/data/seine/RouteService.java | 2 - .../services/data/seine/RouteServiceImpl.java | 8 +- .../services/data/seine/SetSeineServiceImpl.java | 5 +- .../services/data/seine/TargetCatchService.java | 28 ++ .../data/seine/TargetCatchServiceImpl.java | 164 +++++++ .../services/data/seine/TargetSampleService.java | 16 +- .../data/seine/TargetSampleServiceImpl.java | 75 +-- .../services/referential/ReferentialService.java | 2 + .../referential/ReferentialServiceImpl.java | 8 + .../ird/observe/ui/content/ContentUIHandler.java | 69 +-- .../fr/ird/observe/ui/content/ContentUIModel.java | 26 -- .../LonglineGlobalCompositionUIHandler.java | 6 +- .../impl/longline/SetLonglineUIHandler.java | 10 +- .../ActivitySeineObservedSystemUIHandler.java | 1 + .../ui/content/impl/seine/SetSeineUIHandler.java | 6 +- .../ui/content/open/ContentOpenableUIHandler.java | 43 +- .../impl/longline/ActivityLonglineUIHandler.java | 62 +-- .../open/impl/longline/TripLonglineUIHandler.java | 39 +- .../open/impl/seine/ActivitySeineUIHandler.java | 79 ++-- .../ui/content/open/impl/seine/RouteUIHandler.java | 139 ++---- .../open/impl/seine/TripSeineUIHandler.java | 38 +- .../ui/content/table/ContentTableUIHandler.java | 450 ++++++------------ .../ui/content/table/ContentTableUIModel.java | 2 +- .../impl/longline/SizeMeasuresTableModel.java | 3 +- .../impl/longline/WeightMeasuresTableModel.java | 3 +- .../table/impl/seine/NonTargetCatchUIHandler.java | 299 ++++++------ .../table/impl/seine/NonTargetSampleUIHandler.java | 134 +++--- .../impl/seine/ObjectObservedSpeciesUIHandler.java | 8 +- .../table/impl/seine/TargetCatchUIHandler.java | 293 +++++------- .../impl/seine/TargetDiscardCatchUIHandler.java | 514 +++++++++------------ .../table/impl/seine/TargetSampleUIHandler.java | 2 +- .../fr/ird/observe/ui/tree/SetLonglineNode.java | 2 +- .../field/VesselActivityFieldValidator.java | 52 +-- 49 files changed, 1343 insertions(+), 1644 deletions(-) diff --git a/observe-business/src/main/java/fr/ird/observe/BinderService.java b/observe-business/src/main/java/fr/ird/observe/BinderService.java index 0874332..a0cfdba 100644 --- a/observe-business/src/main/java/fr/ird/observe/BinderService.java +++ b/observe-business/src/main/java/fr/ird/observe/BinderService.java @@ -21,6 +21,8 @@ */ package fr.ird.observe; +import com.google.common.base.Preconditions; +import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.longline.ActivityLongline; import fr.ird.observe.entities.longline.BaitsComposition; import fr.ird.observe.entities.longline.Basket; @@ -122,7 +124,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.util.TopiaEntityBinder; -import org.nuiton.topia.persistence.util.TopiaEntityHelper; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderModelBuilder; @@ -226,6 +227,8 @@ public class BinderService { I18nReferenceEntity.PROPERTY_LABEL8 }; + public static final String SIMPLE = "Observe"; + static { try { @@ -253,7 +256,6 @@ public class BinderService { } - public <E extends TopiaEntity> void copyExcluding(Class<E> type, String context, E source, E target, String... propertyNames) { copyExcluding(type, context, source, target, true, propertyNames); @@ -292,40 +294,41 @@ public class BinderService { return binder; } + public <E extends TopiaEntity> void simpleCopy(E source, E target, boolean tech) { + Class<E> entityClass = Entities.getContract(target); + TopiaEntityBinder<E> binder = getBinder(entityClass, SIMPLE); + binder.load(source, target, tech); + } - public static <E extends TopiaEntity> BinderModelBuilder<E, E> newBinderBuilder(Class<E> type, String... properties) { + protected static <E extends TopiaEntity> BinderModelBuilder<E, E> newBinderBuilder(Class<E> type, String... properties) { BinderModelBuilder<E, E> builder = BinderModelBuilder.newEmptyBuilder(type); builder.addSimpleProperties(properties); return builder; } - public <E extends TopiaEntity> TopiaEntityBinder<E> getTopiaBinder(Class<E> entityClass, - String contextName) { + @SuppressWarnings("unchecked") + protected <E extends TopiaEntity> TopiaEntityBinder<E> getTopiaBinder(Class<E> entityClass, String contextName) { + + TopiaEntityBinder<E> binder; if (ObserveBinderHelper.getCachedBinderModel(entityClass, entityClass, contextName) == null) { // we do not want to have auto created binder model by the factory - return null; + binder = null; + } else { + + binder = (TopiaEntityBinder<E>) + ObserveBinderHelper.newBinder(entityClass, entityClass, contextName, TopiaEntityBinder.class); + } - return (TopiaEntityBinder<E>) ObserveBinderHelper.newBinder(entityClass, entityClass, contextName, TopiaEntityBinder.class); + return binder; } - public static <E extends TopiaEntity> TopiaEntityBinder<E> registerTopiaBinder(Class<E> entityClass, + protected static <E extends TopiaEntity> TopiaEntityBinder<E> registerTopiaBinder(Class<E> entityClass, BinderModelBuilder<E, E> builder, String contextName) { - return ObserveBinderHelper.registerTopiaBinder(entityClass, builder, contextName); - } - - public <E extends TopiaEntity> TopiaEntityBinder<E> getSimpleTopiaBinder(Class<E> entityClass) { - return getTopiaBinder(entityClass, "Observe"); - } - public <E extends TopiaEntity> void simpleCopy(E source, E target, boolean tech) { - Class<E> entityClass = (Class<E>) TopiaEntityHelper.getContractClass(ObserveDAOHelper.getContracts(), target.getClass()); - TopiaEntityBinder<E> binder = getSimpleTopiaBinder(entityClass); - if (binder == null) { - throw new NullPointerException("could not find a simple topia binder of type : " + target.getClass()); - } - binder.load(source, target, tech); + Preconditions.checkArgument(ObserveBinderHelper.getCachedBinderModel(entityClass, entityClass, contextName) == null, "there is already a bindermodel resigtred for type " + entityClass + " and context " + contextName); + return ObserveBinderHelper.registerTopiaBinder(entityClass, builder, contextName); } protected static void registerSeineBinders() { @@ -535,69 +538,6 @@ public class BinderService { { - BinderModelBuilder<ActivitySeine, ActivitySeine> builder = newBinderBuilder( - ActivitySeine.class, - ActivitySeine.PROPERTY_QUADRANT, - ActivitySeine.PROPERTY_LATITUDE, - ActivitySeine.PROPERTY_LONGITUDE, - ActivitySeine.PROPERTY_ERS_ID, - ActivitySeine.PROPERTY_TIME, - ActivitySeine.PROPERTY_SEA_SURFACE_TEMPERATURE, - ActivitySeine.PROPERTY_REASON_FOR_NO_FISHING, - ActivitySeine.PROPERTY_COMMENT, - ActivitySeine.PROPERTY_VESSEL_SPEED, - ActivitySeine.PROPERTY_OBSERVED_SYSTEM, - ActivitySeine.PROPERTY_OBSERVED_SYSTEM_DISTANCE, - ActivitySeine.PROPERTY_VESSEL_ACTIVITY_SEINE, - ActivitySeine.PROPERTY_SURROUNDING_ACTIVITY, - ActivitySeine.PROPERTY_WIND, - ActivitySeine.PROPERTY_DETECTION_MODE, - ActivitySeine.PROPERTY_SET_SEINE, - ActivitySeine.PROPERTY_FLOATING_OBJECT, - ActivitySeine.PROPERTY_OPEN, - ActivitySeine.PROPERTY_CURRENT_FPA_ZONE, - ActivitySeine.PROPERTY_PREVIOUS_FPA_ZONE, - ActivitySeine.PROPERTY_NEXT_FPA_ZONE); - - builder.addCollectionStrategy(Binder.CollectionStrategy.duplicate, ActivitySeine.PROPERTY_OBSERVED_SYSTEM); - builder.addCollectionStrategy(Binder.CollectionStrategy.duplicate, ActivitySeine.PROPERTY_FLOATING_OBJECT); - - //FIXME this one was used ? -// BinderModelBuilder<ActivitySeine, ActivitySeine> builder = newBinderBuilder( -// ActivitySeine.class, -// ActivitySeine.PROPERTY_QUADRANT, -// ActivitySeine.PROPERTY_LATITUDE, -// ActivitySeine.PROPERTY_LONGITUDE, -// ActivitySeine.PROPERTY_TIME, -// ActivitySeine.PROPERTY_SEA_SURFACE_TEMPERATURE, -// ActivitySeine.PROPERTY_REASON_FOR_NO_FISHING, -// ActivitySeine.PROPERTY_VESSEL_ACTIVITY_SEINE, -// ActivitySeine.PROPERTY_WIND, -// ActivitySeine.PROPERTY_OPEN); -// - registerTopiaBinder(ActivitySeine.class, builder, EDIT); - } - - { - - BinderModelBuilder<Route, Route> builder = newBinderBuilder( - Route.class, - Route.PROPERTY_DATE, - Route.PROPERTY_START_LOG_VALUE, - Route.PROPERTY_END_LOG_VALUE, - Route.PROPERTY_CHECK_LEVEL, - Route.PROPERTY_ACTIVITY_SEINE, - Route.PROPERTY_OPEN, - Route.PROPERTY_COMMENT); - - builder.addCollectionStrategy(Binder.CollectionStrategy.duplicate, Route.PROPERTY_ACTIVITY_SEINE); - - registerTopiaBinder(Route.class, builder, EDIT); - - } - - { - BinderModelBuilder<Route, Route> builder = newBinderBuilder( Route.class, Route.PROPERTY_DATE, @@ -878,19 +818,6 @@ public class BinderService { } - - { - - BinderModelBuilder<TripSeine, TripSeine> builder = newBinderBuilder( - TripSeine.class, - TripSeine.PROPERTY_GEAR_USE_FEATURES_SEINE); - - builder.addCollectionStrategy(Binder.CollectionStrategy.duplicate, TripSeine.PROPERTY_GEAR_USE_FEATURES_SEINE); - - registerTopiaBinder(TripSeine.class, builder, EDIT_GEAR_USE_FEATURES_SEINE); - - } - { BinderModelBuilder<TripSeine, TripSeine> builder = newBinderBuilder( @@ -1548,6 +1475,13 @@ public class BinderService { protected static void registerReferentialBinders() { { + // Need to add by hand a speciesList binder + // see https://forge.codelutin.com/issues/6963 + BinderModelBuilder<SpeciesList, SpeciesList> builderModel = newBinderBuilder(SpeciesList.class); + registerTopiaBinder(SpeciesList.class, builderModel, "Observe"); + + } + { BinderModelBuilder<Program, Program> builder = newBinderBuilder( Program.class, diff --git a/observe-business/src/main/java/fr/ird/observe/ObserveApplicationContext.java b/observe-business/src/main/java/fr/ird/observe/ObserveApplicationContext.java index 1e92b58..bd17f13 100644 --- a/observe-business/src/main/java/fr/ird/observe/ObserveApplicationContext.java +++ b/observe-business/src/main/java/fr/ird/observe/ObserveApplicationContext.java @@ -25,7 +25,6 @@ import fr.ird.observe.db.DataContext; import fr.ird.observe.db.DataSource; import fr.ird.observe.db.DataSourceFactory; import fr.ird.observe.entities.constants.ReferenceLocale; -import fr.ird.observe.entities.referentiel.SpeciesList; import fr.ird.observe.gps.GPSService; import fr.ird.observe.validation.ObserveValidator; import fr.ird.observe.validation.ValidationContext; @@ -35,7 +34,6 @@ import jaxx.runtime.context.JAXXContextEntryDef; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; -import org.nuiton.util.beans.BinderModelBuilder; import java.util.Locale; @@ -153,12 +151,6 @@ public class ObserveApplicationContext extends DefaultApplicationContext { if (service == null) { service = new BinderService(); - // Need to add by hand a speciesList binder - // see https://forge.codelutin.com/issues/6963 - BinderModelBuilder<SpeciesList, SpeciesList> builderModel= - BinderModelBuilder.newEmptyBuilder(SpeciesList.class); - service.registerTopiaBinder(SpeciesList.class, builderModel, "Observe"); - BINDER_SERVICE_ENTRY_DEF.setContextValue(this, service); } return service; diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/Entities.java b/observe-entities/src/main/java/fr/ird/observe/entities/Entities.java index 822d926..89340df 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/Entities.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/Entities.java @@ -28,6 +28,7 @@ import fr.ird.observe.ObserveEntityEnum; import org.apache.commons.collections4.CollectionUtils; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaId; +import org.nuiton.topia.persistence.util.TopiaEntityHelper; import java.util.Arrays; import java.util.Collection; @@ -353,20 +354,25 @@ public class Entities { public static <E extends TopiaEntity> String getTableName(E entity) { ObserveEntityEnum entityEnum = ObserveEntityEnum.valueOf(entity); - return entityEnum.dbSchemaName()+"."+entityEnum.dbTableName(); + return entityEnum.dbSchemaName() + "." + entityEnum.dbTableName(); } public static boolean isSeineId(String id) { - return id.contains("Seine"); + return id.contains("Seine"); } public static boolean isLonglineId(String id) { - return id.contains("Longline"); + return id.contains("Longline"); } public static <E extends TopiaEntity> boolean isNew(E entity) { - return entity.getTopiaId()==null; + return entity.getTopiaId() == null; + } + + @SuppressWarnings("unchecked") + public static <E extends TopiaEntity> Class<E> getContract(E entity) { + return (Class<E>) TopiaEntityHelper.getContractClass(ObserveDAOHelper.getContracts(), entity.getClass()); } } diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeineImpl.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeineImpl.java index 7bfed7a..444539e 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeineImpl.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeineImpl.java @@ -43,26 +43,28 @@ public class ActivitySeineImpl extends ActivitySeineAbstract { private static final long serialVersionUID = 2L; - public static final String ACTIVITY_FIN_DE_VEILLE = "16"; + public static final String ACTIVITY_FIN_DE_VEILLE_ID = "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675372#0.21399033380125898"; - public static final String ACTIVITY_DEBUT_DE_PECHE = "6"; + public static final String ACTIVITY_DEBUT_DE_PECHE_ID = "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675369#0.12552908048322586"; - public static final String ACTIVITY_DEBUT_DE_PECHE_ID = "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675369#0.027011527426829218"; + public static final String ACTIVITY_FIN_DE_PECHE_ID = "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675369#0.10731168577264139"; - public static final String ACTIVITY_FIN_DE_PECHE = "7"; + public static final String ACTIVITY_CHANGED_ZONE_ID = "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1379684416896#0.38648073770690594"; - public static final String ACTIVITY_CHANGED_ZONE = "21"; + private static final List<String> CALEE_OPERATIONS_ID = Collections.singletonList(ACTIVITY_DEBUT_DE_PECHE_ID); - private static final List<String> CALEE_OPERATIONS = Collections.singletonList(ACTIVITY_DEBUT_DE_PECHE_ID); + private static final List<String> DCP_OPERATIONS_ID = Arrays.asList( + "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675370#0.9125190289998782", + "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675371#0.15012142294280495", + "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675371#0.23195165331640677"); - private static final List<String> DCP_OPERATIONS = Arrays.asList("13", "14", "15"); - - private static final List<String> SYSTEM_OPERATIONS = Arrays.asList("0", "11", "11", ACTIVITY_FIN_DE_VEILLE); + private static final List<String> SYSTEM_OPERATIONS_ID = Arrays.asList( + "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675349#0.363119635949572", + "fr.ird.observe.entities.referentiel.seine.VesselActivitySeine#1239832675370#0.495613158646268", + ACTIVITY_FIN_DE_VEILLE_ID); public static final String PROPERTY_CHANGED_ZONE_OPERATION = "changedZoneOperation"; -// public static final String PROPERTY_SET_OPERATION = "setOperation"; - /** * La valeur du quadrant (utilisé uniquement dans l'interface graphique) : * en base on conserve cette information dans les coordonnées {@link #longitude} @@ -87,25 +89,25 @@ public class ActivitySeineImpl extends ActivitySeineAbstract { /** @return {@code true} si l'activite concerne un DCP */ @Override public boolean isDCPOperation() { - return vesselActivitySeine != null && DCP_OPERATIONS.contains(vesselActivitySeine.getCode()); + return vesselActivitySeine != null && DCP_OPERATIONS_ID.contains(vesselActivitySeine.getTopiaId()); } /** @return {@code true} si l'activite concerne une calée */ @Override public boolean isSetOperation() { - return vesselActivitySeine != null && CALEE_OPERATIONS.contains(vesselActivitySeine.getTopiaId()); + return vesselActivitySeine != null && CALEE_OPERATIONS_ID.contains(vesselActivitySeine.getTopiaId()); } /** @return {@code true} si l'activite concerne un système observé */ @Override public boolean isObservedSystemOperation() { - return vesselActivitySeine != null && SYSTEM_OPERATIONS.contains(vesselActivitySeine.getCode()); + return vesselActivitySeine != null && SYSTEM_OPERATIONS_ID.contains(vesselActivitySeine.getTopiaId()); } /** @return {@code true} si l'activite concerne un changement de zone */ @Override public boolean isChangedZoneOperation() { - return vesselActivitySeine != null && ACTIVITY_CHANGED_ZONE.equals(vesselActivitySeine.getCode()); + return vesselActivitySeine != null && ACTIVITY_CHANGED_ZONE_ID.equals(vesselActivitySeine.getTopiaId()); } @Override @@ -125,7 +127,7 @@ public class ActivitySeineImpl extends ActivitySeineAbstract { @Override public void setQuadrant(Integer quadrant) { if (log.isInfoEnabled()) { - log.info("New quadrant value: "+quadrant); + log.info("New quadrant value: " + quadrant); } Integer old = this.quadrant; // fireOnPreWrite(PROPERTY_QUADRANT, old, quadrant); @@ -151,7 +153,7 @@ public class ActivitySeineImpl extends ActivitySeineAbstract { @Override public boolean isActivityFinDePeche() { - return vesselActivitySeine != null && ACTIVITY_FIN_DE_PECHE.equals(vesselActivitySeine.getCode()); + return vesselActivitySeine != null && ACTIVITY_FIN_DE_PECHE_ID.equals(vesselActivitySeine.getTopiaId()); } @Override @@ -161,7 +163,7 @@ public class ActivitySeineImpl extends ActivitySeineAbstract { @Override public boolean isActivityFinDeVeille() { - return vesselActivitySeine != null && ACTIVITY_FIN_DE_VEILLE.equals(vesselActivitySeine.getCode()); + return vesselActivitySeine != null && ACTIVITY_FIN_DE_VEILLE_ID.equals(vesselActivitySeine.getTopiaId()); } @Override diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java index a3dcd99..89a923d 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/ActivitySeines.java @@ -48,8 +48,7 @@ public class ActivitySeines { @Override public int compare(ActivitySeine o1, ActivitySeine o2) { - return o1.getTime().compareTo( - o2.getTime()); + return o1.getTime().compareTo(o2.getTime()); } }; diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/Routes.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/Routes.java index c59c644..add626f 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/seine/Routes.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/Routes.java @@ -22,9 +22,11 @@ package fr.ird.observe.entities.seine; * #L% */ +import fr.ird.observe.entities.referentiel.seine.VesselActivitySeine; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -91,4 +93,24 @@ public class Routes { return previous; } + /** + * Recupere les positions des activités d'un certain type. + * + * @param route la route à inspecter + * @param vesselActivityId l'id du type d'activité à rechercher + * @return les positions des activitys d'un certain type donné + */ + public static Integer[] detectActivities(Route route, String vesselActivityId) { + List<Integer> list = new ArrayList<Integer>(); + int index = 0; + for (ActivitySeine a : route.getActivitySeine()) { + VesselActivitySeine vesselActivitySeine = a.getVesselActivitySeine(); + if (vesselActivityId.equals(vesselActivitySeine.getTopiaId())) { + list.add(index); + } + index++; + } + return list.toArray(new Integer[list.size()]); + } + } diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/TargetCatches.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/TargetCatches.java new file mode 100644 index 0000000..482cbcb --- /dev/null +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/TargetCatches.java @@ -0,0 +1,24 @@ +package fr.ird.observe.entities.seine; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; + +/** + * Created on 5/2/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class TargetCatches { + + public static final Predicate<TargetCatch> TARGET_CATCH_IS_DISCARDED = new Predicate<TargetCatch>() { + @Override + public boolean apply(TargetCatch input) { + return input.isDiscarded(); + } + }; + + public static final Predicate<TargetCatch> TARGET_CATCH_IS_NOT_DISCARDED = + Predicates.not(TARGET_CATCH_IS_DISCARDED); + +} diff --git a/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java b/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java index 2f2df05..9fa8dc1 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java @@ -6,7 +6,6 @@ import com.google.common.collect.Lists; import fr.ird.observe.BinderService; import fr.ird.observe.IObserveConfig; import fr.ird.observe.ObserveEntityEnum; -import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.EntityMap; import fr.ird.observe.entities.constants.ReferenceLocale; @@ -20,7 +19,6 @@ import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.util.EntityListUpdator; import org.nuiton.topia.persistence.util.TopiaEntityBinder; import org.nuiton.topia.persistence.util.TopiaEntityHelper; -import org.nuiton.util.beans.BinderModelBuilder; import java.util.ArrayList; import java.util.Collection; @@ -201,35 +199,6 @@ public abstract class AbstractObserveService implements ObserveService { } - - protected <E extends TopiaEntity> TopiaEntityBinder<E> loadBinder(String suffix, Class<E> entityType, CreateBinder<E> createBinder) { - - BinderService binderService = ObserveServiceHelper.get().getBinderService(); - - String binderName = getClass().getName() + suffix; - TopiaEntityBinder<E> r = binderService.getTopiaBinder(entityType, binderName); - - if (r == null) { - - BinderModelBuilder<E, E> builder = createBinder.createBinderBuilder(binderService, binderName); - r = createBinder.registerTopiaBinder(binderService, entityType, builder, binderName); - - } - - return r; - - } - - protected abstract class CreateBinder<E extends TopiaEntity> { - - public abstract BinderModelBuilder<E, E> createBinderBuilder(BinderService binderService, String name); - - public TopiaEntityBinder<E> registerTopiaBinder(BinderService binderService, Class<E> entityType, BinderModelBuilder<E, E> builder, String name) { - return binderService.registerTopiaBinder(entityType, builder, name); - } - - } - public <P extends TopiaEntity, E extends TopiaEntity> String doSave(String parentId, E toSave, SaveAction<P, E> saveAction) { E saved; diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineService.java b/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineService.java index 3d640bc..3aaa858 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineService.java @@ -18,8 +18,6 @@ public interface ActivityLonglineService extends ObserveService { List<ActivityLongline> getActivityLonglineStubByTrip(String tripId); - ActivityLongline loadForDisplay(String activityLonglineId); - ActivityLongline loadForEdit(String activityLonglineId); ActivityLongline preCreate(String tripLonglineId); diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineServiceImpl.java index 8a81987..20a96c5 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/longline/ActivityLonglineServiceImpl.java @@ -38,7 +38,7 @@ public class ActivityLonglineServiceImpl extends AbstractObserveService implemen } @Override - public ActivityLongline loadForDisplay(String activityLonglineId) { + public ActivityLongline loadForEdit(String activityLonglineId) { ActivityLongline loaded = getDao().newInstance(); ActivityLongline toLoad = getDao().findByTopiaId(activityLonglineId); @@ -48,11 +48,6 @@ public class ActivityLonglineServiceImpl extends AbstractObserveService implemen } - @Override - public ActivityLongline loadForEdit(String activityLonglineId) { - return loadForDisplay(activityLonglineId); - } - @Override public ActivityLongline preCreate(String tripLonglineId) { diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineService.java b/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineService.java index 89c8324..a4b4902 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineService.java @@ -15,7 +15,7 @@ import java.util.List; */ public interface SetLonglineService extends ObserveService { - SetLongline loadSet(String setLonglineId); + SetLongline loadForDisplay(String setLonglineId); List<Section> getSections(String setLonglineId); diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineServiceImpl.java index 793e631..b6e88aa 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/longline/SetLonglineServiceImpl.java @@ -23,11 +23,6 @@ import java.util.List; */ public class SetLonglineServiceImpl extends AbstractObserveService implements SetLonglineService { - @Override - public SetLongline loadSet(String setLonglineId) { - return null; - } - public List<Section> getSections(String setLonglineId) { TopiaDAO<Section> dao = getDao(Section.class); @@ -69,6 +64,30 @@ public class SetLonglineServiceImpl extends AbstractObserveService implements Se } @Override + public SetLongline loadForDisplay(String setLonglineId) { + + SetLonglineDAO dao = getDao(); + + SetLongline loaded = dao.newInstance(); + SetLongline toLoad = dao.findByTopiaId(setLonglineId); + copy(SetLongline.class, BinderService.EDIT, toLoad, loaded); + return loaded; + + } + + @Override + public SetLongline loadForEdit(String setLonglineId) { + + SetLonglineDAO dao = getDao(); + + SetLongline loaded = dao.newInstance(); + SetLongline toLoad = dao.findByTopiaId(setLonglineId); + copy(SetLongline.class, BinderService.EDIT, toLoad, loaded); + return loaded; + + } + + @Override public SetLongline preCreate(String activityLonglineId) { ActivityLongline activityLongline = findByTopiaId(ActivityLongline.class, activityLonglineId); @@ -98,11 +117,6 @@ public class SetLonglineServiceImpl extends AbstractObserveService implements Se } @Override - public SetLongline loadForEdit(String setLonglineId) { - return null; - } - - @Override public String save(String activityLonglineId, SetLongline setLongline) { String setLonglineId = doSave(activityLonglineId, setLongline, new SaveAction<ActivityLongline, SetLongline>(ActivityLongline.class, SetLongline.class) { diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchService.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchService.java index a92d6b4..59786f6 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchService.java @@ -15,6 +15,6 @@ public interface NonTargetCatchService extends ObserveService { SetSeine loadForEdit(String setId); @Commit - void save(SetSeine parent, List<NonTargetLength> tailleToDelete); + void save(SetSeine toSave, List<NonTargetLength> nonTargetLengthsToDelete); } diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchServiceImpl.java index c7a6139..51d5711 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetCatchServiceImpl.java @@ -52,14 +52,16 @@ public class NonTargetCatchServiceImpl extends AbstractObserveService implements } return loaded; + } @Override - public void save(SetSeine parent, final List<NonTargetLength> tailleToDelete) { + public void save(SetSeine toSave, final List<NonTargetLength> nonTargetLengthsToDelete) { + TopiaEntityBinder<SetSeine> parentBinder = getBinder(SetSeine.class, BinderService.EDIT_NON_TARGET_CATCH); TopiaEntityBinder<NonTargetCatch> childbinder = getBinder(NonTargetCatch.class, BinderService.EDIT); - doSaveList(parent, new SaveCollectionAction<SetSeine, NonTargetCatch>( + doSaveList(toSave, new SaveCollectionAction<SetSeine, NonTargetCatch>( SetSeine.class, NonTargetCatch.class, getListUpdator(), parentBinder, childbinder) { @Override @@ -81,18 +83,18 @@ public class NonTargetCatchServiceImpl extends AbstractObserveService implements @Override public void onUpdateFinalize(SetSeine parent, Collection<NonTargetCatch> oldChilds) throws TopiaException { - if (CollectionUtils.isNotEmpty(tailleToDelete)) { + if (CollectionUtils.isNotEmpty(nonTargetLengthsToDelete)) { // on a demande la suppression de taille obsoletes if (log.isInfoEnabled()) { - log.info("Will remove " + tailleToDelete.size() + " obsolete nonTargetSample(s)."); + log.info("Will remove " + nonTargetLengthsToDelete.size() + " obsolete nonTargetSample(s)."); } NonTargetSample echantillon = parent.getNonTargetSample().get(0); // on supprime les echantillons obsoletes - echantillon.getNonTargetLength().removeAll(tailleToDelete); + echantillon.getNonTargetLength().removeAll(nonTargetLengthsToDelete); } } @@ -106,4 +108,5 @@ public class NonTargetCatchServiceImpl extends AbstractObserveService implements NonTargetCatch.class, SetSeine.PROPERTY_NON_TARGET_CATCH); } + } diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleService.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleService.java index c4bc584..e433ab6 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleService.java @@ -6,8 +6,8 @@ import fr.ird.observe.entities.seine.NonTargetSample; import fr.ird.observe.services.Commit; import fr.ird.observe.services.ObserveService; -import java.util.Collection; import java.util.List; +import java.util.Set; /** * Created on 4/26/15. @@ -17,21 +17,18 @@ import java.util.List; */ public interface NonTargetSampleService extends ObserveService { - List<Species> getAvailableEspeceForNonTargetSample(String setSeineId); + List<Species> getAvailableSpeciesForNonTargetSample(String setSeineId); NonTargetSample getNonTargetSample(String setSeineId); boolean canUseNonTargetSample(String setSeineId); - void getObsoleteEspeceForNonTargetSample(String setSeineId, - List<Species> speciessUsed, - Collection<Species> speciessToDelete, - List<NonTargetLength> tailleToDelete); + List<NonTargetLength> getObsoleteNonTargetLengths(String setSeineId, Set<String> speciesIdsUsed); @Commit - void delete(String setId, NonTargetSample editBean); + String save(String setId, NonTargetSample editBean); @Commit - String save(String setId, NonTargetSample editBean); + void delete(String setId, NonTargetSample editBean); } diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleServiceImpl.java index b453188..d7a0983 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/NonTargetSampleServiceImpl.java @@ -16,6 +16,7 @@ import org.nuiton.topia.persistence.util.TopiaEntityBinder; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Set; /** * Created on 4/26/15. @@ -33,7 +34,7 @@ public class NonTargetSampleServiceImpl extends AbstractObserveService implement } @Override - public List<Species> getAvailableEspeceForNonTargetSample(String setSeineId) { + public List<Species> getAvailableSpeciesForNonTargetSample(String setSeineId) { List<Species> speciesList = new ArrayList<Species>(); @@ -110,36 +111,38 @@ public class NonTargetSampleServiceImpl extends AbstractObserveService implement } @Override - public void getObsoleteEspeceForNonTargetSample(String setSeineId, - List<Species> speciessUsed, - Collection<Species> speciessToDelete, - List<NonTargetLength> tailleToDelete) { + public List<NonTargetLength> getObsoleteNonTargetLengths(String setSeineId, Set<String> speciessUsed) { SetSeine setSeine = findByTopiaId(SetSeine.class, setSeineId); - if (setSeine.isNonTargetSampleEmpty()) { - return; - } + List<NonTargetLength> nonTargetLengthsToDelete = new ArrayList<NonTargetLength>(); - NonTargetSample echantillon = setSeine.getNonTargetSample().get(0); + if (!setSeine.isNonTargetSampleEmpty()) { - if (echantillon.isNonTargetLengthEmpty()) { - return; - } + NonTargetSample nonTargetSample = setSeine.getNonTargetSample().get(0); + + if (!nonTargetSample.isNonTargetLengthEmpty()) { + + for (NonTargetLength taille : nonTargetSample.getNonTargetLength()) { + + Species species = taille.getSpecies(); + if (!speciessUsed.contains(species.getTopiaId())) { + + // l'espèce n'existe plus dans les rejet faune, on doit le supprimer + nonTargetLengthsToDelete.add(taille); + if (log.isDebugEnabled()) { + log.debug("remove obsolote echantillon " + taille + " for species " + species); + } + + } - for (NonTargetLength taille : echantillon.getNonTargetLength()) { - Species tailleEspece = taille.getSpecies(); - if (!speciessUsed.contains(tailleEspece)) { - // l'species n'existe plus dans les rejet faune, - // on doit le supprimer - tailleToDelete.add(taille); - speciessToDelete.add(tailleEspece); - if (log.isDebugEnabled()) { - log.debug("remove obsolote echantillon " + taille + " for species " + tailleEspece); } + } + } + return nonTargetLengthsToDelete; } @@ -161,11 +164,11 @@ public class NonTargetSampleServiceImpl extends AbstractObserveService implement } @Override - public NonTargetSample onUpdate(SetSeine parentBean, NonTargetSample toSave, NonTargetSample beanToSave) { + public NonTargetSample onUpdate(SetSeine parentBean, NonTargetSample toUpdate, NonTargetSample updated) { - copyExcluding(NonTargetSample.class, BinderService.EDIT, toSave, beanToSave, NonTargetSample.PROPERTY_NON_TARGET_LENGTH); - getDao().update(beanToSave); - return beanToSave; + copyExcluding(NonTargetSample.class, BinderService.EDIT, toUpdate, updated, NonTargetSample.PROPERTY_NON_TARGET_LENGTH); + getDao().update(updated); + return updated; } }); @@ -175,8 +178,9 @@ public class NonTargetSampleServiceImpl extends AbstractObserveService implement } @Override - public void delete(String setId, NonTargetSample bean) { - doDelete(setId, bean.getTopiaId(), new DeleteAction<SetSeine, NonTargetSample>(SetSeine.class, NonTargetSample.class) { + public void delete(String setId, NonTargetSample toDelete) { + + doDelete(setId, toDelete.getTopiaId(), new DeleteAction<SetSeine, NonTargetSample>(SetSeine.class, NonTargetSample.class) { @Override public void onDelete(SetSeine parent, NonTargetSample toDelete) { diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteService.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteService.java index 72efcf3..76976c9 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteService.java @@ -18,8 +18,6 @@ public interface RouteService extends ObserveService { Route getRouteStub(String routeId); - Route loadForDisplay(String routeId); - Route loadForEdit(String routeId); Route preCreate(String tripSeineId); diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteServiceImpl.java index c524c74..533f3a7 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/RouteServiceImpl.java @@ -37,7 +37,7 @@ public class RouteServiceImpl extends AbstractObserveService implements RouteSer } @Override - public Route loadForDisplay(String routeId) { + public Route loadForEdit(String routeId) { Route loaded = getDao().newInstance(); Route toLoad = getDao().findByTopiaId(routeId); @@ -54,12 +54,6 @@ public class RouteServiceImpl extends AbstractObserveService implements RouteSer } @Override - public Route loadForEdit(String routeId) { - Route loaded = loadForDisplay(routeId); - return loaded; - } - - @Override public Route preCreate(String tripSeineId) { TripSeine tripLongline = findByTopiaId(TripSeine.class, tripSeineId); diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/SetSeineServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/SetSeineServiceImpl.java index ed9bd24..87b0113 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/SetSeineServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/SetSeineServiceImpl.java @@ -38,8 +38,9 @@ public class SetSeineServiceImpl extends AbstractObserveService implements SetSe @Override public SetSeine loadForEdit(String setSeineId) { - SetSeine loaded = getDao().newInstance(); - SetSeine toLoad = getDao().findByTopiaId(setSeineId); + SetSeineDAO dao = getDao(); + SetSeine loaded = dao.newInstance(); + SetSeine toLoad = dao.findByTopiaId(setSeineId); copy(SetSeine.class, BinderService.EDIT, toLoad, loaded); //FIXME See why need this ? diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchService.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchService.java new file mode 100644 index 0000000..0ae9764 --- /dev/null +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchService.java @@ -0,0 +1,28 @@ +package fr.ird.observe.services.data.seine; + +import fr.ird.observe.entities.seine.SetSeine; +import fr.ird.observe.entities.seine.TargetLength; +import fr.ird.observe.services.Commit; +import fr.ird.observe.services.ObserveService; + +import java.util.List; + +/** + * Created on 5/2/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public interface TargetCatchService extends ObserveService { + + SetSeine loadForEdit(String setSeineId); + + SetSeine loadForEditDiscarded(String setSeineId); + + @Commit + void save(SetSeine setSeinetoSave, List<TargetLength> targetLengthsToDelete); + + @Commit + void saveForDiscarded(SetSeine setSeinetoSave, List<TargetLength> targetLengthsToDelete); + +} diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchServiceImpl.java new file mode 100644 index 0000000..e2155d1 --- /dev/null +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetCatchServiceImpl.java @@ -0,0 +1,164 @@ +package fr.ird.observe.services.data.seine; + +import com.google.common.base.Predicate; +import fr.ird.observe.BinderService; +import fr.ird.observe.entities.referentiel.seine.WeightCategory; +import fr.ird.observe.entities.seine.SetSeine; +import fr.ird.observe.entities.seine.TargetCatch; +import fr.ird.observe.entities.seine.TargetCatches; +import fr.ird.observe.entities.seine.TargetLength; +import fr.ird.observe.entities.seine.TargetSample; +import fr.ird.observe.services.AbstractObserveService; +import fr.ird.observe.services.referential.ReferentialService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.TopiaDAO; +import org.nuiton.topia.persistence.util.EntityListUpdator; +import org.nuiton.topia.persistence.util.TopiaEntityBinder; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created on 5/2/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.0 + */ +public class TargetCatchServiceImpl extends AbstractObserveService implements TargetCatchService { + + /** Logger. */ + private static final Log log = LogFactory.getLog(TargetCatchServiceImpl.class); + + @Override + public SetSeine loadForEdit(String setSeineId) { + + SetSeine loaded = load(setSeineId, BinderService.EDIT_TARGET_CATCH, TargetCatches.TARGET_CATCH_IS_NOT_DISCARDED); + return loaded; + + } + + @Override + public SetSeine loadForEditDiscarded(String setSeineId) { + + SetSeine loaded = load(setSeineId, BinderService.EDIT_DISCARD_TARGET_CATCH, TargetCatches.TARGET_CATCH_IS_DISCARDED); + return loaded; + + } + + @Override + public void save(SetSeine setSeinetoSave, final List<TargetLength> targetLengthsToDelete) { + + save(setSeinetoSave, BinderService.EDIT_TARGET_CATCH, TargetCatches.TARGET_CATCH_IS_NOT_DISCARDED, targetLengthsToDelete); + + } + + @Override + public void saveForDiscarded(SetSeine setSeinetoSave, final List<TargetLength> targetLengthsToDelete) { + + save(setSeinetoSave, BinderService.EDIT_DISCARD_TARGET_CATCH, TargetCatches.TARGET_CATCH_IS_DISCARDED, targetLengthsToDelete); + + } + + protected SetSeine load(String setId, String binderContext, Predicate<TargetCatch> predicate) { + + TopiaDAO<SetSeine> setSeineDao = getDao(SetSeine.class); + SetSeine toLoad = setSeineDao.findByTopiaId(setId); + SetSeine loaded = setSeineDao.newInstance(); + + copyExcluding(SetSeine.class, binderContext, toLoad, loaded, SetSeine.PROPERTY_TARGET_CATCH); + + if (!toLoad.isTargetCatchEmpty()) { + + ReferentialService referentialService = newService(ReferentialService.class); + + TopiaDAO<TargetCatch> dao = getDao(TargetCatch.class); + TopiaEntityBinder<TargetCatch> binder = getBinder(TargetCatch.class, binderContext); + + List<TargetCatch> childsLoaded = new ArrayList<TargetCatch>(); + + for (TargetCatch childToLoad : toLoad.getTargetCatch()) { + + if (predicate.apply(childToLoad)) { + + WeightCategory weightCategory = childToLoad.getWeightCategory(); + if (weightCategory != null) { + referentialService.loadDecoratedWeightCategory(weightCategory); + } + + TargetCatch childLoaded = dao.newInstance(); + binder.load(childToLoad, childLoaded, true); + childsLoaded.add(childLoaded); + + } + + } + + loaded.setTargetCatch(childsLoaded); + + } + + return loaded; + + } + + void save(SetSeine setSeinetoSave, String binderContext, final Predicate<TargetCatch> predicate, final List<TargetLength> targetLengthsToDelete) { + + TopiaEntityBinder<SetSeine> parentBinder = getBinder(SetSeine.class, binderContext); + TopiaEntityBinder<TargetCatch> childBinder = getBinder(TargetCatch.class, binderContext); + + doSaveList(setSeinetoSave, new SaveCollectionAction<SetSeine, TargetCatch>( + SetSeine.class, TargetCatch.class, getListUpdator(), parentBinder, childBinder) { + + @Override + public void onUpdateFinalize(SetSeine parent, Collection<TargetCatch> oldChilds) throws TopiaException { + + if (CollectionUtils.isNotEmpty(oldChilds)) { + + Collection<TargetCatch> targetCatchesToReinject = new ArrayList<TargetCatch>(); + + for (TargetCatch oldChild : oldChilds) { + + if (predicate.apply(oldChild)) { + + // on réinjecte cette capture + targetCatchesToReinject.add(oldChild); + + } + + } + + parent.addAllTargetCatch(targetCatchesToReinject); + + } + + if (CollectionUtils.isNotEmpty(targetLengthsToDelete)) { + + // suppression des échantillons obsoletes + + if (log.isInfoEnabled()) { + log.info("Will remove " + targetLengthsToDelete.size() + " obsolete targetLength(s)."); + } + + TargetSample targetSample = parent.getTargetSample().get(0); + + // on supprime les echantillons obsoletes + targetSample.getTargetLength().removeAll(targetLengthsToDelete); + + } + } + }); + + } + + protected EntityListUpdator<SetSeine, TargetCatch> getListUpdator() { + return EntityListUpdator.newEntityListUpdator( + SetSeine.class, + TargetCatch.class, + SetSeine.PROPERTY_TARGET_CATCH); + } + +} diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java index 689f730..c1b2d32 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java @@ -6,8 +6,8 @@ import fr.ird.observe.entities.seine.TargetSample; import fr.ird.observe.services.Commit; import fr.ird.observe.services.ObserveService; -import java.util.Collection; import java.util.List; +import java.util.Set; /** * Created on 4/26/15. @@ -17,20 +17,18 @@ import java.util.List; */ public interface TargetSampleService extends ObserveService { - List<Species> getAvailableEspeceForTargetSample(String setSeineId, boolean discarded); + List<Species> getAvailableSpeciesForTargetSample(String setSeineId, boolean discarded); + + List<TargetLength> getObsoleteTargetLengths(String setSeineId, Set<String> speciesIdsUsed, boolean discarded); TargetSample getTargetSample(String setSeineId, boolean discarded); boolean canUseTargetSample(String setSeineId, boolean discarded); - void getObsoleteEspeceForTargetSample(String setSeineId, - Collection<Species> speciessUsed, - Collection<Species> speciessToDelete, - List<TargetLength> tailleToDelete, - boolean discarded); @Commit - void delete(String setId, TargetSample bean); + String save(String setSeineId, TargetSample toSave); @Commit - String save(String setSeineId, TargetSample toSave); + void delete(String setId, TargetSample bean); + } diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java index 2ce82b8..8735b1b 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java @@ -16,6 +16,7 @@ import org.nuiton.topia.persistence.util.TopiaEntityBinder; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Set; /** * Created on 4/26/15. @@ -37,7 +38,7 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T } @Override - public List<Species> getAvailableEspeceForTargetSample(String setSeineId, boolean discarded) { + public List<Species> getAvailableSpeciesForTargetSample(String setSeineId, boolean discarded) { List<Species> speciesList = new ArrayList<Species>(); @@ -136,48 +137,36 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T } @Override - public void getObsoleteEspeceForTargetSample(String setSeineId, - Collection<Species> speciessUsed, - Collection<Species> speciessToDelete, - List<TargetLength> tailleToDelete, - boolean discarded) { + public List<TargetLength> getObsoleteTargetLengths(String setSeineId, Set<String> speciesIdsUsed, boolean discarded) { SetSeine setSeine = findByTopiaId(SetSeine.class, setSeineId); - if (setSeine.isTargetSampleEmpty()) { - return; - } + List<TargetLength> targetLengthsToDelete = new ArrayList<TargetLength>(); - TargetSample echantillon = setSeine.getTargetSample(discarded); + if (!setSeine.isTargetSampleEmpty()) { - if (echantillon == null || echantillon.isTargetLengthEmpty()) { - return; - } + TargetSample targetSample = setSeine.getTargetSample(discarded); + if (targetSample != null && !targetSample.isTargetLengthEmpty()) { + + for (TargetLength targetLength : targetSample.getTargetLength()) { + + Species species = targetLength.getSpecies(); + + if (!speciesIdsUsed.contains(species.getTopiaId())) { + // l'espèce n'existe plus dans les rejet faune, on doit le supprimer + targetLengthsToDelete.add(targetLength); + if (log.isDebugEnabled()) { + log.debug("remove obsolote echantillon " + targetLength + " for species " + species); + } + } - for (TargetLength taille : echantillon.getTargetLength()) { - Species tailleEspece = taille.getSpecies(); - if (!speciessUsed.contains(tailleEspece)) { - // l'species n'existe plus dans les rejet faune, - // on doit le supprimer - tailleToDelete.add(taille); - speciessToDelete.add(tailleEspece); - if (log.isDebugEnabled()) { - log.debug("remove obsolote echantillon " + taille + " for species " + tailleEspece); } + } - } - } + } - @Override - public void delete(String setId, TargetSample bean) { - doDelete(setId, bean.getTopiaId(), new DeleteAction<SetSeine, TargetSample>(SetSeine.class, TargetSample.class) { - @Override - public void onDelete(SetSeine parent, TargetSample toDelete) { - super.onDelete(parent, toDelete); - parent.removeTargetSample(toDelete); - } - }); + return targetLengthsToDelete; } @@ -196,11 +185,11 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T } @Override - public TargetSample onUpdate(SetSeine parentBean, TargetSample toSave, TargetSample beanToSave) { + public TargetSample onUpdate(SetSeine parentBean, TargetSample toUpdate, TargetSample updated) { - copyExcluding(TargetSample.class, BinderService.EDIT, toSave, beanToSave, TargetSample.PROPERTY_TARGET_LENGTH); - getDao().update(beanToSave); - return beanToSave; + copyExcluding(TargetSample.class, BinderService.EDIT, toUpdate, updated, TargetSample.PROPERTY_TARGET_LENGTH); + getDao().update(updated); + return updated; } }); @@ -209,4 +198,16 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T } + @Override + public void delete(String setId, TargetSample bean) { + doDelete(setId, bean.getTopiaId(), new DeleteAction<SetSeine, TargetSample>(SetSeine.class, TargetSample.class) { + @Override + public void onDelete(SetSeine parent, TargetSample toDelete) { + super.onDelete(parent, toDelete); + parent.removeTargetSample(toDelete); + } + }); + + } + } diff --git a/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialService.java b/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialService.java index 5ae0df8..654a379 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialService.java @@ -34,6 +34,8 @@ public interface ReferentialService extends ObserveService { List<WeightCategory> loadDecoratedWeightCategory(); + void loadDecoratedWeightCategory(WeightCategory weightCategory); + Set<String> getSpeciesListSpeciesIds(String speciesListId); <R extends ReferenceEntity> R preCreate(Class<R> entityType); diff --git a/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialServiceImpl.java index 270858f..fa3c99a 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/referential/ReferentialServiceImpl.java @@ -123,6 +123,14 @@ public class ReferentialServiceImpl extends AbstractObserveService implements Re } @Override + public void loadDecoratedWeightCategory(WeightCategory weightCategory) { + + decorate(WeightCategory.class, weightCategory); + decorate(Species.class, weightCategory.getSpecies()); + + } + + @Override public Set<String> getSpeciesListSpeciesIds(String speciesListId) { SpeciesList speciesList = findByTopiaId(SpeciesList.class, speciesListId); diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIHandler.java index 01dad8b..1ef2472 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIHandler.java @@ -22,7 +22,6 @@ package fr.ird.observe.ui.content; import fr.ird.observe.BinderService; -import fr.ird.observe.DataService; import fr.ird.observe.DecoratorService; import fr.ird.observe.ObserveContext; import fr.ird.observe.ObserveServiceHelper; @@ -64,6 +63,8 @@ import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JToolBar; import javax.swing.UIManager; +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; import java.awt.Component; import java.util.ArrayList; import java.util.List; @@ -92,15 +93,15 @@ public abstract class ContentUIHandler<E extends TopiaEntity> { /** l'interface graphique que le controleur utilise */ protected ObserveContentUI<E> ui; - public ContentUIHandler(ObserveContentUI<E> ui, DataContextType parentType, DataContextType type) { + protected ContentUIHandler(ObserveContentUI<E> ui, DataContextType parentType, DataContextType type) { this.ui = ui; this.parentType = parentType; this.type = type; - prefix = "[" + ui.getClass().getSimpleName() + "] "; + this.prefix = "[" + ui.getClass().getSimpleName() + "] "; if (log.isDebugEnabled()) { log.debug("New handler [" + this + "] for ui " + prefix); } - errorIcon = UIManager.getIcon("action.error"); + this.errorIcon = UIManager.getIcon("action.error"); } public static <E extends TopiaEntity> ContentUIHandler<E> newHandler(ObserveContentUI<E> ui) { @@ -301,22 +302,14 @@ public abstract class ContentUIHandler<E extends TopiaEntity> { return ObserveContext.get().getBinderService(); } - public <E extends TopiaEntity> void copy(Class<E> type, String context, E source, E target) { + public <EE extends TopiaEntity> void copy(Class<EE> type, String context, EE source, EE target) { getBinderService().copy(type, context, source, target); } - public <E extends TopiaEntity> void copyExcluding(Class<E> type, String context, E source, E target, String... propertyNames) { - getBinderService().copyExcluding(type, context, source, target, propertyNames); - } - - public <E extends TopiaEntity> void copy(Class<E> type, String context, E source, E target, boolean bindTechnical) { + public <EE extends TopiaEntity> void copy(Class<EE> type, String context, EE source, EE target, boolean bindTechnical) { getBinderService().copy(type, context, source, target, bindTechnical); } - public <E extends TopiaEntity> TopiaEntityBinder<E> getBinder(Class<E> type, String context) { - return getBinderService().getBinder(type, context); - } - protected DataSource getDataSource() { return ui.getDataSource(); } @@ -613,19 +606,6 @@ public abstract class ContentUIHandler<E extends TopiaEntity> { } } -// protected E onCreate(TopiaContext tx, Object parentBean, E editBean) throws TopiaException { -// return editBean; -// } -// -// protected E onUpdate(TopiaContext tx, Object parentBean, E beanToSave) throws TopiaException { -// // rien par defaut -// return beanToSave; -// } -// -// protected void onDelete(TopiaContext tx, Object parentBean, E beanToDelete) throws TopiaException { -// // rien par defaut -// } - protected void addInfoMessage(String message) { addMessage(ui, NuitonValidatorScope.INFO, @@ -649,26 +629,6 @@ public abstract class ContentUIHandler<E extends TopiaEntity> { return getModel().getLoadBinder(); } -// protected final TopiaExecutor<E> getLoadExecutor() { -// return loadExecutor; -// } -// -// protected final TopiaExecutor2<? extends TopiaEntity, E> getPreCreateExecutor() { -// return preCreateExecutor; -// } -// -// protected final TopiaExecutor2<? extends TopiaEntity, E> getCreateExecutor() { -// return createExecutor; -// } -// -// protected final TopiaExecutor2<? extends TopiaEntity, E> getUpdateExecutor() { -// return updateExecutor; -// } -// -// protected final TopiaExecutor2<? extends TopiaEntity, E> getDeleteExecutor() { -// return deleteExecutor; -// } - protected final ContentMode computeContentMode() { ContentMode mode; @@ -693,10 +653,6 @@ public abstract class ContentUIHandler<E extends TopiaEntity> { return contextName; } - protected final DataService getDataService() { - return ObserveContext.get().getDataService(); - } - protected final <S extends ObserveService> S getService(Class<S> serviceType) { return ObserveContext.get().getService(serviceType); } @@ -805,4 +761,15 @@ public abstract class ContentUIHandler<E extends TopiaEntity> { quadrantBG.add(editor.getQuadrant4()); } + + protected void setQuadrant(CoordinatesEditor editor, Integer quadrant) { + editor.setQuadrant(null); + editor.setQuadrant(quadrant); + } + + protected void reloadTableModelListener(TableModel tableModel, TableModelListener listener) { + tableModel.removeTableModelListener(listener); + tableModel.addTableModelListener(listener); + } + } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIModel.java index 48eb5af..42f3797 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/ContentUIModel.java @@ -137,35 +137,9 @@ public abstract class ContentUIModel<E extends TopiaEntity> extends AbstractSeri } public final TopiaEntityBinder<E> getLoadBinder() { - -// if (loadBinder == null) { -// -// BinderService binderService = ObserveServiceHelper.get().getBinderService(); -// -// String binderName = getClass().getName() + "-open"; -// TopiaEntityBinder<E> r = binderService.getTopiaBinder(beanType, binderName); -// if (r == null) { -// -// BinderModelBuilder<E, E> builder = createOpeningBinder(binderService, binderName); -// -// if (builder != null) { -// -// r = binderService.registerTopiaBinder(beanType, builder, binderName); -// -// } -// -// } -// -// loadBinder = r; -// -// } - return loadBinder; - } -// protected abstract BinderModelBuilder<E, E> createOpeningBinder(BinderService binderService, String binderName); - public E getBean() { return bean; } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/LonglineGlobalCompositionUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/LonglineGlobalCompositionUIHandler.java index 3a5fec7..70d3ef9 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/LonglineGlobalCompositionUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/LonglineGlobalCompositionUIHandler.java @@ -50,7 +50,7 @@ import static org.nuiton.i18n.I18n.t; public class LonglineGlobalCompositionUIHandler extends ContentUIHandler<SetLongline> { /** Logger */ - static private Log log = LogFactory.getLog(LonglineGlobalCompositionUIHandler.class); + public static final Log log = LogFactory.getLog(LonglineGlobalCompositionUIHandler.class); public LonglineGlobalCompositionUIHandler(LonglineGlobalCompositionUI ui) { super(ui, DataContextType.ActivityLongline, DataContextType.SetLongline); @@ -142,7 +142,7 @@ public class LonglineGlobalCompositionUIHandler extends ContentUIHandler<SetLong // utilisation du mode requis setContentMode(mode); - if (mode != ContentMode.READ) { + if (ContentMode.READ != mode) { getUi().startEdit(null); } @@ -184,7 +184,7 @@ public class LonglineGlobalCompositionUIHandler extends ContentUIHandler<SetLong } @Override - protected boolean doSave(SetLongline bean) throws Exception { + protected boolean doSave(SetLongline bean) { copy(SetLongline.class, BinderService.EDIT_FLOATLINES_COMPOSITION, getUi().getFloatlinesCompositionUI().getBean(), bean); copy(SetLongline.class, BinderService.EDIT_BRANCHLINES_COMPOSITION, getUi().getBranchlinesCompositionUI().getBean(), bean); diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/SetLonglineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/SetLonglineUIHandler.java index 7cf9f43..34e4f92 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/SetLonglineUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/longline/SetLonglineUIHandler.java @@ -145,6 +145,9 @@ public class SetLonglineUIHandler extends ContentUIHandler<SetLongline> { super.initUI(); + // listen messages to see if required to add + reloadTableModelListener(getUi().getErrorTableModel(), computeTabValidStateListener); + getUi().getSettingStartTimeStamp().getSliderHidor().addPropertyChangeListener(HidorButton.PROPERTY_TARGET_VISIBLE, onToogleTimeEditorSliderChangedListener); getUi().getSettingEndTimeStamp().getSliderHidor().addPropertyChangeListener(HidorButton.PROPERTY_TARGET_VISIBLE, onToogleTimeEditorSliderChangedListener); getUi().getHaulingStartTimeStamp().getSliderHidor().addPropertyChangeListener(HidorButton.PROPERTY_TARGET_VISIBLE, onToogleTimeEditorSliderChangedListener); @@ -226,15 +229,10 @@ public class SetLonglineUIHandler extends ContentUIHandler<SetLongline> { // utilisation du mode requis setContentMode(mode); - // To be sure always remove listener (could prevent some leaks) - getUi().getErrorTableModel().removeTableModelListener(computeTabValidStateListener); - // listen messages to see if required to add - getUi().getErrorTableModel().addTableModelListener(computeTabValidStateListener); - SwingValidatorMessageTableModel errorTableModel = getUi().getErrorTableModel(); computeTabValidState(errorTableModel); - if (mode != ContentMode.READ) { + if (ContentMode.READ != mode) { getUi().startEdit(null); } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/ActivitySeineObservedSystemUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/ActivitySeineObservedSystemUIHandler.java index 86ace0a..149899d 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/ActivitySeineObservedSystemUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/ActivitySeineObservedSystemUIHandler.java @@ -109,6 +109,7 @@ public class ActivitySeineObservedSystemUIHandler extends ContentUIHandler<Activ copy(ActivitySeine.class, BinderService.EDIT_OBSERVED_SYSTEM, saved, bean); return true; + } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/SetSeineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/SetSeineUIHandler.java index 1fe72ea..d8dc84c 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/SetSeineUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/impl/seine/SetSeineUIHandler.java @@ -137,10 +137,8 @@ public class SetSeineUIHandler extends ContentUIHandler<SetSeine> { super.initUI(); - // To be sure always remove listener (could prevent some leaks) - getUi().getErrorTableModel().removeTableModelListener(computeTabValidStateListener); // listen messages to see if required to add - getUi().getErrorTableModel().addTableModelListener(computeTabValidStateListener); + reloadTableModelListener(getUi().getErrorTableModel(), computeTabValidStateListener); getUi().getStartTime().getSliderHidor().addPropertyChangeListener(HidorButton.PROPERTY_TARGET_VISIBLE, onToogleTimeEditorSliderChangedListener); getUi().getEndPursingTimeStamp().getSliderHidor().addPropertyChangeListener(HidorButton.PROPERTY_TARGET_VISIBLE, onToogleTimeEditorSliderChangedListener); @@ -199,7 +197,7 @@ public class SetSeineUIHandler extends ContentUIHandler<SetSeine> { SwingValidatorMessageTableModel errorTableModel = getUi().getErrorTableModel(); computeTabValidState(errorTableModel); - if (mode != ContentMode.READ) { + if (ContentMode.READ != mode) { getUi().startEdit(null); } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/ContentOpenableUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/ContentOpenableUIHandler.java index 1b52eef..7aafb12 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/ContentOpenableUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/ContentOpenableUIHandler.java @@ -55,6 +55,20 @@ public abstract class ContentOpenableUIHandler<E extends TopiaEntity & OpenableE protected final String closeMessage; + /** + * Méthode invoquée à chaque ouverture de l'écran. + * + * La méthode est invoquée par {@link #openUI()}. + * + * @param selectedParentId l'id du parent sélectionné + * @param selectedId l'id de l'entité de l'écran, peut être {@code null} en cas de création. + * @param mode le mode de l'écran + * @since 4.0 + */ + protected abstract void onOpenUI(String selectedParentId, String selectedId, ContentMode mode); + + protected abstract boolean obtainCanReopen(boolean create); + protected ContentOpenableUIHandler(ContentOpenableUI<E> ui, DataContextType parentType, DataContextType type, @@ -65,8 +79,6 @@ public abstract class ContentOpenableUIHandler<E extends TopiaEntity & OpenableE } - protected abstract boolean obtainCanReopen(boolean create); - protected void updateOpenState(String beanId, boolean openState) { OpenableService service = getService(OpenableService.class); service.updateOpenState(beanId, openState); @@ -88,6 +100,29 @@ public abstract class ContentOpenableUIHandler<E extends TopiaEntity & OpenableE } @Override + public void openUI() throws Exception { + + super.openUI(); + + String selectedParentId = getSelectedParentId(); + String selectedId = getSelectedId(); + ContentMode mode = computeContentMode(); + + if (log.isInfoEnabled()) { + log.info(prefix + "selectedParentId = " + selectedParentId); + log.info(prefix + "selectedId = " + selectedId); + log.info(prefix + "content mode = " + mode); + } + + onOpenUI(selectedParentId, selectedId, mode); + + boolean create = selectedId == null; + + finalizeOpenUI(mode, create); + + } + + @Override protected boolean computeCanWrite(DataSource source) { return source.canWriteData(); } @@ -297,6 +332,7 @@ public abstract class ContentOpenableUIHandler<E extends TopiaEntity & OpenableE log.debug("PARENT NODE = " + parentNode); } treeHelper.addUnsavedNode(parentNode, getBeanType()); + } protected final void obtainChildPosition(E bean) throws DataSourceException { @@ -310,6 +346,7 @@ public abstract class ContentOpenableUIHandler<E extends TopiaEntity & OpenableE } getUi().setContextValue(position, POSITION_OPENABLE); + } protected final void finalizeOpenUI(ContentMode mode, boolean create) { @@ -345,7 +382,7 @@ public abstract class ContentOpenableUIHandler<E extends TopiaEntity & OpenableE } model.setCanReopen(canReopen); - if (mode != ContentMode.READ) { + if (ContentMode.READ != mode) { getUi().startEdit(null); } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/ActivityLonglineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/ActivityLonglineUIHandler.java index 61e8c9a..bc11d0a 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/ActivityLonglineUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/ActivityLonglineUIHandler.java @@ -33,6 +33,7 @@ import fr.ird.observe.ui.content.ContentUIModel; import fr.ird.observe.ui.content.open.ContentOpenableUIHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.widgets.gis.absolute.CoordinatesEditor; import org.nuiton.validator.NuitonValidatorScope; import static org.nuiton.i18n.I18n.n; @@ -77,18 +78,18 @@ public class ActivityLonglineUIHandler extends ContentOpenableUIHandler<Activity // mode creation return ContentMode.CREATE; + } - // l'activity existe en base + // l'activité existe en base if (dataContext.isSelectedOpen(ActivityLongline.class)) { - // l'activity est ouverte, donc modifiable + // l'activité est ouverte, donc modifiable return ContentMode.UPDATE; - } - ActivityLonglineUI ui = getUi(); + } - // l'activity n'est pas ouverte, donc pas éditable + // l'activité n'est pas ouverte, donc pas éditable if (!dataContext.isSelectedOpen(TripLongline.class)) { // la marée n'est pas ouverte @@ -100,35 +101,25 @@ public class ActivityLonglineUIHandler extends ContentOpenableUIHandler<Activity if (getModel().isHistoricalData()) { addInfoMessage(t("observe.message.historical.data")); + } } else { - // seule l'activity n'est pas ouverte + // seule l'activité n'est pas ouverte addInfoMessage(t(closeMessage)); + } return ContentMode.READ; + } @Override - public void openUI() throws Exception { - super.openUI(); - - resetQuadrant(getUi().getCoordinatesEditor()); - - String tripId = getSelectedParentId(); - String activityId = getSelectedId(); - - if (log.isInfoEnabled()) { - log.info(prefix + "tripId = " + tripId); - log.info(prefix + "activityId = " + activityId); - } + protected void onOpenUI(String tripId, String activityId, ContentMode mode) { - ContentMode mode = computeContentMode(); - if (log.isInfoEnabled()) { - log.info(prefix + "content mode " + mode); - } + CoordinatesEditor coordinatesEditor = getUi().getCoordinatesEditor(); + resetQuadrant(coordinatesEditor); boolean create = activityId == null; @@ -143,39 +134,32 @@ public class ActivityLonglineUIHandler extends ContentOpenableUIHandler<Activity } else { // update mode - if (mode == ContentMode.UPDATE) { - loaded = service.loadForEdit(activityId); - } else { - loaded = service.loadForDisplay(activityId); - } + loaded = service.loadForEdit(activityId); } ActivityLongline bean = getBean(); copy(ActivityLongline.class, BinderService.EDIT, loaded, bean); - finalizeOpenUI(mode, create); - - getUi().getCoordinatesEditor().setLatitudeAndLongitude(bean.getLatitude(), bean.getLongitude()); + coordinatesEditor.setLatitudeAndLongitude(bean.getLatitude(), bean.getLongitude()); if (create) { + + // on positionne le quadrant (celui de l'activité précédent si elle existe) Integer quadrant = bean.getQuadrant(); - getUi().getCoordinatesEditor().setQuadrant(null); - getUi().getCoordinatesEditor().setQuadrant(quadrant); + setQuadrant(coordinatesEditor, quadrant); + } - // on annule la modification engendree par ce binding - getModel().setModified(create); } @Override public void startEditUI(String... binding) { - ActivityLonglineUI ui = getUi(); ContentUIModel<ActivityLongline> model = getModel(); boolean create = model.getMode() == ContentMode.CREATE; String contextName = getValidatorContextName(model.getMode()); - ui.getValidator().setContext(contextName); + getUi().getValidator().setContext(contextName); if (create) { addMessage(ui, NuitonValidatorScope.INFO, @@ -196,7 +180,9 @@ public class ActivityLonglineUIHandler extends ContentOpenableUIHandler<Activity ActivityLonglineUI.BINDING_FPA_ZONE_SELECTED_ITEM, ActivityLonglineUI.BINDING_CLOSE_ENABLED, ActivityLonglineUI.BINDING_CLOSE_AND_CREATE_ENABLED); + model.setModified(create); + } @Override @@ -232,9 +218,6 @@ public class ActivityLonglineUIHandler extends ContentOpenableUIHandler<Activity ActivityLonglineService service = getService(ActivityLonglineService.class); String tripId = getSelectedParentId(); service.delete(tripId, bean.getTopiaId()); - if (log.isInfoEnabled()) { - log.info("Delete done for Activity " + bean.getTopiaId()); - } result = true; } @@ -255,6 +238,7 @@ public class ActivityLonglineUIHandler extends ContentOpenableUIHandler<Activity dataContext.isSelectedOpen(TripLongline.class) && !dataContext.isOpenActivity(); return canReopen; + } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/TripLonglineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/TripLonglineUIHandler.java index 9d0b3c8..a85a3ed 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/TripLonglineUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/longline/TripLonglineUIHandler.java @@ -87,11 +87,14 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline } addInfoMessage(t(closeMessage)); + return ContentMode.READ; + } @Override public void initUI() throws Exception { + super.initUI(); TripLonglineUI ui = getUi(); @@ -131,19 +134,7 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline } @Override - public void openUI() throws Exception { - super.openUI(); - - ContentMode mode = computeContentMode(); - - String programId = getSelectedParentId(); - String tripId = getSelectedId(); - - if (log.isInfoEnabled()) { - log.info(prefix + "programId = " + programId); - log.info(prefix + "tripId = " + tripId); - log.info(prefix + "mode = " + mode); - } + protected void onOpenUI(String programId, String tripId, ContentMode mode) { TripLongline loaded; @@ -154,24 +145,19 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline if (create) { // create mode - - if (log.isInfoEnabled()) { - log.info(prefix + "create a new trip"); - } - loaded = service.preCreate(programId); } else { // update mode - if (log.isInfoEnabled()) { - log.info(prefix + "using existing trip " + tripId); - } + if (ContentMode.UPDATE == mode) { - if (mode == ContentMode.UPDATE) { loaded = service.loadForEdit(tripId); + } else { + loaded = service.loadForDisplay(tripId); + } } @@ -181,14 +167,11 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline getUi().getTripLonglineTabPane().setSelectedIndex(0); buildTripMap = true; - finalizeOpenUI(mode, create); } @Override public void startEditUI(String... binding) { - TripLonglineUI ui = getUi(); - ContentOpenableUIModel<TripLongline> model = getModel(); ContentMode mode = model.getMode(); @@ -196,7 +179,7 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline boolean create = mode == ContentMode.CREATE; String contextName = getValidatorContextName(mode); - ui.getValidator().setContext(contextName); + getUi().getValidator().setContext(contextName); if (create) { addInfoMessage(t("observe.tripLongline.message.creating")); @@ -205,6 +188,7 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline if (model.isHistoricalData()) { addInfoMessage(t("observe.message.historical.data")); + } } @@ -221,7 +205,9 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline TripLonglineUI.BINDING_HOME_ID_TEXT, TripLonglineUI.BINDING_CLOSE_ENABLED, TripLonglineUI.BINDING_CLOSE_AND_CREATE_ENABLED); + model.setModified(create); + } @Override @@ -237,6 +223,7 @@ public class TripLonglineUIHandler extends ContentOpenableUIHandler<TripLongline obtainChildPosition(bean); return true; + } @Override diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java index 7e0e1fe..3b3ab5f 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java @@ -29,8 +29,8 @@ import fr.ird.observe.entities.seine.ActivitySeine; import fr.ird.observe.entities.seine.ActivitySeineImpl; import fr.ird.observe.entities.seine.Route; import fr.ird.observe.entities.seine.TripSeine; -import fr.ird.observe.services.referential.ReferentialService; import fr.ird.observe.services.data.seine.ActivitySeineService; +import fr.ird.observe.services.referential.ReferentialService; import fr.ird.observe.ui.content.ContentMode; import fr.ird.observe.ui.content.ContentUIModel; import fr.ird.observe.ui.content.open.ContentOpenableUIHandler; @@ -38,6 +38,7 @@ import jaxx.runtime.validator.swing.SwingValidatorMessage; import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.widgets.gis.absolute.CoordinatesEditor; import org.nuiton.validator.NuitonValidatorScope; import javax.swing.event.TableModelEvent; @@ -81,6 +82,16 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei } @Override + public void initUI() throws Exception { + + super.initUI(); + + // listen messages to see if required to add + reloadTableModelListener(getUi().getErrorTableModel(), computeTabValidStateListener); + + } + + @Override protected ContentMode getContentMode(DataContext dataContext) { String activityId = getSelectedId(); @@ -91,16 +102,15 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei return ContentMode.CREATE; } - // l'activity existe en base + // l'activité existe en base if (dataContext.isSelectedOpen(ActivitySeine.class)) { - // l'activity est ouverte, donc modifiable + // l'activité est ouverte, donc modifiable return ContentMode.UPDATE; - } - ActivitySeineUI ui = getUi(); + } - // l'activity n'est pas ouverte, donc pas éditable + // l'activité n'est pas ouverte, donc pas éditable if (!dataContext.isSelectedOpen(Route.class)) { // la route n'est pas ouverte @@ -120,47 +130,26 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei if (getModel().isHistoricalData()) { addInfoMessage(t("observe.message.historical.data")); + } } else { - // seule l'activity n'est pas ouverte + // seule l'activité n'est pas ouverte addInfoMessage(t(closeMessage)); + } return ContentMode.READ; - } - - @Override - public void initUI() throws Exception { - - super.initUI(); - - // To be sure always remove listener (could prevent some leaks) - getUi().getErrorTableModel().removeTableModelListener(computeTabValidStateListener); - // listen messages to see if required to add - getUi().getErrorTableModel().addTableModelListener(computeTabValidStateListener); } @Override - public void openUI() throws Exception { - super.openUI(); - - resetQuadrant(getUi().getCoordinatesEditor()); + protected void onOpenUI(String routeId, String activityId, ContentMode mode) { - String routeId = getSelectedParentId(); - String activityId = getSelectedId(); - - if (log.isInfoEnabled()) { - log.info(prefix + "routeId = " + routeId); - log.info(prefix + "activityId = " + activityId); - } + CoordinatesEditor coordinatesEditor = getUi().getCoordinatesEditor(); - ContentMode mode = computeContentMode(); - if (log.isInfoEnabled()) { - log.info(prefix + "content mode " + mode); - } + resetQuadrant(coordinatesEditor); boolean create = activityId == null; @@ -185,29 +174,25 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei SwingValidatorMessageTableModel errorTableModel = getUi().getErrorTableModel(); computeTabValidState(errorTableModel); - finalizeOpenUI(mode, create); - - getUi().getCoordinatesEditor().setLatitudeAndLongitude(bean.getLatitude(), bean.getLongitude()); + coordinatesEditor.setLatitudeAndLongitude(bean.getLatitude(), bean.getLongitude()); if (create) { + + // on positionne le quadrant (celui de l'activité précédent si elle existe) Integer quadrant = bean.getQuadrant(); - getUi().getCoordinatesEditor().setQuadrant(null); - getUi().getCoordinatesEditor().setQuadrant(quadrant); - } + setQuadrant(coordinatesEditor, quadrant); - // on annule la modification engendree par ce binding - getModel().setModified(create); + } } @Override public void startEditUI(String... binding) { - ActivitySeineUI ui = getUi(); ContentUIModel<ActivitySeine> model = getModel(); boolean create = model.getMode() == ContentMode.CREATE; String contextName = getValidatorContextName(model.getMode()); - ui.getValidator().setContext(contextName); + getUi().getValidator().setContext(contextName); if (create) { addMessage(ui, NuitonValidatorScope.INFO, @@ -215,9 +200,9 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei t("observe.activitySeine.message.creating")); } else { addMessage(ui, - NuitonValidatorScope.INFO, - getEntityLabel(ActivitySeine.class), - t("observe.activitySeine.message.updating")); + NuitonValidatorScope.INFO, + getEntityLabel(ActivitySeine.class), + t("observe.activitySeine.message.updating")); } super.startEditUI(ActivitySeineUI.BINDING_TIME_TIME, @@ -232,7 +217,9 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei ActivitySeineUI.BINDING_CLOSE_ENABLED, ActivitySeineUI.BINDING_ADD_SET_ENABLED, ActivitySeineUI.BINDING_CLOSE_AND_CREATE_ENABLED); + model.setModified(create); + } @Override diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java index 2fc2bd5..90ba8bc 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java @@ -42,6 +42,7 @@ import org.nuiton.validator.NuitonValidatorScope; import javax.swing.JOptionPane; import java.util.Date; +import java.util.List; import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; @@ -78,6 +79,7 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { // mode creation return ContentMode.CREATE; + } // route deja existante @@ -85,9 +87,8 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { // la route est ouverte return ContentMode.UPDATE; - } - RouteUI ui = getUi(); + } // route non ouverte if (!dataContext.isSelectedOpen(TripSeine.class)) { @@ -104,26 +105,11 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { t(closeMessage)); } return ContentMode.READ; + } @Override - public void openUI() throws Exception { - - super.openUI(); - - String tripId = getSelectedParentId(); - String routeId = getSelectedId(); - - if (log.isInfoEnabled()) { - log.info(prefix + "tripId = " + tripId); - log.info(prefix + "routeId = " + routeId); - } - - ContentMode mode = computeContentMode(); - - if (log.isInfoEnabled()) { - log.info(prefix + "content mode = " + mode); - } + protected void onOpenUI(String tripId, String routeId, ContentMode mode) { Route loaded; @@ -138,19 +124,13 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { } else { // update mode - if (mode == ContentMode.UPDATE) { - loaded = service.loadForEdit(routeId); - } else { - loaded = service.loadForDisplay(routeId); - } + loaded = service.loadForEdit(routeId); } Route bean = getBean(); copy(Route.class, BinderService.EDIT, loaded, bean); - finalizeOpenUI(mode, create); - } @Override @@ -159,9 +139,7 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { boolean create = getModel().getMode() == ContentMode.CREATE; String contextName = getValidatorContextName(getModel().getMode()); - RouteUI ui = getUi(); - - ui.getValidator().setContext(contextName); + getUi().getValidator().setContext(contextName); if (create) { addMessage(ui, @@ -189,6 +167,7 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { // le formulaire est en état modifié uniquement si on est en création getModel().setModified(create); + } @Override @@ -200,7 +179,6 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { log.info("will save route " + bean.getTopiaId()); } - bean.setOpen(true); RouteService service = getService(RouteService.class); @@ -214,64 +192,12 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { @Override protected void afterSave(boolean refresh) { + super.afterSave(refresh); repaintTripNode(); - } - @Override - protected void afterDelete() { - super.afterDelete(); - repaintTripNode(); } -// @Override -// protected Route onCreate(TopiaContext tx, Object parent, Route editBean) throws TopiaException { -// -// TripSeine parentBean = (TripSeine) parent; -// -// // creation de la route -// Route beanToSave = ObserveDAOHelper.getRouteDAO(tx).create(); -// editBean.setTopiaId(beanToSave.getTopiaId()); -// -// // ajout de la route dans la amree -// parentBean.addRoute(beanToSave); -// -// // on renseigne le jour d'observation car on en a besoin pour -// // mettre la date de fin de la maree -// beanToSave.setDate(editBean.getDate()); -// -// // on met a jour si necessaire la date de fin de la maree -// updateDateFin(parentBean); -// -// return beanToSave; -// } -// -// @Override -// protected Route onUpdate(TopiaContext tx, Object parent, Route beanToSave) throws TopiaException { -// -// TripSeine parentBean = (TripSeine) parent; -// -// Route editBean = getBean(); -// -// // on conserve l'ancienne date d'observation -// Date oldDate = DateUtil.getDay(beanToSave.getDate()); -// -// // recopie des propriétés vers le bean a sauver -// getLoadBinder().copyExcluding(editBean, beanToSave, Route.PROPERTY_ACTIVITY_SEINE); -// -// if (!oldDate.equals(editBean.getDate())) { -// -// // le jour a change, il faut mettre à jour les dates des activitys -// // et des sets -// beanToSave.updateDates(); -// } -// -// // on met a jour si necessaire la date de fin de la maree -// updateDateFin(parentBean); -// -// return beanToSave; -// } - @Override protected boolean doDelete(Route bean) { @@ -300,6 +226,14 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { } @Override + protected void afterDelete() { + + super.afterDelete(); + repaintTripNode(); + + } + + @Override public boolean doCloseData() throws Exception { Route route = getBean(); @@ -335,7 +269,6 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { log.debug("response : " + reponse); } - switch (reponse) { case JOptionPane.CLOSED_OPTION: case 3: @@ -390,6 +323,7 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { super.doCloseData(); return true; + } protected ActivitySeineUI addActivityFinDeVeille(boolean close) { @@ -398,26 +332,22 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { // on créee l'activity de fin de veille ObserveNode parentNode = treeHelper.getSelectedNode(); - parentNode = treeHelper.findNode( - parentNode, - n("observe.common.activities") - ); + parentNode = treeHelper.findNode(parentNode, n("observe.common.activities")); if (log.isDebugEnabled()) { log.debug("PARENT NODE = " + parentNode); } treeHelper.addUnsavedNode(parentNode, ActivitySeine.class); // on recupère l'écran d'édition - ActivitySeineUI selectedUI = (ActivitySeineUI) - ObserveContext.get().getSelectedContentUI(); + ActivitySeineUI selectedUI = (ActivitySeineUI) ObserveContext.get().getSelectedContentUI(); // on recupère l'activity de fin de veille VesselActivitySeine vesselActivitySeine = null; - for (Object o : selectedUI.getVesselActivitySeine().getData()) { - VesselActivitySeine a = (VesselActivitySeine) o; - if (ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE.equals(a.getCode())) { - vesselActivitySeine = a; + List<VesselActivitySeine> vesselActivitySeines = selectedUI.getVesselActivitySeine().getData(); + for (VesselActivitySeine vesselActivitySeine1 : vesselActivitySeines) { + if (ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE_ID.equals(vesselActivitySeine1.getTopiaId())) { + vesselActivitySeine = vesselActivitySeine1; break; } } @@ -434,14 +364,16 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { // on ferme l'écean selectedUI.stopEdit(); + } + return selectedUI; + } @Override protected boolean obtainCanReopen(boolean create) { - DataContext dataContext = getDataContext(); // on peut reouvrir une route si : @@ -451,6 +383,7 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { dataContext.isSelectedOpen(TripSeine.class) && !dataContext.isOpenRoute(); return canReopen; + } protected void repaintTripNode() { @@ -463,20 +396,20 @@ public class RouteUIHandler extends ContentOpenableUIHandler<Route> { getUi().removeContextValue(Boolean.class, UPDATE_TRIP_NODE); - if (updateTripNode == null || !updateTripNode) { - return; - } + if (updateTripNode != null && updateTripNode) { + ObserveTreeHelper treeHelper = getTreeHelper(getUi()); + ObserveNode tripNode = treeHelper.getSelectedNode().getParent().getParent(); + if (log.isInfoEnabled()) { + log.info("Refresh trip node : " + tripNode); + } + treeHelper.reloadNode(tripNode, false); - ObserveTreeHelper treeHelper = getTreeHelper(getUi()); - ObserveNode tripNode = treeHelper.getSelectedNode().getParent().getParent(); - if (log.isInfoEnabled()) { - log.info("Refresh trip node : " + tripNode); } - treeHelper.reloadNode(tripNode, false); } + //FIXME Remettre ça en place protected void updateDateFin(TripSeine parentBean) { Date endDate = parentBean.getEndDate(); diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java index 619a52c..661bc93 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java @@ -90,6 +90,7 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { @Override public void initUI() throws Exception { + super.initUI(); TripSeineUI ui = getUi(); @@ -130,19 +131,7 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { } @Override - public void openUI() throws Exception { - super.openUI(); - - ContentMode mode = computeContentMode(); - - String programId = getSelectedParentId(); - final String tripId = getSelectedId(); - - if (log.isInfoEnabled()) { - log.info(prefix + "programId = " + programId); - log.info(prefix + "tripId = " + tripId); - log.info(prefix + "mode = " + mode); - } + protected void onOpenUI(String programId, String tripId, ContentMode mode) { TripSeineService service = getService(TripSeineService.class); @@ -152,25 +141,19 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { if (create) { // create mode - - if (log.isInfoEnabled()) { - log.info(prefix + "create a new trip"); - } - - loaded = service.preCreate(programId); } else { // update mode - if (log.isInfoEnabled()) { - log.info(prefix + "using existing trip " + tripId); - } + if (ContentMode.UPDATE == mode) { - if (mode == ContentMode.UPDATE) { loaded = service.loadForEdit(tripId); + } else { + loaded = service.loadForDisplay(tripId); + } } @@ -178,16 +161,14 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { TripSeine bean = getBean(); copy(TripSeine.class, BinderService.EDIT, loaded, bean); getUi().getTripSeineTabPane().setSelectedIndex(0); + buildTripMap = true; - finalizeOpenUI(mode, create); } @Override public void startEditUI(String... binding) { - TripSeineUI ui = getUi(); - ContentOpenableUIModel<TripSeine> model = getModel(); ContentMode mode = model.getMode(); @@ -195,7 +176,7 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { boolean create = mode == ContentMode.CREATE; String contextName = getValidatorContextName(mode); - ui.getValidator().setContext(contextName); + getUi().getValidator().setContext(contextName); if (create) { @@ -219,7 +200,9 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { TripSeineUI.BINDING_ERS_ID_TEXT, TripSeineUI.BINDING_CLOSE_ENABLED, TripSeineUI.BINDING_CLOSE_AND_CREATE_ENABLED); + model.setModified(create); + } @Override @@ -235,6 +218,7 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { obtainChildPosition(bean); return true; + } @Override diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java index c5be916..1242dfc 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java @@ -33,11 +33,8 @@ import fr.ird.observe.ui.content.ContentMode; import fr.ird.observe.ui.content.ContentUIHandler; import fr.ird.observe.ui.content.ObserveContentUI; import fr.ird.observe.ui.tree.ObserveNode; -import jaxx.runtime.swing.ErrorDialogUI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.validator.NuitonValidatorScope; @@ -47,7 +44,6 @@ import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.table.DefaultTableCellRenderer; import java.awt.Rectangle; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; @@ -79,6 +75,33 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top */ protected abstract void onSelectedRowChanged(int editingRow, D bean, boolean create); + /** + * Initialiser le tableau de l'écran. + * + * Cette méthode est appelée la première fois que l'écran est affiché. + * + * @param renderer le renderer par défaut à utiliser. + */ + protected abstract void initTableUI(DefaultTableCellRenderer renderer); + + /** + * Pour charger le bean d'édition dans la méthode {@link #openUI()}. + * + * Cette méthode est appelée à chaque affichage de l'écran. + * + * @param mode le mode de l'écran + */ + protected abstract void loadEditBean(ContentMode mode); + + /** + * Pour enregistre l'objet en cours d'édition. + * + * Cette méthode est appelé dans la méthode {@link #doSave(TopiaEntity)}. + * + * @param editBean l'objet à enregistrer + */ + protected abstract void doPersist(E editBean); + @Override protected boolean computeCanWrite(DataSource source) { return source.canWriteData(); @@ -123,10 +146,102 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top return (ObserveContentTableUI<E, D>) super.getUi(); } + protected ContentTableModel<E, D> getTableModel() { + return getUi().getTableModel(); + } + public final D getTableEditBean() { return getModel().getTableEditBean(); } + @Override + public void initUI() throws Exception { + + ContentTableUIInitializer<E, D, ObserveContentTableUI<E, D>> uiInitializer = + new ContentTableUIInitializer<E, D, ObserveContentTableUI<E, D>>(getUi()); + uiInitializer.initUI(ObserveContext.get().getServices()); + + } + + @Override + public void openUI() throws Exception { + + super.openUI(); + + ContentTableModel<E, D> tableModel = getTableModel(); + + // récupération de la ligne sélectionnée + int oldIndex = tableModel.getSelectedRow(); + + // on déttache le modèle du tableau + tableModel.dettachModel(); + + // récupération du mode de l'écran + ContentMode mode = computeContentMode(); + + // chargement du bean d'édition + loadEditBean(mode); + + // chargement de l'écran d'édition + loadTableEditBeanForm(mode); + + // enregistrement du mode de l'écran + getModel().setMode(mode); + + // initialisation du modèle du tableau + tableModel.attachModel(); + + boolean canEdit = mode == ContentMode.UPDATE; + + if (canEdit) { + // on lance le mode edition + ui.startEdit(null); + } + + if (!tableModel.isEmpty()) { + + if (tableModel.getRowCount() <= oldIndex) { + oldIndex = 0; + } + if (oldIndex == -1) { + oldIndex = 0; + } + + // le tableau contient au moins une entrée + // on la sélectionne la première entrée + tableModel.changeSelectedRow(oldIndex); + + } + + if (canEdit) { + + // on force l'ecran en non modification + //FIXME normalement, on ne devrait pas a avoir a faire ca ? + //FIXME mais il est possible que les validateurs modifient l'état + //FIXME modified sur l'ecran lors des bindings d'initilisation... + getModel().setModified(false); + + } + + } + + protected void loadTableEditBeanForm(ContentMode mode) { + // par defaut, rien à faire + } + + + @Override + public void startEditUI(String... binding) { + + addUpdateInfoMessage(); + super.startEditUI(binding); + + } + + protected void resetEditBean() { + getTableModel().resetEditBean(); + } + public final void updateEditor(ListSelectionEvent event) { final ObserveContentTableUI<E, D> ui = getUi(); @@ -142,7 +257,10 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top if (log.isDebugEnabled()) { log.debug(event); } - if (getTableModel().isEmpty()) { + + ContentTableModel<E, D> tableModel = getTableModel(); + + if (tableModel.isEmpty()) { // le modele est vide, on ne propage rien //FIXME le modèle de selection ne devrait plus declancher des evenement //FIXME des que le modele est vide ? @@ -172,111 +290,28 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top } }); - int selectedRow = getTableModel().getSelectedRow(); + int selectedRow = tableModel.getSelectedRow(); if (newIndex == selectedRow) { // on bloque du code re-entrant log.debug("new index already set in model " + newIndex + ", do nothing"); return; } // on doit changer de ligne selectionne dans le modele - getTableModel().changeSelectedRow(newIndex); - } - - protected abstract void initTableUI(DefaultTableCellRenderer renderer); + tableModel.changeSelectedRow(newIndex); -// protected String getEditBeanIdToLoad(DataContext dataContext, -// DataService dataService, -// DataSource dataSource) throws DataSourceException { -// throw new IllegalStateException("Do NOT USE ME!!!"); -// } - -// protected E loadEditBean(ContentMode mode, -// DataContext dataContext, -// DataService dataService, -// DataSource dataSource) throws DataSourceException { -// -// loadEditBean(mode); -// -//// String id = getEditBeanIdToLoad(dataContext, dataService, dataSource); -//// -//// if (id == null) { -//// throw new IllegalStateException("Could not find id form " + this); -//// } -//// -//// // preparation du bean d'édition -//// dataService.loadEditEntity(dataSource, id, getLoadExecutor()); -// -//// getModel().setMode(mode); -//// -//// // initialisation du modèle du tableau -//// getUi().getTableModel().attachModel(); -// -// E editBean = getBean(); -// return editBean; -// -// } - - //FIXME Rendre cette methode abstract - protected abstract void loadEditBean(ContentMode mode) ; - -// protected abstract void loadEditBean() throws DataSourceException { -// -// String id = getEditBeanIdToLoad(getDataContext(), getDataService(), getDataSource()); -// -// if (id == null) { -// throw new IllegalStateException("Could not find id form " + this); -// } -// -// // preparation du bean d'édition -// getDataService().loadEditEntity(getDataSource(), id, getLoadExecutor()); -// -// } - -// //FIXME A supprimer -// @Override -// protected final void onLoad(TopiaContext tx, E bean) throws TopiaException { -// super.onLoad(tx, bean); -// -// // on duplique la liste des fils traites dans le tableau -// // sinon on reste sur les references d'origine et on aura pas -// // la possibilité d'annuler l'edition ensuite car on aura modifie -// // les entrées d'origine... -// E editBean = getBean(); -// Collection<D> data = loadChilds(tx, editBean); -// getModel().getChildsUpdator().setChilds(editBean, data); -// } -// -// //FIXME A supprimer -// protected Collection<D> loadChilds(TopiaContext tx, E bean) throws TopiaException { -// Collection<D> childs = getModel().getChildsUpdator().getChilds(bean); -// Collection<D> data = new ArrayList<D>(); -// if (CollectionUtils.isNotEmpty(childs)) { -// Loador<D> loader = getModel().getChildLoador(); -// TopiaDAO<D> dao = getDataSource().getDAO(tx, getTableEditBean()); -// for (D c : childs) { -// try { -// D cUp = dao.findByTopiaId(c.getTopiaId()); -// D c2 = getModel().newTableEditBean(); -// loader.load(cUp, c2, true); -// data.add(c2); -// } catch (Exception e) { -// throw new RuntimeException(e); -// } -// } -// } -// return data; -// } - - @Override - public void initUI() throws Exception { + } - ContentTableUIInitializer<E, D, ObserveContentTableUI<E, D>> uiInitializer = - new ContentTableUIInitializer<E, D, ObserveContentTableUI<E, D>>(getUi()); - uiInitializer.initUI(ObserveContext.get().getServices()); + public void removeSelectedRow(int selectedRow) { + try { + getTableModel().doRemoveRow(selectedRow, false); + } finally { + // always reset busy model to false + ObserveContext.get().getObserveMainUI().setBusy(false); + } } - public Set<String> loadSpeciesList(String speciesListId, String errorMessage) { + protected Set<String> loadSpeciesList(String speciesListId, String errorMessage) { Set<String> speciesIds; try { @@ -294,7 +329,6 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top } - protected void prepareSpeciesList(String speciesListId, JComponent speciesComponent, String errorMessage) throws DataSourceException { Set<String> speciesIds = loadSpeciesList(speciesListId, errorMessage); @@ -303,73 +337,6 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top Species2.newSpeciesByIdPredicate(speciesIds)); } - protected void loadTableEditBeanForm(ContentMode mode) { - // par defaut, rien à faire - } - - @Override - public void openUI() throws Exception { - - super.openUI(); - - // récupération du mode de l'écran - ContentMode mode = computeContentMode(); - - ObserveContentTableUI<E, D> ui = getUi(); - - int oldIndex = ui.getTableModel().getSelectedRow(); - - ui.getTableModel().dettachModel(); - - // chargement du bean d'édition - loadEditBean(mode); - - // chargement de l'écran d'édition - loadTableEditBeanForm(mode); - - // enregistrement du mode de l'écran - getModel().setMode(mode); - - // initialisation du modèle du tableau - getUi().getTableModel().attachModel(); - - boolean canEdit = mode == ContentMode.UPDATE; - - if (canEdit) { - // on lance le mode edition - ui.startEdit(null); - } - - if (!ui.getTableModel().isEmpty()) { - if (ui.getTableModel().getRowCount() <= oldIndex) { - oldIndex = 0; - } - if (oldIndex == -1) { - oldIndex = 0; - } - - // le tableau contient au moins une entrée - // on la sélectionne la première entrée - ui.getTableModel().changeSelectedRow(oldIndex); - } - - if (canEdit) { - - // on force l'ecran en non modification - //FIXME normalement, on ne devrait pas a avoir a faire ca ? - //FIXME mais il est possible que les validateurs modifient l'état - //FIXME modified sur l'ecran lors des bindings d'initilisation... - getModel().setModified(false); - } - } - - @Override - public void startEditUI(String... binding) { - - addUpdateInfoMessage(); - super.startEditUI(binding); - } - protected void addUpdateInfoMessage() { String message = n("observe.entity.message.updating"); ObserveNode node = getTreeHelper(getUi()).getSelectedNode(); @@ -379,163 +346,36 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top addMessage(getUi(), NuitonValidatorScope.INFO, entityLabel, message); } - public void removeSelectedRow(int selectedRow) { - try { - getTableModel().doRemoveRow(selectedRow, false); - } finally { - - // always reset busy model to false - ObserveContext.get().getObserveMainUI().setBusy(false); - } - } - -// @Override -// protected boolean doSave(E bean, -// DataService dataService, -// DataSource dataSource, -// TopiaEntityBinder<E> binder) throws Exception { -// -// ObserveContentTableUI<E, D> ui = getUi(); -// -// List<D> objets = ui.getTableModel().getData(); -// -// boolean canContinue; -// try { -// canContinue = prepareSave(bean, objets); -// } catch (Exception e) { -// if (log.isErrorEnabled()) { -// log.error(e); -// } -// ErrorDialogUI.showError(e); -// canContinue = false; -// } -// if (!canContinue) { -// -// // l'utilisateur a choisi de ne pas sauvegarder -// return false; -// } -// doPersist(bean, dataService, dataSource); -// -// -// return true; -// } - @Override - protected boolean doSave(E bean) { + protected final boolean doSave(E bean) { - ObserveContentTableUI<E, D> ui = getUi(); + List<D> objets = getTableModel().getData(); - List<D> objets = ui.getTableModel().getData(); + boolean canContinue = prepareSave(bean, objets); - boolean canContinue; - try { - canContinue = prepareSave(bean, objets); - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error(e); - } - ErrorDialogUI.showError(e); - canContinue = false; - } - if (!canContinue) { + if (canContinue) { + + doPersist(bean); + canContinue = true; - // l'utilisateur a choisi de ne pas sauvegarder - return false; } - doPersist(bean); + return canContinue; - return true; } + protected boolean prepareSave(E editBean, List<D> objets) { -// protected void doPersist(E bean, DataService dataService, DataSource dataSource) throws DataSourceException { -// // sauvegarde du bean en base -// dataService.update(dataSource, null, bean, getUpdateExecutor()); -// } - - protected void doPersist(E editBean) { - + // par defaut, rien de specifique a faire avant de faire la sauvegarde + return true; } -// @Override -// protected E onUpdate(TopiaContext tx, Object parentBean, E beanToSave) throws TopiaException { -// -// List<D> childs = getUi().getTableModel().getData(); -// -// E editBean = getBean(); -// -// TopiaEntityBinder<E> binder = getLoadBinder(); -// -// Loador<D> childBinder = getModel().getChildLoador(); -// -// EntityListUpdator<E, D> childUpdator = getModel().getChildsUpdator(); -// -// // recopie des propriétés du bean en excluant toujours la liste des fils -// binder.copyExcluding(editBean, beanToSave, childUpdator.getPropertyName()); -// -// // on conserve l'ancienne liste des fils (pour traitement ultérieure) -// Collection<D> oldChilds = -// new ArrayList<D>(childUpdator.getChilds(beanToSave)); -// -// // suppression des fils dans le bean a sauver -// childUpdator.removeAll(beanToSave); -// -// TopiaDAO<D> dao = ObserveDAOHelper.getDAO(tx, getModel().getChildType()); -// -// for (D child : childs) { -// -// D childToSave; -// -// if (child.getTopiaId() == null) { -// -// // creation du fils -// Map<String, Object> map = childBinder.obtainProperties(child); -// -// childToSave = dao.create(map); -// -// } else { -// -// // mise a jour du fils -// -// childToSave = dao.findByTopiaId(child.getTopiaId()); -// -// childBinder.load(child, childToSave, false); -// } -// -// // ajout du fils au bean à sauver -// childUpdator.addToList(beanToSave, childToSave); -// } -// -// // on donne la main aux implantations pour faire des traitements -// // supplémentaires -// onUpdateFinalize(tx, beanToSave, oldChilds); -// -// return beanToSave; -// } - @Override protected void afterSave(boolean refresh) { // on recharge l'écran resetEditUI(); - } - - protected boolean prepareSave(E editBean, List<D> objets) throws Exception { - // par defaut, rien de specifique a faire avant de faire la sauvegarde - return true; } - protected void onUpdateFinalize(TopiaContext tx, E bean, Collection<D> oldChilds) throws TopiaException { - // par défaut, rien à faire - } - - protected ContentTableModel<E, D> getTableModel() { - return getUi().getTableModel(); - } - - protected void resetEditBean() { - getTableModel().resetEditBean(); - } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIModel.java index 2f6646b..fadfe3c 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIModel.java @@ -99,7 +99,7 @@ public abstract class ContentTableUIModel<E extends TopiaEntity, D extends Topia BinderService binderService = ObserveServiceHelper.get().getBinderService(); - this.childLoador = binderService.getTopiaBinder(childType, childBinderContext); + this.childLoador = binderService.getBinder(childType, childBinderContext); } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/SizeMeasuresTableModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/SizeMeasuresTableModel.java index 3bb120a..a08f575 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/SizeMeasuresTableModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/SizeMeasuresTableModel.java @@ -22,6 +22,7 @@ package fr.ird.observe.ui.content.table.impl.longline; * #L% */ +import fr.ird.observe.BinderService; import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.entities.longline.SizeMeasure; import fr.ird.observe.entities.longline.SizeMeasureImpl; @@ -40,7 +41,7 @@ public class SizeMeasuresTableModel extends EditableTableWithCacheTableModelSupp public SizeMeasuresTableModel() { - super(ObserveServiceHelper.get().getBinderService().getSimpleTopiaBinder(SizeMeasure.class)); + super(ObserveServiceHelper.get().getBinderService().getBinder(SizeMeasure.class, BinderService.EDIT)); } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/WeightMeasuresTableModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/WeightMeasuresTableModel.java index d36086d..e125f4b 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/WeightMeasuresTableModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/longline/WeightMeasuresTableModel.java @@ -22,6 +22,7 @@ package fr.ird.observe.ui.content.table.impl.longline; * #L% */ +import fr.ird.observe.BinderService; import fr.ird.observe.ObserveServiceHelper; import fr.ird.observe.entities.longline.WeightMeasure; import fr.ird.observe.entities.longline.WeightMeasureImpl; @@ -39,7 +40,7 @@ public class WeightMeasuresTableModel extends EditableTableWithCacheTableModelSu private static final long serialVersionUID = 1L; public WeightMeasuresTableModel() { - super(ObserveServiceHelper.get().getBinderService().getSimpleTopiaBinder(WeightMeasure.class)); + super(ObserveServiceHelper.get().getBinderService().getBinder(WeightMeasure.class, BinderService.EDIT)); } @Override diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetCatchUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetCatchUIHandler.java index 0a96590..8e59f98 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetCatchUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetCatchUIHandler.java @@ -54,10 +54,10 @@ import javax.swing.table.DefaultTableCellRenderer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Set; import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; @@ -71,11 +71,16 @@ public class NonTargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Non /** Logger */ static private Log log = LogFactory.getLog(NonTargetCatchUIHandler.class); - /** l'entrée dans le contexte pour récupérer la liste complete des speciess */ + /** + * L'entrée dans le contexte pour récupérer la liste complete des espèces. + */ protected final JAXXContextEntryDef<List<Species>> ALL_ESPECES_ENTRY = UIHelper.newListContextEntryDef("NonTargetCatchUI-all-speciess"); - protected final JAXXContextEntryDef<List<NonTargetLength>> ALL_TAILLES_TO_DELETE_ENTRY = + /** + * L'entrée dans le contexte pour conserver les mensurations obsolètes à supprimer lors de la sauvegarde. + */ + protected final JAXXContextEntryDef<List<NonTargetLength>> ALL_NON_TARGET_LENGTH_TO_DELETE_ENTRY = UIHelper.newListContextEntryDef("NonTargetCatchUI-all-taille-to-delete"); /** @@ -147,69 +152,44 @@ public class NonTargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Non return (NonTargetCatchUI) super.getUi(); } - public String getCatchWeightDataTip(NonTargetCatchComputedValueSource computed) { - String result; - - if (computed == null) { - result = t("observe.common.catchWeightComputed.observed.tip"); - } else { - result = t("observe.common.catchWeightComputed.computed.tip", computed.toString()); - } - return result; - } - - public String getTotalCountDataTip(NonTargetCatchComputedValueSource computed) { - String result; - - if (computed == null) { - result = t("observe.common.totalCountComputed.observed.tip"); - } else { - result = t("observe.common.totalCountComputed.computed.tip", computed.toString()); - - } - return result; - } - - public String getMeanWeightDataTip(NonTargetCatchComputedValueSource computed) { - String result; - - if (computed == null) { - result = t("observe.common.meanWeightComputed.observed.tip"); - } else { - result = t("observe.common.meanWeightComputed.computed.tip", computed.toString()); - } - return result; - } - - public String getMeanLengthDataTip(NonTargetCatchComputedValueSource computed) { - String result; - - if (computed == null) { - result = t("observe.common.meanLengthComputed.observed.tip"); - } else { - result = t("observe.common.meanLengthComputed.computed.tip", computed.toString()); - } - return result; - } + @Override + protected void initTableUI(DefaultTableCellRenderer renderer) { - public void resetCatchWeightComputed() { - getTableEditBean().setCatchWeightComputedSource(null); - getUi().getCatchWeight().grabFocus(); - } + JTable table = getUi().getTable(); - public void resetTotalCountComputed() { - getTableEditBean().setTotalCountComputedSource(null); - getUi().getTotalCount().grabFocus(); - } + UIHelper.fixTableColumnWidth(table, 3, 55); + UIHelper.fixTableColumnWidth(table, 4, 65); + UIHelper.fixTableColumnWidth(table, 5, 75); + UIHelper.fixTableColumnWidth(table, 6, 55); + UIHelper.fixTableColumnWidth(table, 7, 50); - public void resetMeanWeightComputed() { - getTableEditBean().setMeanWeightComputedSource(null); - getUi().getMeanWeight().grabFocus(); - } + UIHelper.setI18nTableHeaderRenderer( + table, + n("observe.nonTargetCatch.table.speciesFaune"), + n("observe.nonTargetCatch.table.speciesFaune.tip"), + n("observe.nonTargetCatch.table.speciesFate"), + n("observe.nonTargetCatch.table.speciesFate.tip"), + n("observe.nonTargetCatch.table.reasonForDiscard"), + n("observe.nonTargetCatch.table.reasonForDiscard.tip"), + n("observe.nonTargetCatch.table.catchWeight"), + n("observe.nonTargetCatch.table.catchWeight.tip"), + n("observe.nonTargetCatch.table.totalCount"), + n("observe.nonTargetCatch.table.totalCount.tip"), + n("observe.nonTargetCatch.table.meanWeight"), + n("observe.nonTargetCatch.table.meanWeight.tip"), + n("observe.nonTargetCatch.table.meanLength"), + n("observe.nonTargetCatch.table.meanLength.tip"), + n("observe.nonTargetCatch.table.comment"), + n("observe.nonTargetCatch.table.comment.tip")); - public void resetMeanLengthComputed() { - getTableEditBean().setMeanLengthComputedSource(null); - getUi().getMeanLength().grabFocus(); + UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); + UIHelper.setTableColumnRenderer(table, 1, UIHelper.newDecorateTableCellRenderer(renderer, SpeciesFate.class)); + UIHelper.setTableColumnRenderer(table, 2, UIHelper.newDecorateTableCellRenderer(renderer, ReasonForDiscard.class)); + UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 4, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 5, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 6, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 7, UIHelper.newStringTableCellRenderer(renderer, 10, true)); } @Override @@ -289,9 +269,8 @@ public class NonTargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Non } @Override - protected void onSelectedRowChanged(int editingRow, - NonTargetCatch bean, - boolean create) { + protected void onSelectedRowChanged(int editingRow, NonTargetCatch bean, boolean create) { + NonTargetCatchUI ui = getUi(); ContentTableModel<SetSeine, NonTargetCatch> model = getTableModel(); @@ -302,20 +281,23 @@ public class NonTargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Non return; } - List<Species> availableEspeces; + List<Species> availableSpecies; JComponent requestFocus; if (create) { - availableEspeces = new ArrayList<Species>(ALL_ESPECES_ENTRY.getContextValue(ui)); + availableSpecies = new ArrayList<Species>(ALL_ESPECES_ENTRY.getContextValue(ui)); requestFocus = ui.getSpecies(); + } else { + Species species = bean.getSpecies(); - availableEspeces = Arrays.asList(species); + availableSpecies = Collections.singletonList(species); requestFocus = ui.getTable(); + } - ui.getSpecies().setData(availableEspeces); + ui.getSpecies().setData(availableSpecies); requestFocus.requestFocus(); NonTargetCatch tableEditBean = getTableEditBean(); @@ -330,103 +312,48 @@ public class NonTargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Non tableEditBean.removePropertyChangeListener(NonTargetCatch.PROPERTY_MEAN_LENGTH, meanLengthChanged); tableEditBean.addPropertyChangeListener(NonTargetCatch.PROPERTY_MEAN_LENGTH, meanLengthChanged); - } - - @Override - protected void initTableUI(DefaultTableCellRenderer renderer) { - - JTable table = getUi().getTable(); - - UIHelper.fixTableColumnWidth(table, 3, 55); - UIHelper.fixTableColumnWidth(table, 4, 65); - UIHelper.fixTableColumnWidth(table, 5, 75); - UIHelper.fixTableColumnWidth(table, 6, 55); - UIHelper.fixTableColumnWidth(table, 7, 50); - - UIHelper.setI18nTableHeaderRenderer( - table, - n("observe.nonTargetCatch.table.speciesFaune"), - n("observe.nonTargetCatch.table.speciesFaune.tip"), - n("observe.nonTargetCatch.table.speciesFate"), - n("observe.nonTargetCatch.table.speciesFate.tip"), - n("observe.nonTargetCatch.table.reasonForDiscard"), - n("observe.nonTargetCatch.table.reasonForDiscard.tip"), - n("observe.nonTargetCatch.table.catchWeight"), - n("observe.nonTargetCatch.table.catchWeight.tip"), - n("observe.nonTargetCatch.table.totalCount"), - n("observe.nonTargetCatch.table.totalCount.tip"), - n("observe.nonTargetCatch.table.meanWeight"), - n("observe.nonTargetCatch.table.meanWeight.tip"), - n("observe.nonTargetCatch.table.meanLength"), - n("observe.nonTargetCatch.table.meanLength.tip"), - n("observe.nonTargetCatch.table.comment"), - n("observe.nonTargetCatch.table.comment.tip")); - - UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); - UIHelper.setTableColumnRenderer(table, 1, UIHelper.newDecorateTableCellRenderer(renderer, SpeciesFate.class)); - UIHelper.setTableColumnRenderer(table, 2, UIHelper.newDecorateTableCellRenderer(renderer, ReasonForDiscard.class)); - UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 4, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 5, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 6, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 7, UIHelper.newStringTableCellRenderer(renderer, 10, true)); - } - - @Override - protected boolean doSave(SetSeine bean) { - - try { - - return super.doSave(bean); - - } finally { - - // toujours supprimer la référence du context, quoiqu'il arrive - ALL_TAILLES_TO_DELETE_ENTRY.removeContextValue(getUi()); - } } @Override - protected boolean prepareSave(SetSeine editBean, List<NonTargetCatch> objets) throws Exception { + protected boolean prepareSave(SetSeine editBean, List<NonTargetCatch> objets) { super.prepareSave(editBean, objets); List<Species> speciessUsed = getTableModel().getColumnValues(0); - - Collection<Species> speciessToDelete = new HashSet<Species>(); - List<NonTargetLength> tailleToDelete = new ArrayList<NonTargetLength>(); + Set<String> speciesIdsUsed = new HashSet<String>(); + for (Species species : speciessUsed) { + speciesIdsUsed.add(species.getTopiaId()); + } NonTargetSampleService service = getService(NonTargetSampleService.class); - service.getObsoleteEspeceForNonTargetSample(editBean.getTopiaId(), - speciessUsed, - speciessToDelete, - tailleToDelete); + List<NonTargetLength> lengthsToDelete = service.getObsoleteNonTargetLengths(editBean.getTopiaId(), speciesIdsUsed); - if (!tailleToDelete.isEmpty()) { + if (!lengthsToDelete.isEmpty()) { + + // il existe des echantillon faune a supprimer on demande une confirmation + + Set<Species> speciessToDelete = new HashSet<Species>(); + for (NonTargetLength targetLength : lengthsToDelete) { + speciessToDelete.add(targetLength.getSpecies()); + } - // il existe des echantillon faune a supprimer on demande une - // confirmation StringBuilder sb = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); - Decorator<Species> decorator; - Decorator<NonTargetLength> decorator2; - decorator = getDecoratorService().getDecoratorByType(Species.class); - decorator2 = getDecoratorService().getDecoratorByType(NonTargetLength.class); + Decorator<Species> speciesDecorator = getDecoratorService().getDecoratorByType(Species.class); + Decorator<NonTargetLength> nonTargetLengthDecorator = getDecoratorService().getDecoratorByType(NonTargetLength.class); for (Species e : speciessToDelete) { - sb.append(" - ").append(decorator.toString(e)).append('\n'); + sb.append(" - ").append(speciesDecorator.toString(e)).append('\n'); } - for (NonTargetLength t : tailleToDelete) { - sb2.append(" - ").append(decorator2.toString(t)).append('\n'); + for (NonTargetLength t : lengthsToDelete) { + sb2.append(" - ").append(nonTargetLengthDecorator.toString(t)).append('\n'); } int reponse = UIHelper.askUser( t("observe.title.need.confirm"), t("observe.nonTargetCatch.message.table.will.delete.nonTargetSample", sb.toString(), sb2.toString()), JOptionPane.ERROR_MESSAGE, - new Object[]{ - t("observe.choice.continue"), - t("observe.choice.cancel")}, + new Object[]{t("observe.choice.continue"), t("observe.choice.cancel")}, 0); if (log.isDebugEnabled()) { log.debug("response : " + reponse); @@ -444,7 +371,8 @@ public class NonTargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Non } // on conserve les tailles a supprimer - ALL_TAILLES_TO_DELETE_ENTRY.setContextValue(getUi(), tailleToDelete); + ALL_NON_TARGET_LENGTH_TO_DELETE_ENTRY.setContextValue(getUi(), lengthsToDelete); + } return true; @@ -454,11 +382,84 @@ public class NonTargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Non @Override protected void doPersist(SetSeine editBean) { - List<NonTargetLength> tailleToDelete = ALL_TAILLES_TO_DELETE_ENTRY.getContextValue(getUi()); + List<NonTargetLength> tailleToDelete = ALL_NON_TARGET_LENGTH_TO_DELETE_ENTRY.getContextValue(getUi()); - NonTargetCatchService service = getService(NonTargetCatchService.class); - service.save(editBean, tailleToDelete); + try { + NonTargetCatchService service = getService(NonTargetCatchService.class); + service.save(editBean, tailleToDelete); + + } finally { + + // toujours supprimer la référence du context, quoiqu'il arrive + ALL_NON_TARGET_LENGTH_TO_DELETE_ENTRY.removeContextValue(getUi()); + } + + } + + public String getCatchWeightDataTip(NonTargetCatchComputedValueSource computed) { + String result; + + if (computed == null) { + result = t("observe.common.catchWeightComputed.observed.tip"); + } else { + result = t("observe.common.catchWeightComputed.computed.tip", computed.toString()); + } + return result; + } + + public String getTotalCountDataTip(NonTargetCatchComputedValueSource computed) { + String result; + + if (computed == null) { + result = t("observe.common.totalCountComputed.observed.tip"); + } else { + result = t("observe.common.totalCountComputed.computed.tip", computed.toString()); + + } + return result; + } + + public String getMeanWeightDataTip(NonTargetCatchComputedValueSource computed) { + String result; + + if (computed == null) { + result = t("observe.common.meanWeightComputed.observed.tip"); + } else { + result = t("observe.common.meanWeightComputed.computed.tip", computed.toString()); + } + return result; + } + + public String getMeanLengthDataTip(NonTargetCatchComputedValueSource computed) { + String result; + + if (computed == null) { + result = t("observe.common.meanLengthComputed.observed.tip"); + } else { + result = t("observe.common.meanLengthComputed.computed.tip", computed.toString()); + } + return result; + } + + public void resetCatchWeightComputed() { + getTableEditBean().setCatchWeightComputedSource(null); + getUi().getCatchWeight().grabFocus(); + } + + public void resetTotalCountComputed() { + getTableEditBean().setTotalCountComputedSource(null); + getUi().getTotalCount().grabFocus(); + } + + public void resetMeanWeightComputed() { + getTableEditBean().setMeanWeightComputedSource(null); + getUi().getMeanWeight().grabFocus(); + } + + public void resetMeanLengthComputed() { + getTableEditBean().setMeanLengthComputedSource(null); + getUi().getMeanLength().grabFocus(); } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetSampleUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetSampleUIHandler.java index 920fd6c..88bc806 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetSampleUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/NonTargetSampleUIHandler.java @@ -36,6 +36,7 @@ import fr.ird.observe.ui.content.ContentMode; import fr.ird.observe.ui.content.table.ContentTableModel; import fr.ird.observe.ui.content.table.ContentTableUIHandler; import jaxx.runtime.context.JAXXContextEntryDef; +import jaxx.runtime.swing.editor.NumberEditor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.validator.NuitonValidatorScope; @@ -46,7 +47,7 @@ import javax.swing.table.DefaultTableCellRenderer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import static org.nuiton.i18n.I18n.n; @@ -103,6 +104,38 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam return (NonTargetSampleUI) super.getUi(); } + @Override + protected void initTableUI(DefaultTableCellRenderer renderer) { + + JTable table = getUi().getTable(); + + UIHelper.fixTableColumnWidth(table, 1, 100); + UIHelper.fixTableColumnWidth(table, 2, 100); + + UIHelper.setI18nTableHeaderRenderer( + table, + n("observe.nonTargetSample.table.speciesFaune"), + n("observe.nonTargetSample.table.speciesFaune.tip"), + n("observe.nonTargetSample.table.length"), + n("observe.nonTargetSample.table.length.tip"), + n("observe.nonTargetSample.table.meanWeight"), + n("observe.nonTargetSample.table.meanWeight.tip"), + n("observe.nonTargetSample.table.count"), + n("observe.nonTargetSample.table.count.tip"), + n("observe.nonTargetSample.table.gender"), + n("observe.nonTargetSample.table.gender.tip"), + n("observe.nonTargetSample.table.picturesReferences"), + n("observe.nonTargetSample.table.picturesReferences.tip")); + + UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); + UIHelper.setTableColumnRenderer(table, 1, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 2, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 4, UIHelper.newDecorateTableCellRenderer(renderer, Sex.class)); + UIHelper.setTableColumnRenderer(table, 5, renderer); + + } + public void resetWeightSource() { getTableEditBean().setWeightSource(false); getUi().getWeight().grabFocus(); @@ -134,7 +167,7 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam String setId = getDataContext().getSelectedSetId(); NonTargetSampleService service = getService(NonTargetSampleService.class); - speciesList = service.getAvailableEspeceForNonTargetSample(setId); + speciesList = service.getAvailableSpeciesForNonTargetSample(setId); ALL_ESPECES_ENTRY.setContextValue(getUi(), speciesList); } @@ -152,6 +185,8 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam String setId = getDataContext().getSelectedSetId(); + NonTargetSampleService service = getService(NonTargetSampleService.class); + if (editBean.getTopiaId() != null && editBean.isNonTargetLengthEmpty()) { // remove orphan target sample @@ -159,47 +194,22 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam log.info("Remove obsolete nonTargetSample " + editBean.getTopiaId() + " from Set: " + setId); } - getService(NonTargetSampleService.class).delete(setId, editBean); + service.delete(setId, editBean); } else { - String savedId = getService(NonTargetSampleService.class).save(setId, editBean); + String savedId = service.save(setId, editBean); editBean.setTopiaId(savedId); getService(NonTargetLengthService.class).save(editBean); + } } -// @Override -// protected NonTargetSample onCreate(TopiaContext tx, -// Object parent, -// NonTargetSample editBean) throws TopiaException { -// SetSeine parentBean = (SetSeine) parent; -// NonTargetSample beanToSave = -// ObserveDAOHelper.getNonTargetSampleDAO(tx).create(); -// if (log.isInfoEnabled()) { -// log.info("Echantillon faune " + beanToSave.getTopiaId() + -// " was created."); -// } -// editBean.setTopiaId(beanToSave.getTopiaId()); -// editBean.setTopiaCreateDate(beanToSave.getTopiaCreateDate()); -// editBean.setTopiaVersion(beanToSave.getTopiaVersion()); -// parentBean.addNonTargetSample(beanToSave); -// return beanToSave; -// } - -// @Override -// protected void onDelete(TopiaContext tx, Object parent, NonTargetSample beanToDelete) throws TopiaException { -// SetSeine parentBean = (SetSeine) parent; -// parentBean.removeNonTargetSample(beanToDelete); -// } - - @SuppressWarnings("unchecked") @Override - protected void onSelectedRowChanged(int editingRow, - NonTargetLength bean, - boolean create) { + protected void onSelectedRowChanged(int editingRow, NonTargetLength bean, boolean create) { + ContentTableModel<NonTargetSample, NonTargetLength> model = getTableModel(); if (!model.isEditable()) { @@ -223,12 +233,10 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam ui.getAcquisitionModeGroup().setSelectedValue(ModeSaisieEchantillonEnum.byEffectif); } - availableEspeces = new ArrayList<Species>( - ALL_ESPECES_ENTRY.getContextValue(ui)); + availableEspeces = new ArrayList<Species>(ALL_ESPECES_ENTRY.getContextValue(ui)); requestFocus = ui.getSpecies(); - } else { - requestFocus = ui.getCount(); + } else { // on passe le mode de saisie int acquisitionMode = bean.getAcquisitionMode(); @@ -237,8 +245,11 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam ui.getAcquisitionModeGroup().setSelectedValue(null); ui.getAcquisitionModeGroup().setSelectedValue(enumValue); - availableEspeces = Arrays.asList(species); + availableEspeces = Collections.singletonList(species); + requestFocus = ui.getCount(); + } + ui.getSpecies().setData(availableEspeces); requestFocus.requestFocus(); @@ -248,40 +259,12 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam tableEditBean.removePropertyChangeListener(NonTargetLength.PROPERTY_LENGTH, lengthChanged); tableEditBean.addPropertyChangeListener(NonTargetLength.PROPERTY_LENGTH, lengthChanged); - } - - @Override - protected void initTableUI(DefaultTableCellRenderer renderer) { - JTable table = getUi().getTable(); - - UIHelper.fixTableColumnWidth(table, 1, 100); - UIHelper.fixTableColumnWidth(table, 2, 100); - - UIHelper.setI18nTableHeaderRenderer( - table, - n("observe.nonTargetSample.table.speciesFaune"), - n("observe.nonTargetSample.table.speciesFaune.tip"), - n("observe.nonTargetSample.table.length"), - n("observe.nonTargetSample.table.length.tip"), - n("observe.nonTargetSample.table.meanWeight"), - n("observe.nonTargetSample.table.meanWeight.tip"), - n("observe.nonTargetSample.table.count"), - n("observe.nonTargetSample.table.count.tip"), - n("observe.nonTargetSample.table.gender"), - n("observe.nonTargetSample.table.gender.tip"), - n("observe.nonTargetSample.table.picturesReferences"), - n("observe.nonTargetSample.table.picturesReferences.tip")); - UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); - UIHelper.setTableColumnRenderer(table, 1, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 2, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 4, UIHelper.newDecorateTableCellRenderer(renderer, Sex.class)); - UIHelper.setTableColumnRenderer(table, 5, renderer); } @Override protected ContentMode getContentMode(DataContext dataContext) { + ContentMode mode = super.getContentMode(dataContext); String setId = getDataContext().getSelectedSetId(); @@ -320,20 +303,21 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam return; } - NonTargetSampleUI ui = getUi(); + NumberEditor weight = getUi().getWeight(); + NumberEditor count = getUi().getCount(); - boolean createMode = ui.getTableModel().isCreate(); + boolean createMode = getTableModel().isCreate(); - NonTargetLength editBean = ui.getTableEditBean(); + NonTargetLength editBean = getTableEditBean(); switch (newMode) { case byEffectif: // le weight n'est pas modifiable - ui.getWeight().setEnabled(false); + weight.setEnabled(false); // l'count est modifiable - ui.getCount().setEnabled(true); + count.setEnabled(true); if (createMode) { @@ -347,11 +331,10 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam case byIndividu: // le weight est pas modifiable - ui.getWeight().setEnabled(true); + weight.setEnabled(true); // l'count n'est pas modifiable et est toujours de 1 - ui.getCount().setEnabled(false); - + count.setEnabled(false); if (createMode) { @@ -365,6 +348,9 @@ public class NonTargetSampleUIHandler extends ContentTableUIHandler<NonTargetSam // on propage le mode de saisie dans le bean editBean.setAcquisitionMode(newMode.ordinal()); + } + } + } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/ObjectObservedSpeciesUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/ObjectObservedSpeciesUIHandler.java index f012ad7..1db6bda 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/ObjectObservedSpeciesUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/ObjectObservedSpeciesUIHandler.java @@ -47,8 +47,7 @@ import static org.nuiton.i18n.I18n.n; public class ObjectObservedSpeciesUIHandler extends ContentTableUIHandler<FloatingObject, ObjectObservedSpecies> { /** Logger */ - static private Log log = - LogFactory.getLog(ObjectObservedSpeciesUIHandler.class); + public static final Log log = LogFactory.getLog(ObjectObservedSpeciesUIHandler.class); public ObjectObservedSpeciesUIHandler(ObjectObservedSpeciesUI ui) { super(ui, DataContextType.SetSeine); @@ -72,11 +71,6 @@ public class ObjectObservedSpeciesUIHandler extends ContentTableUIHandler<Floati } -// @Override -// protected String getEditBeanIdToLoad(DataContext dataContext, DataService dataService, DataSource dataSource) { -// return dataContext.getSelectedFloatingObjectId(); -// } - @Override protected void onSelectedRowChanged(int editingRow, ObjectObservedSpecies bean, boolean create) { if (log.isDebugEnabled()) { diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetCatchUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetCatchUIHandler.java index d9a3e19..3967c6a 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetCatchUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetCatchUIHandler.java @@ -23,8 +23,8 @@ package fr.ird.observe.ui.content.table.impl.seine; import fr.ird.observe.BinderService; import fr.ird.observe.ObserveConfig; -import fr.ird.observe.db.DataSourceException; import fr.ird.observe.db.constants.DataContextType; +import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.referentiel.Ocean; import fr.ird.observe.entities.referentiel.ReferenceEntities; import fr.ird.observe.entities.referentiel.Species; @@ -34,7 +34,7 @@ import fr.ird.observe.entities.seine.SetSeine; import fr.ird.observe.entities.seine.TargetCatch; import fr.ird.observe.entities.seine.TargetLength; import fr.ird.observe.services.data.TripService; -import fr.ird.observe.services.data.seine.NonTargetCatchService; +import fr.ird.observe.services.data.seine.TargetCatchService; import fr.ird.observe.services.data.seine.TargetSampleService; import fr.ird.observe.services.referential.ReferentialService; import fr.ird.observe.ui.UIHelper; @@ -55,12 +55,11 @@ import javax.swing.table.DefaultTableCellRenderer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; @@ -74,12 +73,14 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target /** Logger */ private static final Log log = LogFactory.getLog(TargetCatchUIHandler.class); - JAXXContextEntryDef<List<TargetLength>> ALL_TAILLES_TO_DELETE_ENTRY = + /** + * L'entrée dans le contexte pour conserver les mensurations obsolètes à supprimer lors de la sauvegarde. + */ + JAXXContextEntryDef<List<TargetLength>> ALL_TARGET_LENGTH_TO_DELETE_ENTRY = UIHelper.newListContextEntryDef("TargetCatchUI-all-taille-to-delete"); /** - * l'entrée dans le contexte pour récupérer la liste complètes des - * catégories + * L'entrée dans le contexte pour récupérer la liste complète des catégories. */ JAXXContextEntryDef<List<WeightCategory>> ALL_CATEGORIES_ENTRY = UIHelper.newListContextEntryDef("TargetCatchUI-all-categories"); @@ -95,10 +96,11 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target @Override public void initUI() throws Exception { + super.initUI(); - // lors de la modification d'une species (sur une entree non sauvee) - // - on recalcule la liste des categories pour cette species. + // lors de la modification d'une espèces (sur une entree non sauvee) + // - on recalcule la liste des categories pour cette espèce. // - on reinitialiser la categorie selectionnee getUi().getSpecies().addPropertyChangeListener( @@ -108,18 +110,15 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target @Override public void propertyChange(PropertyChangeEvent evt) { - ContentTableModel<SetSeine, TargetCatch> model; - model = getTableModel(); + ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); + TargetCatch bean = model.getRowBean(); - if (model.getRowBean().getTopiaId() == null) { - - // en mode creation , on doit recalculer la liste - // des categories + if (Entities.isNew(bean)) { + // en mode creation , on doit recalculer la liste des categories Species species = (Species) evt.getNewValue(); - - onEspeceChanged(species); + } } } @@ -127,12 +126,42 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target } @Override + protected void initTableUI(DefaultTableCellRenderer renderer) { + + JTable table = getUi().getTable(); + + UIHelper.fixTableColumnWidth(table, 2, 100); + UIHelper.fixTableColumnWidth(table, 3, 50); + UIHelper.fixTableColumnWidth(table, 4, 50); + + UIHelper.setI18nTableHeaderRenderer( + table, + n("observe.targetCatch.table.speciesThon"), + n("observe.targetCatch.table.speciesThon.tip"), + n("observe.targetCatch.table.weightCategory"), + n("observe.targetCatch.table.weightCategory.tip"), + n("observe.targetCatch.table.well"), + n("observe.targetCatch.table.well.tip"), + n("observe.targetCatch.table.weight"), + n("observe.targetCatch.table.weight.tip"), + n("observe.targetCatch.table.comment"), + n("observe.targetCatch.table.comment.tip")); + + UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); + UIHelper.setTableColumnRenderer(table, 1, UIHelper.newDecorateTableCellRenderer(renderer, WeightCategory.class)); + UIHelper.setTableColumnRenderer(table, 2, renderer); + UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 4, UIHelper.newStringTableCellRenderer(renderer, 10, true)); + + } + + @Override protected void loadEditBean(ContentMode mode) { List<Species> speciesList; List<WeightCategory> categorieList; - if (mode == ContentMode.UPDATE) { + if (ContentMode.UPDATE == mode) { // on charge le formulaire uniquement si en mode édition @@ -142,7 +171,7 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target ObserveConfig config = getUi().getContextValue(ObserveConfig.class); String speciesListId = config.getSpeciesListSeineTargetCatchId(); - java.util.Set<String> speciesIds = loadSpeciesList(speciesListId, n("observe.error.speciesList.seine.targetCatch.notFound")); + Set<String> speciesIds = loadSpeciesList(speciesListId, n("observe.error.speciesList.seine.targetCatch.notFound")); categorieList = Species2.filterWeightCategoryBySpeciesIds(categorieList, speciesIds); @@ -165,109 +194,63 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target speciesList = new ArrayList<Species>(); categorieList = new ArrayList<WeightCategory>(); - } - TargetCatchUI ui = getUi(); + } ALL_CATEGORIES_ENTRY.setContextValue(ui, categorieList); - ui.getSpecies().setData(speciesList); + getUi().getSpecies().setData(speciesList); String setId = getDataContext().getSelectedSetId(); - SetSeine setSeine = getService(NonTargetCatchService.class).loadForEdit(setId); + TargetCatchService service = getService(TargetCatchService.class); + SetSeine setSeine = service.loadForEdit(setId); copy(SetSeine.class, BinderService.EDIT_TARGET_CATCH, setSeine, getBean()); } -// @Override -// protected Collection<TargetCatch> loadChilds(TopiaContext tx, SetSeine bean) throws TopiaException { -// Collection<TargetCatch> childs = getModel().getChildsUpdator().getChilds(bean); -// Collection<TargetCatch> data = new ArrayList<TargetCatch>(); -// if (CollectionUtils.isNotEmpty(childs)) { -// TopiaDAO<TargetCatch> dao = -// getDataSource().getDAO(tx, getTableEditBean()); -// TopiaEntityBinder<TargetCatch> childLoador = getModel().getChildLoador(); -// -// DecoratorService decoratorService = getDecoratorService(); -// -// for (TargetCatch c : childs) { -// if (c.isDiscarded()) { -// // c'est un rejet, on ne le retient pas dans cette liste -// if (log.isDebugEnabled()) { -// log.debug("targetDiscarded " + c.getSpecies().getLabel2() + -// " non retenu."); -// } -// continue; -// } -// try { -// -// TargetCatch c2 = getModel().newTableEditBean(); -// TargetCatch safeC = dao.findByTopiaId(c.getTopiaId()); -// WeightCategory weightCategory = safeC.getWeightCategory(); -// if (weightCategory != null) { -// Species species = weightCategory.getSpecies(); -// decoratorService.decorate(species); -// } -// childLoador.load(safeC, c2, true); -// data.add(c2); -// } catch (Exception e) { -// throw new RuntimeException(e); -// } -// } -// } -// return data; -// } - @Override - protected boolean prepareSave(SetSeine bean, List<TargetCatch> objets) throws DataSourceException { + protected boolean prepareSave(SetSeine bean, List<TargetCatch> objets) { - // on recupere les speciess acceptables pour des echantillonnages - // i.e une species d'un targetCatch + // on recupere les espèces acceptables pour des echantillonnages + // i.e une espèce d'un targetCatch - Collection<Species> speciessUsed = new HashSet<Species>(); - for (TargetCatch c : objets) { - speciessUsed.add(c.getSpecies()); + Set<String> speciesIdsUsed = new HashSet<String>(); + for (TargetCatch targetCatch : objets) { + speciesIdsUsed.add(targetCatch.getSpecies().getTopiaId()); } - // il faut supprimer les echantillon thons sur des speciess qui ne - // sont plus sur un rejet - - List<TargetLength> tailleToDelete = new ArrayList<TargetLength>(); - Collection<Species> speciessToDelete = new HashSet<Species>(); + // il faut supprimer les echantillon thons sur des espèces qui ne sont plus sur un rejet TargetSampleService service = getService(TargetSampleService.class); - service.getObsoleteEspeceForTargetSample(bean.getTopiaId(), - speciessUsed, - speciessToDelete, - tailleToDelete, - false); + List<TargetLength> targetLengthsToDelete = + service.getObsoleteTargetLengths(bean.getTopiaId(), speciesIdsUsed, false); + + if (!targetLengthsToDelete.isEmpty()) { - if (!tailleToDelete.isEmpty()) { + Set<Species> speciessToDelete = new HashSet<Species>(); + for (TargetLength targetLength : targetLengthsToDelete) { + speciessToDelete.add(targetLength.getSpecies()); + } - // il existe des echantillon thon a supprimer on demande une - // confirmation + // il existe des echantillon thon a supprimer on demande une confirmation StringBuilder sb = new StringBuilder(512); StringBuilder sb2 = new StringBuilder(512); - Decorator<Species> decorator = - getDecoratorService().getDecoratorByType(Species.class); - Decorator<TargetLength> decorator2 = - getDecoratorService().getDecoratorByType(TargetLength.class); + Decorator<Species> speciesDecorator = getDecoratorService().getDecoratorByType(Species.class); + Decorator<TargetLength> targetLengthDecorator = getDecoratorService().getDecoratorByType(TargetLength.class); for (Species e : speciessToDelete) { - sb.append(" - ").append(decorator.toString(e)).append('\n'); + sb.append(" - ").append(speciesDecorator.toString(e)).append('\n'); } - for (TargetLength t : tailleToDelete) { - sb2.append(" - ").append(decorator2.toString(t)).append('\n'); + for (TargetLength t : targetLengthsToDelete) { + sb2.append(" - ").append(targetLengthDecorator.toString(t)).append('\n'); } int reponse = UIHelper.askUser( t("observe.title.need.confirm"), t("observe.targetDiscarded.message.table.will.delete.targetLength", sb.toString(), sb2.toString()), JOptionPane.ERROR_MESSAGE, - new Object[]{ - t("observe.choice.continue"), - t("observe.choice.cancel")}, + new Object[]{t("observe.choice.continue"), t("observe.choice.cancel")}, 0); if (log.isDebugEnabled()) { log.debug("response : " + reponse); @@ -284,77 +267,69 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target // l'utilisateur a choisi de ne pas continuer return false; + } // on conserve les tailles a supprimer - ALL_TAILLES_TO_DELETE_ENTRY.setContextValue(getUi(), tailleToDelete); + ALL_TARGET_LENGTH_TO_DELETE_ENTRY.setContextValue(getUi(), targetLengthsToDelete); + } for (TargetCatch targetCatch : objets) { // on attache la set targetCatch.setSetSeine(bean); + } + return true; + } -// @Override -// protected void onUpdateFinalize(TopiaContext tx, SetSeine bean, Collection<TargetCatch> oldChilds) { -// -// if (oldChilds != null && !oldChilds.isEmpty()) { -// -// // on reinjecte les rejet thon precedemment saisie dans la set -// for (TargetCatch targetCatch : oldChilds) { -// if (targetCatch.isDiscarded()) { -// bean.addTargetCatch(targetCatch); -// } -// } -// } -// -// -// List<TargetLength> tailleToDelete = ALL_TAILLES_TO_DELETE_ENTRY.getContextValue(getUi()); -// -// if (tailleToDelete != null && !tailleToDelete.isEmpty()) { -// -// // on a demande la suppression de taille obsoletes -// -// if (log.isInfoEnabled()) { -// log.info("Will remove " + tailleToDelete.size() + -// " obsolete targetLength(s)."); -// } -// -// TargetSample echantillon = bean.getTargetSample(false); -// -// // on supprime les echantillons obsoletes -// echantillon.getTargetLength().removeAll(tailleToDelete); -// } -// } + @Override + protected void doPersist(SetSeine editBean) { + + List<TargetLength> tailleToDelete = ALL_TARGET_LENGTH_TO_DELETE_ENTRY.getContextValue(getUi()); + + try { + + TargetCatchService service = getService(TargetCatchService.class); + service.save(editBean, tailleToDelete); + + } finally { + + // toujours supprimer la référence du context, quoiqu'il arrive + ALL_TARGET_LENGTH_TO_DELETE_ENTRY.removeContextValue(getUi()); + + } + + } @Override protected void onSelectedRowChanged(int editingRow, TargetCatch bean, boolean create) { TargetCatchUI ui = getUi(); - WeightCategory beanWeightCategory = bean.getWeightCategory(); - Species beanEspece = beanWeightCategory == null ? - null : beanWeightCategory.getSpecies(); + WeightCategory weightCategory = bean.getWeightCategory(); + Species species = weightCategory == null ? null : weightCategory.getSpecies(); + + BeanComboBox<Species> speciesComboBox = ui.getSpecies(); + BeanComboBox<WeightCategory> weightCategoryComboBox = ui.getWeightCategory(); JComponent requestFocus; if (create) { - // on reinitilise toujours l'species (pour reinitialiser la liste - // des categories) - ui.getSpecies().setSelectedItem(null); + // on reinitilise toujours l'espèce (pour reinitialiser la liste des categories) + speciesComboBox.setSelectedItem(null); if (!getTableModel().isCreate()) { - // on repositionne l'species (cela reconstruira la liste - // des categories) - ui.getSpecies().setSelectedItem(beanEspece); + // on repositionne l'espèce (cela reconstruira la liste des categories) + speciesComboBox.setSelectedItem(species); // on repositionne la categorie - ui.getWeightCategory().setSelectedItem(beanWeightCategory); + weightCategoryComboBox.setSelectedItem(weightCategory); } - requestFocus = ui.getSpecies(); + requestFocus = speciesComboBox; } else { @@ -362,48 +337,20 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target // au singleton de sa valeur correspondante dans le bean // puisque dans ce mode, pas possibilite de modifier de cette // valeur (clef metier) - ui.getSpecies().setSelectedItem(beanEspece); - ui.getWeightCategory().setData( - Arrays.asList(beanWeightCategory)); - ui.getWeightCategory().setSelectedItem(beanWeightCategory); + speciesComboBox.setSelectedItem(species); + weightCategoryComboBox.setData(Collections.singletonList(weightCategory)); + weightCategoryComboBox.setSelectedItem(weightCategory); requestFocus = ui.getCatchWeight(); + } if (log.isDebugEnabled()) { - log.debug("selected categoriePoid " + beanWeightCategory); - log.debug("selected species " + beanEspece); + log.debug("selected categoriePoid " + weightCategory); + log.debug("selected species " + species); } requestFocus.requestFocus(); - } - - @Override - protected void initTableUI(DefaultTableCellRenderer renderer) { - - JTable table = getUi().getTable(); - - UIHelper.fixTableColumnWidth(table, 2, 100); - UIHelper.fixTableColumnWidth(table, 3, 50); - UIHelper.fixTableColumnWidth(table, 4, 50); - UIHelper.setI18nTableHeaderRenderer( - table, - n("observe.targetCatch.table.speciesThon"), - n("observe.targetCatch.table.speciesThon.tip"), - n("observe.targetCatch.table.weightCategory"), - n("observe.targetCatch.table.weightCategory.tip"), - n("observe.targetCatch.table.well"), - n("observe.targetCatch.table.well.tip"), - n("observe.targetCatch.table.weight"), - n("observe.targetCatch.table.weight.tip"), - n("observe.targetCatch.table.comment"), - n("observe.targetCatch.table.comment.tip")); - - UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); - UIHelper.setTableColumnRenderer(table, 1, UIHelper.newDecorateTableCellRenderer(renderer, WeightCategory.class)); - UIHelper.setTableColumnRenderer(table, 2, renderer); - UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 4, UIHelper.newStringTableCellRenderer(renderer, 10, true)); } @SuppressWarnings("unchecked") @@ -418,21 +365,22 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target // species puis une categorie availableCategories = Collections.emptyList(); + } else { - // un species est selectionnee, + // une espèce est selectionnee, // on calcule les categories pour cette species availableCategories = getAllCategories(getUi()); - // on ne conserve que les categories de l'species - for (Iterator<WeightCategory> it = availableCategories.iterator(); - it.hasNext(); ) { + // on ne conserve que les categories de l'espèce + for (Iterator<WeightCategory> it = availableCategories.iterator(); it.hasNext(); ) { WeightCategory weighte = it.next(); if (!species.equals(weighte.getSpecies())) { it.remove(); } } + } // on met a jour la liste des categories disponibles @@ -441,6 +389,7 @@ public class TargetCatchUIHandler extends ContentTableUIHandler<SetSeine, Target // on reinitialise toujours la categorie selectionnee combo.setSelectedItem(null); + } protected List<WeightCategory> getAllCategories(JAXXContext context) { diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetDiscardCatchUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetDiscardCatchUIHandler.java index f1ad697..b640cda 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetDiscardCatchUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetDiscardCatchUIHandler.java @@ -24,6 +24,7 @@ package fr.ird.observe.ui.content.table.impl.seine; import fr.ird.observe.BinderService; import fr.ird.observe.ObserveConfig; import fr.ird.observe.db.constants.DataContextType; +import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.referentiel.Ocean; import fr.ird.observe.entities.referentiel.ReferenceEntities; import fr.ird.observe.entities.referentiel.Species; @@ -34,7 +35,8 @@ import fr.ird.observe.entities.seine.SetSeine; import fr.ird.observe.entities.seine.TargetCatch; import fr.ird.observe.entities.seine.TargetLength; import fr.ird.observe.services.data.TripService; -import fr.ird.observe.services.data.seine.NonTargetCatchService; +import fr.ird.observe.services.data.seine.TargetCatchService; +import fr.ird.observe.services.data.seine.TargetSampleService; import fr.ird.observe.services.referential.ReferentialService; import fr.ird.observe.ui.UIHelper; import fr.ird.observe.ui.content.ContentMode; @@ -45,21 +47,24 @@ import jaxx.runtime.context.JAXXContextEntryDef; import jaxx.runtime.swing.editor.bean.BeanComboBox; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.decorator.Decorator; import javax.swing.JComponent; +import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; /** * @author Tony Chemit - chemit@codelutin.com @@ -68,47 +73,30 @@ import static org.nuiton.i18n.I18n.n; public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, TargetCatch> { /** Logger */ - static private Log log = LogFactory.getLog(TargetDiscardCatchUIHandler.class); + private static final Log log = LogFactory.getLog(TargetDiscardCatchUIHandler.class); + /** + * L'entrée dans le contexte pour récupérer la liste complète des catégories. + */ JAXXContextEntryDef<List<WeightCategory>> ALL_CATEGORIES_ENTRY = UIHelper.newListContextEntryDef("RejetThonUI-all-categories"); + /** + * L'entrée dans le contexte pour récupérer la liste complète des raisons de rejet. + */ JAXXContextEntryDef<List<ReasonForDiscard>> ALL_RAISONS_REJET_ENTRY = UIHelper.newListContextEntryDef("RejetThonUI-all-reasonForDiscards"); - JAXXContextEntryDef<List<TargetLength>> ALL_TAILLES_TO_DELETE_ENTRY = + /** + * L'entrée dans le contexte pour conserver les mensurations obsolètes à supprimer lors de la sauvegarde. + */ + JAXXContextEntryDef<List<TargetLength>> ALL_TARGET_LENGTH_TO_DELETE_ENTRY = UIHelper.newListContextEntryDef("RejetThonUI-all-taille-to-delete"); public TargetDiscardCatchUIHandler(TargetDiscardCatchUI ui) { super(ui, DataContextType.SetSeine); } - protected static Collection<WeightCategory> getWeightCategoryUsed( - ContentTableModel<SetSeine, TargetCatch> model) { - List<WeightCategory> list = model.getColumnValues(1); - Collection<WeightCategory> set = new HashSet<WeightCategory>(list); - list.clear(); - return set; - } - - protected static Collection<ReasonForDiscard> getReasonForDiscardUsed( - ContentTableModel<SetSeine, TargetCatch> model, - WeightCategory weightCategory) { - - Collection<ReasonForDiscard> set = new HashSet<ReasonForDiscard>(); - if (weightCategory != null) { - for (int i = 0; i < model.getRowCount(); i++) { - TargetCatch c = model.getValueAt(i); - if (c != null && - weightCategory.equals(c.getWeightCategory()) && - c.getReasonForDiscard() != null) { - set.add(c.getReasonForDiscard()); - } - } - } - return set; - } - @Override public TargetDiscardCatchUI getUi() { return (TargetDiscardCatchUI) super.getUi(); @@ -119,29 +107,26 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, super.initUI(); - TargetDiscardCatchUI ui = getUi(); - - // lors de la modification d'une species (sur une entree non sauvee) - // - on recalcule la liste des categories pour cette species. + // lors de la modification d'une espèce (sur une entree non sauvee) + // - on recalcule la liste des categories pour cette espèce. // - on reinitialiser la categorie selectionnee - ui.getSpecies().addPropertyChangeListener( + getUi().getSpecies().addPropertyChangeListener( BeanComboBox.PROPERTY_SELECTED_ITEM, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - ContentTableModel<SetSeine, TargetCatch> model = - getTableModel(); + ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); TargetCatch bean = model.getRowBean(); - if (bean.getTopiaId() == null) { - // en mode creation , on doit recalculer la liste - // des categories + if (Entities.isNew(bean)) { + // en mode creation , on doit recalculer la liste des categories Species species = (Species) evt.getNewValue(); onEspeceChanged(bean, species); + } } } @@ -151,22 +136,22 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, // - on recalcule la liste des raison rejets. // - on reinitialiser la raison rejet selectionnee - ui.getWeightCategory().addPropertyChangeListener( + getUi().getWeightCategory().addPropertyChangeListener( BeanComboBox.PROPERTY_SELECTED_ITEM, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - ContentTableModel<SetSeine, TargetCatch> model = - getTableModel(); + ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); TargetCatch bean = model.getRowBean(); - if (bean.getTopiaId() == null) { - // en mode creation , on doit recalculer la liste - // des raison rejet - WeightCategory weightCategory = - (WeightCategory) evt.getNewValue(); + + if (Entities.isNew(bean)) { + + // en mode creation , on doit recalculer la liste des raison rejet + WeightCategory weightCategory = (WeightCategory) evt.getNewValue(); onCategorieChanged(bean, weightCategory); + } } @@ -176,12 +161,44 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, } @Override + protected void initTableUI(DefaultTableCellRenderer renderer) { + + JTable table = getUi().getTable(); + UIHelper.fixTableColumnWidth(table, 3, 75); + UIHelper.fixTableColumnWidth(table, 4, 20); + UIHelper.fixTableColumnWidth(table, 5, 50); + + UIHelper.setI18nTableHeaderRenderer( + table, + n("observe.targetDiscarded.table.speciesThon"), + n("observe.targetDiscarded.table.speciesThon.tip"), + n("observe.targetDiscarded.table.weightCategory"), + n("observe.targetDiscarded.table.weightCategory.tip"), + n("observe.targetDiscarded.table.reasonForDiscard"), + n("observe.targetDiscarded.table.reasonForDiscard.tip"), + n("observe.targetDiscarded.table.weight"), + n("observe.targetDiscarded.table.weight.tip"), + n("observe.targetDiscarded.table.broughtOnDeck"), + n("observe.targetDiscarded.table.broughtOnDeck.tip"), + n("observe.targetDiscarded.table.comment"), + n("observe.targetDiscarded.table.comment.tip")); + + UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); + UIHelper.setTableColumnRenderer(table, 1, UIHelper.newDecorateTableCellRenderer(renderer, WeightCategory.class)); + UIHelper.setTableColumnRenderer(table, 2, UIHelper.newDecorateTableCellRenderer(renderer, ReasonForDiscard.class)); + UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 4, UIHelper.newStringTableCellRenderer(renderer, 20, false)); + UIHelper.setTableColumnRenderer(table, 5, UIHelper.newStringTableCellRenderer(renderer, 10, true)); + + } + + @Override protected void loadEditBean(ContentMode mode) { List<WeightCategory> categorieList; List<ReasonForDiscard> reasonForDiscardList; - if (mode == ContentMode.UPDATE) { + if (ContentMode.UPDATE == mode) { // on charge le formulaire uniquement si en mode édition @@ -192,7 +209,7 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, // filtre sur la liste d'espèce configuree ObserveConfig config = getUi().getContextValue(ObserveConfig.class); String speciesListId = config.getSpeciesListSeineTargetCatchId(); - java.util.Set<String> speciesIds = loadSpeciesList(speciesListId, n("observe.error.speciesList.seine.targetCatch.notFound")); + Set<String> speciesIds = loadSpeciesList(speciesListId, n("observe.error.speciesList.seine.targetCatch.notFound")); categorieList = Species2.filterWeightCategoryBySpeciesIds(categorieList, speciesIds); @@ -214,203 +231,128 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, categorieList = new ArrayList<WeightCategory>(); reasonForDiscardList = new ArrayList<ReasonForDiscard>(); - } - TargetDiscardCatchUI ui = getUi(); + } ALL_CATEGORIES_ENTRY.setContextValue(ui, categorieList); ALL_RAISONS_REJET_ENTRY.setContextValue(ui, reasonForDiscardList); String setId = getDataContext().getSelectedSetId(); - SetSeine setSeine = getService(NonTargetCatchService.class).loadForEdit(setId); + TargetCatchService service = getService(TargetCatchService.class); + SetSeine setSeine = service.loadForEditDiscarded(setId); copy(SetSeine.class, BinderService.EDIT_DISCARD_TARGET_CATCH, setSeine, getBean()); } -// @Override -// protected String getEditBeanIdToLoad(DataContext dataContext, DataService dataService, DataSource dataSource) { -// return dataContext.getSelectedSetId(); -// } - -// @Override -// protected Collection<TargetCatch> loadChilds(TopiaContext tx, SetSeine bean) throws TopiaException { -// Collection<TargetCatch> childs = getModel().getChildsUpdator().getChilds(bean); -// Collection<TargetCatch> data = new ArrayList<TargetCatch>(); -// if (CollectionUtils.isNotEmpty(childs)) { -// TopiaDAO<TargetCatch> dao = -// getDataSource().getDAO(tx, getTableEditBean()); -// TopiaEntityBinder<TargetCatch> childLoador = getModel().getChildLoador(); -// DecoratorService decoratorService = getDecoratorService(); -// for (TargetCatch c : childs) { -// if (!c.isDiscarded()) { -// // ce n'est pas un rejet, on ne le retient pas dans cette -// // liste -// if (log.isDebugEnabled()) { -// log.debug("targetCatch " + c.getSpecies().getLabel2() + " non retenu."); -// } -// continue; -// } -// try { -// TargetCatch c2 = getModel().newTableEditBean(); -// TargetCatch safeC = dao.findByTopiaId(c.getTopiaId()); -// WeightCategory weightCategory = safeC.getWeightCategory(); -// if (weightCategory != null) { -// Species species = weightCategory.getSpecies(); -// decoratorService.decorate(species); -// } -// childLoador.load(safeC, c2, true); -// data.add(c2); -// } catch (Exception e) { -// throw new RuntimeException(e); -// } -// } -// } -// return data; -// } - -// @Override -// protected boolean doSave(SetSeine bean, -// DataService dataService, -// DataSource dataSource, -// TopiaEntityBinder<SetSeine> binder) throws Exception { -// try { -// return super.doSave(bean, dataService, dataSource, binder); -// } finally { -// -// // toujours supprimer la référence du context, quoiqu'il arrive -// ALL_TAILLES_TO_DELETE_ENTRY.removeContextValue(getUi()); -// } -// } - -// @Override -// protected boolean prepareSave(SetSeine bean, List<TargetCatch> objets) throws DataSourceException { -// -// // on recupere les speciess acceptables pour des echantillonnages -// // i.e une species d'un targetDiscarded montee sur le pont -// -// java.util.Set<Species> speciessUsed = new HashSet<Species>(); -// for (TargetCatch c : objets) { -// if (c.getBroughtOnDeck() != null && c.getBroughtOnDeck()) { -// speciessUsed.add(c.getSpecies()); -// } -// } -// -// // il faut supprimer les echantillon thons sur des speciess qui ne -// // sont plus sur un rejet -// -// List<TargetLength> tailleToDelete = new ArrayList<TargetLength>(); -// java.util.Set<Species> speciessToDelete = new HashSet<Species>(); -// -// TargetSampleService service = getService(TargetSampleService.class); -// service.getObsoleteEspeceForTargetSample(bean.getTopiaId(), -// speciessUsed, -// speciessToDelete, -// tailleToDelete, -// true); -// -// if (!tailleToDelete.isEmpty()) { -// -// // il existe des echantillon thon a supprimer on demande une -// // confirmation -// StringBuilder sb = new StringBuilder(512); -// StringBuilder sb2 = new StringBuilder(512); -// Decorator<Species> decorator = -// getDecoratorService().getDecoratorByType(Species.class); -// Decorator<TargetLength> decorator2 = -// getDecoratorService().getDecoratorByType(TargetLength.class); -// -// for (Species e : speciessToDelete) { -// sb.append(" - ").append(decorator.toString(e)).append('\n'); -// } -// for (TargetLength t : tailleToDelete) { -// sb2.append(" - ").append(decorator2.toString(t)).append('\n'); -// } -// int reponse = UIHelper.askUser( -// t("observe.title.need.confirm"), -// t("observe.targetDiscarded.message.table.will.delete.targetLength", sb.toString(), sb2.toString()), -// JOptionPane.ERROR_MESSAGE, -// new Object[]{ -// t("observe.choice.continue"), -// t("observe.choice.cancel")}, -// 0); -// if (log.isDebugEnabled()) { -// log.debug("response : " + reponse); -// } -// boolean canContinue = false; -// switch (reponse) { -// case 0: -// // wil reset ui -// canContinue = true; -// break; -// } -// -// if (!canContinue) { -// -// // l'utilisateur a choisi de ne pas continuer -// return false; -// } -// -// // on conserve les tailles a supprimer -// ALL_TAILLES_TO_DELETE_ENTRY.setContextValue(getUi(), tailleToDelete); -// } -// -// // mise a jour de la propriete targetDiscarded -// bean.setTargetDiscarded(!objets.isEmpty()); -// -// for (TargetCatch discarded : objets) { -// -// // FIXME : on devrait pas a avoir a repositionner la propriete discarded -// discarded.setDiscarded(true); -// -// // on attache la set -// discarded.setSetSeine(bean); -// } -// -// return true; -// } - -// @Override -// protected void onUpdateFinalize(TopiaContext tx, SetSeine bean, Collection<TargetCatch> oldChilds) { -// -// if (oldChilds != null && !oldChilds.isEmpty()) { -// -// // on reinjecte les discarded thon precedemment saisies dans la set -// // et qui ne sont pas des rejets -// -// for (TargetCatch targetCatch : oldChilds) { -// if (!targetCatch.isDiscarded()) { -// bean.addTargetCatch(targetCatch); -// } -// } -// } -// -// List<TargetLength> tailleToDelete = ALL_TAILLES_TO_DELETE_ENTRY.getContextValue(getUi()); -// -// if (tailleToDelete != null && !tailleToDelete.isEmpty()) { -// -// // on a demande la suppression de taille obsoletes -// -// if (log.isInfoEnabled()) { -// log.info("Will remove " + tailleToDelete.size() + -// " obsolete targetLength(s)."); -// } -// -// TargetSample echantillon = bean.getTargetSample(true); -// -// // on supprime les echantillons obsoletes -// echantillon.getTargetLength().removeAll(tailleToDelete); -// } -// } + @Override + protected boolean prepareSave(SetSeine editBean, List<TargetCatch> objets) { + + // on recupere les espèces acceptables pour des echantillonnages + // i.e une espèces d'un targetDiscarded montee sur le pont + + Set<String> speciesIdsUsed = new HashSet<String>(); + for (TargetCatch targetCatch : objets) { + speciesIdsUsed.add(targetCatch.getSpecies().getTopiaId()); + } + + // il faut supprimer les echantillon thons sur des espèces qui ne sont plus sur un rejet + + TargetSampleService service = getService(TargetSampleService.class); + List<TargetLength> targetLengthsToDelete = service.getObsoleteTargetLengths(editBean.getTopiaId(), speciesIdsUsed, true); + + if (!targetLengthsToDelete.isEmpty()) { + + // il existe des echantillon thon a supprimer on demande une confirmation + + Set<Species> speciessToDelete = new HashSet<Species>(); + for (TargetLength targetLength : targetLengthsToDelete) { + speciessToDelete.add(targetLength.getSpecies()); + } + + StringBuilder sb = new StringBuilder(512); + StringBuilder sb2 = new StringBuilder(512); + Decorator<Species> speciesDecorator = getDecoratorService().getDecoratorByType(Species.class); + Decorator<TargetLength> targetLengthDecorator = getDecoratorService().getDecoratorByType(TargetLength.class); + + for (Species e : speciessToDelete) { + sb.append(" - ").append(speciesDecorator.toString(e)).append('\n'); + } + for (TargetLength t : targetLengthsToDelete) { + sb2.append(" - ").append(targetLengthDecorator.toString(t)).append('\n'); + } + int reponse = UIHelper.askUser( + t("observe.title.need.confirm"), + t("observe.targetDiscarded.message.table.will.delete.targetLength", sb.toString(), sb2.toString()), + JOptionPane.ERROR_MESSAGE, + new Object[]{t("observe.choice.continue"), t("observe.choice.cancel")}, + 0); + if (log.isDebugEnabled()) { + log.debug("response : " + reponse); + } + boolean canContinue = false; + switch (reponse) { + case 0: + // wil reset ui + canContinue = true; + break; + } + + if (!canContinue) { + + // l'utilisateur a choisi de ne pas continuer + return false; + + } + + // on conserve les tailles a supprimer + ALL_TARGET_LENGTH_TO_DELETE_ENTRY.setContextValue(getUi(), targetLengthsToDelete); + + } + + // mise a jour de la propriete targetDiscarded + editBean.setTargetDiscarded(!objets.isEmpty()); + + for (TargetCatch targetCatch : objets) { + + // FIXME : on devrait pas a avoir a repositionner la propriete discarded + targetCatch.setDiscarded(true); + + // on attache la set + targetCatch.setSetSeine(editBean); + + } + + return true; + + } + + @Override + protected void doPersist(SetSeine editBean) { + + List<TargetLength> targetLengthsToDelete = ALL_TARGET_LENGTH_TO_DELETE_ENTRY.getContextValue(ui); + + try { + + TargetCatchService service = getService(TargetCatchService.class); + service.saveForDiscarded(editBean, targetLengthsToDelete); + + } finally { + + ALL_TARGET_LENGTH_TO_DELETE_ENTRY.removeContextValue(ui); + + } + + } @Override protected void onSelectedRowChanged(int editingRow, TargetCatch bean, boolean create) { + TargetDiscardCatchUI ui = getUi(); WeightCategory beanWeightCategory = bean.getWeightCategory(); - Species beanEspece = beanWeightCategory == null ? null : - beanWeightCategory.getSpecies(); + Species beanEspece = beanWeightCategory == null ? null : beanWeightCategory.getSpecies(); ReasonForDiscard beanReasonForDiscard = bean.getReasonForDiscard(); if (log.isDebugEnabled()) { log.debug("selected categoriePoid " + beanWeightCategory); @@ -418,8 +360,11 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, log.debug("selected reasonForDiscard " + beanReasonForDiscard); } + BeanComboBox<Species> speciesComboBox = ui.getSpecies(); + JComponent requestFocus; if (create) { + ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); if (model.isCreate()) { // par défaut, on considère que l'espèce a été monté sur le pont @@ -428,71 +373,42 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, } // on recalcule la liste des speciess disponibles - List<Species> availableEspeces = buildEspeceList( - beanEspece, beanWeightCategory); - ui.getSpecies().setData(availableEspeces); + List<Species> availableEspeces = buildEspeceList(beanEspece, beanWeightCategory); + speciesComboBox.setData(availableEspeces); - // on reinitilise toujours l'species (pour reinitialiser la liste - // des categories) - ui.getSpecies().setSelectedItem(null); + // on reinitilise toujours la liste des espèces (pour reinitialiser la liste des categories) + speciesComboBox.setSelectedItem(null); if (!model.isCreate()) { // on repositionne l'species (cela reconstruira la liste // des categories) - ui.getSpecies().setSelectedItem(beanEspece); + speciesComboBox.setSelectedItem(beanEspece); // on repositionne la categorie ui.getWeightCategory().setSelectedItem(beanWeightCategory); ui.getReasonForDiscard().setSelectedItem(beanReasonForDiscard); } - requestFocus = ui.getSpecies(); + requestFocus = speciesComboBox; + } else { + // en mode mise a jour, on restreint la liste des categories // au singleton de sa valeur correspondante dans le bean // puisque dans ce mode, pas possibilite de modifier de cette // valeur (clef metier) - ui.getSpecies().setSelectedItem(beanEspece); - ui.getWeightCategory().setData(Arrays.asList(beanWeightCategory)); + speciesComboBox.setSelectedItem(beanEspece); + ui.getWeightCategory().setData(Collections.singletonList(beanWeightCategory)); ui.getWeightCategory().setSelectedItem(beanWeightCategory); - ui.getReasonForDiscard().setData(Arrays.asList(beanReasonForDiscard)); + ui.getReasonForDiscard().setData(Collections.singletonList(beanReasonForDiscard)); ui.getReasonForDiscard().setSelectedItem(beanReasonForDiscard); requestFocus = ui.getCatchWeight(); + } requestFocus.requestFocus(); } - @Override - protected void initTableUI(DefaultTableCellRenderer renderer) { - JTable table = getUi().getTable(); - UIHelper.fixTableColumnWidth(table, 3, 75); - UIHelper.fixTableColumnWidth(table, 4, 20); - UIHelper.fixTableColumnWidth(table, 5, 50); - - UIHelper.setI18nTableHeaderRenderer( - table, - n("observe.targetDiscarded.table.speciesThon"), - n("observe.targetDiscarded.table.speciesThon.tip"), - n("observe.targetDiscarded.table.weightCategory"), - n("observe.targetDiscarded.table.weightCategory.tip"), - n("observe.targetDiscarded.table.reasonForDiscard"), - n("observe.targetDiscarded.table.reasonForDiscard.tip"), - n("observe.targetDiscarded.table.weight"), - n("observe.targetDiscarded.table.weight.tip"), - n("observe.targetDiscarded.table.broughtOnDeck"), - n("observe.targetDiscarded.table.broughtOnDeck.tip"), - n("observe.targetDiscarded.table.comment"), - n("observe.targetDiscarded.table.comment.tip")); - - UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Species.class)); - UIHelper.setTableColumnRenderer(table, 1, UIHelper.newDecorateTableCellRenderer(renderer, WeightCategory.class)); - UIHelper.setTableColumnRenderer(table, 2, UIHelper.newDecorateTableCellRenderer(renderer, ReasonForDiscard.class)); - UIHelper.setTableColumnRenderer(table, 3, UIHelper.newEmptyNumberTableCellRenderer(renderer)); - UIHelper.setTableColumnRenderer(table, 4, UIHelper.newStringTableCellRenderer(renderer, 20, false)); - UIHelper.setTableColumnRenderer(table, 5, UIHelper.newStringTableCellRenderer(renderer, 10, true)); - } - protected void onEspeceChanged(TargetCatch bean, Species species) { WeightCategory weightCategory = null; @@ -511,15 +427,13 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, // un species est selectionne, on met a jour la liste des categories // disponibles pour cet species - List<WeightCategory> availableCategories = buildWeightCategoryList( - species); + List<WeightCategory> availableCategories = buildWeightCategoryList(species); data = availableCategories; weightCategory = bean.getWeightCategory(); - if (weightCategory != null && - !availableCategories.contains(weightCategory)) { + if (weightCategory != null && !availableCategories.contains(weightCategory)) { weightCategory = null; } } @@ -530,9 +444,11 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, // on selectionne la categorie retenue combo.setSelectedItem(weightCategory); + } protected void onCategorieChanged(TargetCatch bean, WeightCategory weightCategory) { + TargetDiscardCatchUI ui = getUi(); ReasonForDiscard reasonForDiscard = null; @@ -574,6 +490,7 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, // on selectionne la raison rejet retenue combo.setSelectedItem(reasonForDiscard); + } protected List<Species> buildEspeceList(Species species, WeightCategory weightCategory) { @@ -594,7 +511,9 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, List<Species> result = new ArrayList<Species>(usedEspeces); weightCategoryList.clear(); usedEspeces.clear(); + return result; + } protected List<WeightCategory> buildWeightCategoryList(Species species) { @@ -615,9 +534,9 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, removeFullyUsedCategories(weightCategoryList); return weightCategoryList; + } - @SuppressWarnings("unchecked") protected List<ReasonForDiscard> buildReasonFordiscardList(WeightCategory weightCategory) { ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); @@ -634,6 +553,7 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, } return reasonForDiscardList; + } protected List<WeightCategory> getAllCategories(JAXXContext context) { @@ -642,22 +562,46 @@ public class TargetDiscardCatchUIHandler extends ContentTableUIHandler<SetSeine, return list; } - protected void removeFullyUsedCategories( - List<WeightCategory> weightCategoryAvaillable) { - - ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); + protected void removeFullyUsedCategories(List<WeightCategory> weightCategoryAvaillable) { - int nbReasonForDiscard = - ALL_RAISONS_REJET_ENTRY.getContextValue(getUi()).size(); + int nbReasonForDiscard = ALL_RAISONS_REJET_ENTRY.getContextValue(getUi()).size(); - // on filtre toutes les weightCategory qui ont deja references toutes - // les raisons rejets - for (WeightCategory c : getWeightCategoryUsed(model)) { - Collection<ReasonForDiscard> raisonUsed = getReasonForDiscardUsed(model, c); + // on filtre toutes les weightCategory qui ont deja references toutes les raisons rejets + for (WeightCategory c : getWeightCategoryUsed()) { + Collection<ReasonForDiscard> raisonUsed = getReasonForDiscardUsed(c); if (raisonUsed.size() == nbReasonForDiscard) { // toutes les raison de rejet epuisé pour cette categorie weightCategoryAvaillable.remove(c); } } + + } + + protected Collection<WeightCategory> getWeightCategoryUsed() { + + ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); + + List<WeightCategory> list = model.getColumnValues(1); + Collection<WeightCategory> set = new HashSet<WeightCategory>(list); + list.clear(); + return set; + + } + + protected Collection<ReasonForDiscard> getReasonForDiscardUsed(WeightCategory weightCategory) { + + ContentTableModel<SetSeine, TargetCatch> model = getTableModel(); + + Collection<ReasonForDiscard> set = new HashSet<ReasonForDiscard>(); + if (weightCategory != null) { + for (int i = 0; i < model.getRowCount(); i++) { + TargetCatch c = model.getValueAt(i); + if (c != null && weightCategory.equals(c.getWeightCategory()) && c.getReasonForDiscard() != null) { + set.add(c.getReasonForDiscard()); + } + } + } + return set; + } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java index bcfc0d7..5a90ee1 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java @@ -148,7 +148,7 @@ public class TargetSampleUIHandler extends ContentTableUIHandler<TargetSample, T String setId = getDataContext().getSelectedSetId(); // on ne charge les speciess uniquement si on est en mode édition - List<Species> speciesList = getService(TargetSampleService.class).getAvailableEspeceForTargetSample(setId, discarded); + List<Species> speciesList = getService(TargetSampleService.class).getAvailableSpeciesForTargetSample(setId, discarded); getUi().getSpecies().setData(speciesList); } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/tree/SetLonglineNode.java b/observe-swing/src/main/java/fr/ird/observe/ui/tree/SetLonglineNode.java index 4b0fb0c..570f852 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/tree/SetLonglineNode.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/tree/SetLonglineNode.java @@ -44,7 +44,7 @@ public class SetLonglineNode extends EntityNodeSupport<SetLongline> { @Override protected SetLongline getEntity(ObserveServiceFactory services) { SetLonglineService service = services.getService(SetLonglineService.class); - return service.loadSet(id); + return service.loadForDisplay(id); } } diff --git a/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java b/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java index 191eab6..0710dd2 100644 --- a/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java +++ b/observe-validation/src/main/java/fr/ird/observe/validation/field/VesselActivityFieldValidator.java @@ -25,15 +25,15 @@ package fr.ird.observe.validation.field; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; +import fr.ird.observe.entities.referentiel.seine.VesselActivitySeine; import fr.ird.observe.entities.seine.ActivitySeine; import fr.ird.observe.entities.seine.ActivitySeineImpl; -import fr.ird.observe.entities.seine.TripSeine; import fr.ird.observe.entities.seine.Route; -import fr.ird.observe.entities.referentiel.seine.VesselActivitySeine; +import fr.ird.observe.entities.seine.Routes; +import fr.ird.observe.entities.seine.TripSeine; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.util.ArrayList; import java.util.List; /** @@ -144,29 +144,28 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { log.debug("route : " + route); } - String activityCode = activitySeine.getVesselActivitySeine().getCode(); + String vesselActivityId = activitySeine.getVesselActivitySeine().getTopiaId(); int nbActivitys = route.sizeActivitySeine(); - if (code.equals("-16") && !activityCode.equals(ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE)) { + if (code.equals("-16") && !activitySeine.isActivityFinDeVeille()) { valid = validate_16(activitySeine, maree, route, nbActivitys, false); } switch (Integer.valueOf(code)) { case 6: - if (activityCode.equals(ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE)) { + if (vesselActivityId.equals(ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE_ID)) { valid = validate_6(activitySeine, maree, route, nbActivitys); } break; case 7: - if (activityCode.equals(ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE)) { + if (vesselActivityId.equals(ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE_ID)) { valid = validate_7(activitySeine, maree, route, nbActivitys); } break; case 16: - if (activityCode.equals(ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE)) { - valid = validate_16(activitySeine, maree, route, - nbActivitys, true); + if (activitySeine.isActivityFinDeVeille()) { + valid = validate_16(activitySeine, maree, route, nbActivitys, true); } break; } @@ -223,8 +222,8 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { //FIXME: sinon on verifier que l'activity qu'on veut créer n'est pas //FIXME: dans un intervalle (debut-fin) List<ActivitySeine> activitySeines = route.getActivitySeine(); - Integer[] detectDebutSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE); + Integer[] detectDebutSet = Routes.detectActivities(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE_ID); + Integer[] detectFinSet = Routes.detectActivities(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE_ID); int nbDebutReal = 0; int lastDebutReal = 0; for (Integer i : detectDebutSet) { @@ -273,8 +272,8 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { return false; } List<ActivitySeine> activitySeines = route.getActivitySeine(); - Integer[] detectDebutSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE); + Integer[] detectDebutSet = Routes.detectActivities(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE_ID); + Integer[] detectFinSet = Routes.detectActivities(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE_ID); Integer lastFinSet = null; if (detectFinSet.length > 0) { lastFinSet = detectFinSet[detectFinSet.length - 1]; @@ -359,7 +358,7 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { // on est sur une activity de fin de veille List<ActivitySeine> activitySeines = route.getActivitySeine(); // une seule activity de fin de veille par route - Integer[] detectActivity = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE); + Integer[] detectActivity = Routes.detectActivities(route, ActivitySeineImpl.ACTIVITY_FIN_DE_VEILLE_ID); if (activitySeine.getTopiaId() == null && detectActivity.length > 0) { log.info("il existe deja une activity de fin de veille!"); @@ -380,8 +379,8 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { // } // il ne peut pas rester une activity de debut de peche sans fin // de set (sauf si non coup de senne ?) - Integer[] detectDebutSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE); - Integer[] detectFinSet = detectActivity(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE); + Integer[] detectDebutSet = Routes.detectActivities(route, ActivitySeineImpl.ACTIVITY_DEBUT_DE_PECHE_ID); + Integer[] detectFinSet = Routes.detectActivities(route, ActivitySeineImpl.ACTIVITY_FIN_DE_PECHE_ID); int nbDebutReal = 0; for (Integer i : detectDebutSet) { ActivitySeine bActivitySeine = activitySeines.get(i); @@ -423,23 +422,4 @@ public class VesselActivityFieldValidator extends FieldValidatorSupport { return true; } - /** - * Recupere les positions des activitys d'un certain type - * - * @param route la route à inspecter - * @param code le code du type d'activité à rechercher - * @return les positions des activitys d'un certain type donné - */ - protected Integer[] detectActivity(Route route, String code) { - List<Integer> list = new ArrayList<Integer>(); - int index = 0; - for (ActivitySeine a : route.getActivitySeine()) { - String c = a.getVesselActivitySeine().getCode(); - if (code.equals(c)) { - list.add(index); - } - index++; - } - return list.toArray(new Integer[list.size()]); - } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
participants (1)
-
codelutin.com scm