This is an automated email from the git hooks/post-receive script. New commit to branch feature/7593 in repository observe. See http://git.codelutin.com/observe.git commit 07b7cfa319afb97b33469c3b483abedadfc28f48 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Oct 9 16:02:15 2015 +0200 migration de l'ecran des activité seine (refs #7593) --- .../ui/content/open/impl/seine/ActivitySeineUI.css | 2 - .../content/open/impl/seine/ActivitySeineUI.jaxx | 7 +- .../open/impl/seine/ActivitySeineUIHandler.java | 139 +-------- .../open/impl/seine/ActivitySeineUIModel.java | 2 - .../ui/content/open/impl/seine/RouteUIHandler.java | 4 +- .../fr/ird/observe/ui/tree/ActivitySeineNode.java | 2 +- .../dto/ActivityFinDeVeilleExistsDtoValidator.java | 3 +- .../dto/ActivitySimpleSpeedDtoValidator.java | 13 +- ...ActivitySeineDto-n1-create-error-validation.xml | 328 +++++++++++++++++++++ ...tivitySeineDto-n1-create-warning-validation.xml | 96 ++++++ ...ActivitySeineDto-n1-update-error-validation.xml | 274 +++++++++++++++++ ...tivitySeineDto-n1-update-warning-validation.xml | 95 ++++++ .../seine/RouteDto-n1-update-error-validation.xml | 2 +- .../v1/seine/ActivitySeineServiceController.java | 8 +- .../ird/observe/entities/seine/ActivitySeines.java | 10 + .../java/fr/ird/observe/entities/seine/Routes.java | 10 + .../service/seine/ActivitySeineService.java | 6 +- .../dto/referential/ReferentialReferenceDto.java | 5 + .../services/dto/seine/ActivitySeineDto.java | 21 ++ .../ird/observe/services/dto/seine/RouteDto.java | 59 ++++ .../observe/services/dto/seine/TripSeineDto.java | 23 ++ .../src/main/xmi/observe-services-dto-seine.zargo | Bin 59881 -> 60043 bytes .../services/dto/ObserveDtosInitializer.java | 8 +- .../service/seine/ActivitySeineServiceTopia.java | 29 +- .../services/service/seine/RouteServiceTopia.java | 9 +- 25 files changed, 1001 insertions(+), 154 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.css b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.css index 1503ec8..c9fd164 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.css +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.css @@ -42,8 +42,6 @@ #coordinatesEditor { propertyLatitude:{ActivitySeineDto.PROPERTY_LATITUDE}; propertyLongitude:{ActivitySeineDto.PROPERTY_LONGITUDE}; - //FIXME - //propertyQuadrant:{ActivitySeineDto.PROPERTY_QUADRANT}; } #generalTab { diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.jaxx b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.jaxx index 1a4cb4a..60bcf47 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.jaxx +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUI.jaxx @@ -71,12 +71,11 @@ errorTableModel='{getErrorTableModel()}' context='n1-create'> - <!--<field name='observedSystem' component='{actionDown}'/>--> + <field name='observedSystemEmpty' component='{actionDown}'/> + <field name='observedSystemDistance' component='{actionDown}'/> <field name='longitude' component='coordinatesEditor'/> <field name='latitude' component='coordinatesEditor'/> - - <!--<field name='quadrant' component='coordinatesEditor'/>--> - <!--<field name='floatingObject' component='addDCP'/>--> + <field name='floatingObjectEmpty' component='addDCP'/> </BeanValidator> diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java index 42eb319..877db42 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIHandler.java @@ -28,6 +28,7 @@ import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.ReferenceSetDto; import fr.ird.observe.services.dto.referential.seine.VesselActivitySeineDto; +import fr.ird.observe.services.dto.result.SaveResultDto; import fr.ird.observe.services.dto.seine.ActivitySeineDto; import fr.ird.observe.services.dto.seine.ActivitySeineDtos; import fr.ird.observe.services.dto.seine.RouteDto; @@ -122,7 +123,7 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei } // l'activity existe en base - if (dataContext.isSelectedOpen(ActivitySeineDto.class)) { + if (getOpenDataManager().isOpenActivitySeine(getSelectedId())) { // l'activity est ouverte, donc modifiable return ContentMode.UPDATE; @@ -131,7 +132,7 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei ActivitySeineUI ui = getUi(); // l'activity n'est pas ouverte, donc pas éditable - if (!dataContext.isSelectedOpen(RouteDto.class)) { + if (!getOpenDataManager().isOpenRoute(getSelectedParentId())) { // la route n'est pas ouverte addMessage(ui, @@ -139,7 +140,7 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei getEntityLabel(RouteDto.class), t("observe.route.message.not.open")); - } else if (!dataContext.isSelectedOpen(TripSeineDto.class)) { + } else if (!getOpenDataManager().isOpenTripSeine(dataContext.getSelectedTripSeineId())) { // la marée n'est past ouverte addMessage(ui, @@ -225,74 +226,11 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei finalizeOpenUI(mode, create); getUi().getCoordinatesEditor().setLatitudeAndLongitude(bean.getLatitude(), bean.getLongitude()); - if (create) { - //FIXME -// Integer quadrant = bean.getQuadrant(); - getUi().getCoordinatesEditor().setQuadrant(null); -// getUi().getCoordinatesEditor().setQuadrant(quadrant); - } // on annule la modification engendree par ce binding getModel().setModified(create); } - //FIXME -// @Override -// protected ActivitySeine onPreCreate(TopiaContext tx, -// Object parent, -// ActivitySeine bean) throws TopiaException { -// Route parentBean = (Route) parent; -// -// bean.setOpen(true); -// bean.setLatitude(null); -// bean.setLongitude(null); -// -// Date time; -// -// FpaZone currentFpaZone = null; -// -// ActivitySeine lastActivitySeine = parentBean.getLastActivity(); -// if (lastActivitySeine == null) { -// -// // première activité, on utilise l'heure courante -// time = new Date(); -// -// } else { -// -// // passage en coordonnées absolue + quadrant -// lastActivitySeine.initCoordinates(); -// -// // on recupère le quadrant de cette activity -// // et on l'affecte à la nouvelle activity -// Integer quadrant = lastActivitySeine.getQuadrant(); -// if (quadrant != null) { -// -// if (log.isDebugEnabled()) { -// log.debug("use quadrant of previous activity [" + quadrant + "]"); -// } -// bean.setQuadrant(quadrant); -// } -// -// // on reprend l'heure de la dernière activité -// time = lastActivitySeine.getTime(); -// -// // utilisation des zones fpa de la dernière activité -// currentFpaZone = lastActivitySeine.getNextFpaZone(); -// if (currentFpaZone == null) { -// currentFpaZone = lastActivitySeine.getCurrentFpaZone(); -// } -// -// } -// -// bean.setTime(DateUtil.getTime(time, false, false)); -// bean.setCurrentFpaZone(currentFpaZone); -// -// if (log.isDebugEnabled()) { -// log.debug("has pre-created : " + bean); -// } -// return bean; -// } - @Override public void startEditUI(String... binding) { ActivitySeineUI ui = getUi(); @@ -340,11 +278,11 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei bean.setOpen(true); - String beanId = getActivitySeineService().save(routeId, getModel().getBean()); - bean.setId(beanId); + SaveResultDto result = getActivitySeineService().save(routeId, getModel().getBean()); + bean.setId(result.getId()); + bean.setLastUpdate(result.getLastUpdate()); - //FIXME quand on gèrera l'arbre -// obtainChildPosition(bean); + obtainChildPosition(bean); return true; } @@ -353,45 +291,10 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei @Override protected int getOpenablePosition(String parentId, ActivitySeineDto bean) { - // TODO - return 0; + int position = getActivitySeineService().getActivitySeinePositionInRoute(parentId, bean.getId()); + return position; } - //FIXME -// @Override -// protected ActivitySeine onCreate(TopiaContext tx, Object parent, ActivitySeine editBean) throws TopiaException { -// Route parentBean = (Route) parent; -// ActivitySeine beanToSave = ObserveDAOHelper.getActivitySeineDAO(tx).create(); -// editBean.setTopiaId(beanToSave.getTopiaId()); -// parentBean.addActivitySeine(beanToSave); -// return beanToSave; -// } - - //FIXME -// @Override -// protected ActivitySeine onUpdate(TopiaContext tx, Object parentBean, ActivitySeine beanToSave) throws TopiaException { -// -// ActivitySeine editBean = getBean(); -// -// Route route = (Route) parentBean; -// -// Date d = DateUtil.getDateAndTime(route.getDate(), editBean.getTime(), false, false); -// editBean.setTime(d); -// -// if (log.isInfoEnabled()) { -// log.info("Final time to use : " + d); -// } -// -// getLoadBinder().copyExcluding(editBean, beanToSave, -// ActivitySeine.PROPERTY_FLOATING_OBJECT, -// ActivitySeine.PROPERTY_OBSERVED_SYSTEM); -// -// if (log.isInfoEnabled()) { -// log.info("Is activity open ? : " + beanToSave.isOpen()); -// } -// return beanToSave; -// } - @Override protected boolean doDelete(ActivitySeineDto bean) throws Exception { @@ -411,25 +314,11 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei return true; } - - //FIXME -// @Override -// protected void onDelete(TopiaContext tx, Object parent, ActivitySeine beanToDelete) { -// Route parentBean = (Route) parent; -// parentBean.removeActivitySeine(beanToDelete); -// } - @Override protected boolean obtainCanReopen(boolean create) { - DataContext dataContext = getDataContext(); - // on peut reouvrir une activity si : - // - pas en mode creation - // - pas d'activity d'ouverte - // - la route courante est ouverte - boolean canReopen = !create && - dataContext.isSelectedOpen(RouteDto.class) && - !dataContext.isOpenActivity(); + boolean canReopen = !create && getOpenDataManager().canOpenActivitySeine(getSelectedParentId()); + return canReopen; } @@ -439,9 +328,7 @@ public class ActivitySeineUIHandler extends ContentOpenableUIHandler<ActivitySei ReferenceSetDto<VesselActivitySeineDto> activities = service.getReferentialReferenceSet(VesselActivitySeineDto.class); for (ReferenceDto vesselActivity : activities.getReference()) { - //FIXME -// if (ActivitySeineDto.ACTIVITY_FIN_DE_PECHE.equals(a.getCode())) { - if ("6".equals(vesselActivity.getPropertyValue(VesselActivitySeineDto.PROPERTY_CODE))) { + if (ActivitySeineDto.ACTIVITY_FIN_DE_PECHE.equals(vesselActivity.getPropertyValue(VesselActivitySeineDto.PROPERTY_CODE))) { String label = getDecoratorService().decorate(VesselActivitySeineDto.class.getSimpleName(), vesselActivity); return label; diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIModel.java index 648a1f0..58c5792 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/ActivitySeineUIModel.java @@ -47,8 +47,6 @@ public class ActivitySeineUIModel extends ContentOpenableUIModel<ActivitySeineDt public static final Set<String> GENERAL_TAB_PROPERTIES = ImmutableSet.<String>builder().add(ActivitySeineDto.PROPERTY_TIME, - //FIXME -// ActivitySeineDto.PROPERTY_QUADRANT, ActivitySeineDto.PROPERTY_LATITUDE, ActivitySeineDto.PROPERTY_LONGITUDE, ActivitySeineDto.PROPERTY_VESSEL_ACTIVITY_SEINE, diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java index 5162792..4da84fc 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/RouteUIHandler.java @@ -44,7 +44,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.DateUtil; import org.nuiton.validator.NuitonValidatorScope; -import javax.swing.*; +import javax.swing.JOptionPane; import java.util.Date; import static org.nuiton.i18n.I18n.n; @@ -272,7 +272,7 @@ public class RouteUIHandler extends ContentOpenableUIHandler<RouteDto> { // on doit vérifier qu'il existe une activité de fin // de veille (type activity vessel == 16) - boolean mustAddFinVeille = !RouteDtos.isActivityFindDeVeilleFound(route); + boolean mustAddFinVeille = !route.isActivityFindDeVeilleFound(); boolean createActivityFinDeVeille = false; boolean closeActivityFinDeVeille = false; diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ActivitySeineNode.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ActivitySeineNode.java index 86c5edd..477d6ea 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ActivitySeineNode.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ActivitySeineNode.java @@ -48,7 +48,7 @@ public class ActivitySeineNode extends DtoNodeSupport<ActivitySeineDto> { @Override protected ReferenceDto<ActivitySeineDto> fetchEntity() { ActivitySeineService service = ObserveSwingApplicationContext.get().newService(ActivitySeineService.class); - FormDto<ActivitySeineDto> formDto = service.loadToRead(entity.getId()); + FormDto<ActivitySeineDto> formDto = service.loadToRead(getId()); //FIXME kmorin 20151005 voir quels attributs sont à récupérer ReferenceDto<ActivitySeineDto> referenceDto = diff --git a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityFinDeVeilleExistsDtoValidator.java b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityFinDeVeilleExistsDtoValidator.java index dc7b743..742b6ab 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityFinDeVeilleExistsDtoValidator.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivityFinDeVeilleExistsDtoValidator.java @@ -27,7 +27,6 @@ import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; import fr.ird.observe.services.dto.seine.ActivitySeineDto; import fr.ird.observe.services.dto.seine.RouteDto; -import fr.ird.observe.services.dto.seine.RouteDtos; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -165,7 +164,7 @@ public class ActivityFinDeVeilleExistsDtoValidator extends FieldValidatorSupport + "sur " + route.sizeActivitySeine() + " activity(s)."); } - boolean detected = RouteDtos.isActivityFindDeVeilleFound(route); + boolean detected = route.isActivityFindDeVeilleFound(); boolean valid = required ? detected : !detected; if (log.isDebugEnabled()) { log.debug("detected activity fin de veille " + detected); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivitySimpleSpeedDtoValidator.java b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivitySimpleSpeedDtoValidator.java index b569bb2..6dc48f7 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivitySimpleSpeedDtoValidator.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/validation/validator/dto/ActivitySimpleSpeedDtoValidator.java @@ -28,6 +28,7 @@ import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; import fr.ird.observe.business.gps.GPSPoint; import fr.ird.observe.business.gps.GpsPoints; import fr.ird.observe.services.dto.seine.ActivitySeineDto; +import fr.ird.observe.services.dto.seine.ActivitySeineStubDto; import fr.ird.observe.services.dto.seine.RouteDto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -122,11 +123,10 @@ public class ActivitySimpleSpeedDtoValidator extends FieldValidatorSupport { return; } - RouteDto route = (RouteDto) stack.findValue("routeEntity"); + RouteDto route = (RouteDto) stack.findValue("currentRoute"); + + ActivitySeineStubDto previousActivity = route.getPreviousActivity(activity.getId()); - // FIXME migration client-serveur -// ActivitySeineDto previousActivity = ActivitySeineDtos.getPreviousActivity(route, activity); - ActivitySeineDto previousActivity = null; if (previousActivity == null) { // pas d'activity avant, rien à valider @@ -176,6 +176,11 @@ public class ActivitySimpleSpeedDtoValidator extends FieldValidatorSupport { } //FIXME + protected String decorate(ActivitySeineStubDto activitySeine) { + return activitySeine.toString(); + } + + //FIXME protected String decorate(GPSPoint currentPoint) { return currentPoint.toString(); } diff --git a/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-create-error-validation.xml b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-create-error-validation.xml new file mode 100644 index 0000000..b3f42c6 --- /dev/null +++ b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-create-error-validation.xml @@ -0,0 +1,328 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe :: Validation + %% + Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="vesselActivitySeine"> + + <!-- pas de vesselActivitySeine selectionne --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.required.vesselActivity</message> + </field-validator> + + <!-- vesselActivitySeine desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ vesselActivitySeine.enabled ]]> + </param> + <message>validator.activity.desactivated.vesselActivity</message> + </field-validator> + + <!-- activity de fin de veille possible --> + <field-validator type="activityFinDeVeilleExistsDto" short-circuit="true"> + <param name="required">false</param> + <message>validator.route.activityFinDeVeille.notAvailable</message> + </field-validator> + + <!-- activity de debut de pêche possible --> + <!--field-validator type="activityDebutDePecheSane"> + <message>validator.route.activityDebutDePeche.notAvailable</message> + </field-validator--> + + <!-- activity de fin de pêche possible --> + <!--field-validator type="activityFinDePecheSane"> + <message>validator.route.activityFinDePeche.notAvailable</message> + </field-validator--> + + </field> + + <field name="surroundingActivity"> + + <!-- surroundingActivity desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ surroundingActivity == null || surroundingActivity.enabled ]]> + </param> + <message>validator.activity.desactivated.surroundingActivity</message> + </field-validator> + + </field> + + <field name="reasonForNoFishing"> + + <!-- reasonForNoFishing desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ reasonForNoFishing == null || reasonForNoFishing.enabled ]]> + </param> + <message>validator.activity.desactivated.reasonForNoFishing</message> + </field-validator> + + </field> + + <field name="detectionMode"> + + <!-- detectionMode desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ detectionMode == null || detectionMode.enabled ]]> + </param> + <message>validator.activity.desactivated.detectionMode</message> + </field-validator> + + </field> + + <field name="wind"> + + <!-- wind desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ wind == null || wind.enabled ]]> + </param> + <message>validator.activity.desactivated.wind</message> + </field-validator> + + </field> + + <field name="previousFpaZone"> + + <!-- previousFpaZone desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ previousFpaZone == null || previousFpaZone.enabled ]]> + </param> + <message>validator.activity.desactivated.previousFpaZone</message> + </field-validator> + + </field> + + + <field name="currentFpaZone"> + + <!-- currentFpaZone desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ currentFpaZone == null || currentFpaZone.enabled ]]> + </param> + <message>validator.activity.desactivated.currentFpaZone</message> + </field-validator> + + </field> + + <field name="nextFpaZone"> + + <!-- nextFpaZone desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ nextFpaZone == null || nextFpaZone.enabled ]]> + </param> + <message>validator.activity.desactivated.nextFpaZone</message> + </field-validator> + + </field> + + <field name="time"> + + <!-- pas d'heure d'observation selectionne --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.required.time</message> + </field-validator> + + <!-- heure observation non duplique --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ + currentRoute.isTimeAvailable(id, time) + ]]> + </param> + <message>validator.activity.duplicated.time</message> + </field-validator> + + </field> + + <field name="latitude"> + + <!-- latitude obligatoire --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.required.latitude</message> + </field-validator> + + <!-- 0 <= latitude <= 90 --> + <field-validator type="double" short-circuit="true"> + <param name="minInclusive">-90.0</param> + <param name="maxInclusive">90.0</param> + <message> + validator.activity.bound.latitude##${0.0}##${maxInclusive} + </message> + </field-validator> + + </field> + + <field name="longitude"> + + <!-- longitude obligatoire --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.required.longitude</message> + </field-validator> + + <!-- 0 <= longitude <= 180 --> + <field-validator type="double" short-circuit="true"> + <param name="minInclusive">-180.0</param> + <param name="maxInclusive">180.0</param> + <message> + validator.activity.bound.longitude##${0.0}##${maxInclusive} + </message> + </field-validator> + + <!-- coherence quadrant par rapport a l'ocean de la maree --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"><![CDATA[ + currentTripSeine.ocean == null || longitude == null || latitude == null + || (currentTripSeine.ocean.getPropertyValue("code") == 3) + || (currentTripSeine.ocean.getPropertyValue("code") == 1) + || (currentTripSeine.ocean.getPropertyValue("code") == 2 && ( longitude >= 0)) + ]]> + </param> + <message> + validator.activity.invalid.quadrant##${currentTripSeine.ocean.getPropertyValue("label")} + </message> + </field-validator> + + </field> + + <field name="vesselSpeed"> + + <!-- 0 <= vesselSpeed <= 35 --> + <field-validator type="double" short-circuit="true"> + <param name="minInclusive">0</param> + <param name="maxInclusive">35</param> + <message> + validator.activity.bound.vesselSpeed##${minInclusive}##${maxInclusive} + </message> + </field-validator> + + </field> + + <field name="seaSurfaceTemperature"> + + <!-- temperature surface non saisie || 12.0 <= temperature surface <= 35.0 --> + <field-validator type="fieldexpressionwithparams" short-circuit="true"> + <param name="doubleParams">min:12.0|max:35.0</param> + <param name="expression"> + <![CDATA[ seaSurfaceTemperature == null || (doubles.min <= seaSurfaceTemperature && seaSurfaceTemperature <= doubles.max)]]> + </param> + <message> + validator.activity.bound.seaSurfaceTemperature##${doubles.min}##${doubles.max} + </message> + </field-validator> + + <!-- coherence temperature surface (delta de 12° par rapport a celle de l'activity precedente) --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ + seaSurfaceTemperature == null || previousActivity == null || previousActivity.seaSurfaceTemperature == null || + (previousActivity.seaSurfaceTemperature > seaSurfaceTemperature ? + previousActivity.seaSurfaceTemperature - seaSurfaceTemperature <= 12.0 + : seaSurfaceTemperature - previousActivity.seaSurfaceTemperature <= 12.0 + ) + ]]> + </param> + <message> + validator.activity.invalid.seaSurfaceTemperature##${seaSurfaceTemperature}##${previousActivity.seaSurfaceTemperature}##${previousActivity.time} + </message> + </field-validator> + + </field> + + <field name="comment"> + <!-- comentaire de moins de 1024 caractères --> + <field-validator type="stringlength"> + <param name="maxLength">1024</param> + <message>validator.activity.comment.tobig</message> + </field-validator> + + <!-- comentaire requis pour le type d'activity vessel selectionne --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ vesselActivitySeine == null || !vesselActivitySeine.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.vesselActivity + </message> + </field-validator> + + <!-- comentaire requis pour le type de mode de dectection selectionne --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ detectionMode == null || !detectionMode.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.detectionMode + </message> + </field-validator> + + <!-- comentaire requis pour le type de cause non coup de senne selectionne --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ reasonForNoFishing == null || !reasonForNoFishing.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.reasonForNoFishing + </message> + </field-validator> + + <!-- comentaire requis pour previousFpaZone --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ previousFpaZone == null || !previousFpaZone.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.previousFpaZone + </message> + </field-validator> + + <!-- comentaire requis pour currentFpaZone --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ currentFpaZone == null || !currentFpaZone.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.currentFpaZone + </message> + </field-validator> + + <!-- comentaire requis pour nextFpaZone --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ nextFpaZone == null || !nextFpaZone.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.nextFpaZone + </message> + </field-validator> + + </field> + +</validators> diff --git a/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-create-warning-validation.xml b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-create-warning-validation.xml new file mode 100644 index 0000000..170113c --- /dev/null +++ b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-create-warning-validation.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe :: Validation + %% + Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="time"> + + <field-validator type="activitySimpleSpeedDto" short-circuit="true"> + <param name="speed">30.0</param> + <message>validator.activity.invalid.speed##${foundSpeed}##${speed}</message> + </field-validator> + + </field> + + <field name="surroundingActivity"> + + <!-- Aucune activity environnante selectionnee --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.null.surroundingActivity</message> + </field-validator> + + </field> + + <field name="wind"> + + <!-- Aucun vent beaufort selectionne --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.null.wind</message> + </field-validator> + + </field> + + <field name="seaSurfaceTemperature"> + + <!-- temperature surface non saisie --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.null.seaSurfaceTemperature</message> + </field-validator> + + </field> + + <field name="latitude"> + + <field-validator type="activitySimpleSpeedDto" short-circuit="true"> + <param name="speed">30.0</param> + <message>validator.activity.invalid.speed##${foundSpeed}##${speed}</message> + </field-validator> + + </field> + + <field name="longitude"> + + <field-validator type="activitySimpleSpeedDto" short-circuit="true"> + <param name="speed">30.0</param> + <message>validator.activity.invalid.speed##${foundSpeed}##${speed}</message> + </field-validator> + + </field> + + <field name="vesselSpeed"> + + <!-- 0 <= vesselSpeed <= 35 --> + <field-validator type="double" short-circuit="true"> + <param name="minInclusive">0</param> + <param name="maxInclusive">35</param> + <message> + validator.activity.bound.vesselSpeed##${minInclusive}##${maxInclusive} + </message> + </field-validator> + + </field> + +</validators> diff --git a/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-update-error-validation.xml b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-update-error-validation.xml new file mode 100644 index 0000000..f43b105 --- /dev/null +++ b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-update-error-validation.xml @@ -0,0 +1,274 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe :: Validation + %% + Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="latitude"> + + <!-- latitude obligatoire --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.required.latitude</message> + </field-validator> + + <!-- 0 <= latitude <= 90 --> + <field-validator type="double" short-circuit="true"> + <param name="minInclusive">-90.0</param> + <param name="maxInclusive">90.0</param> + <message> + validator.activity.bound.latitude##${0.0}##${maxInclusive} + </message> + </field-validator> + + </field> + + <field name="longitude"> + + <!-- longitude obligatoire --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.required.longitude</message> + </field-validator> + + <!-- 0 <= longitude <= 180 --> + <field-validator type="double" short-circuit="true"> + <param name="minInclusive">-180.0</param> + <param name="maxInclusive">180.0</param> + <message> + validator.activity.bound.longitude##${0.0}##${maxInclusive} + </message> + </field-validator> + + <!-- coherence quadrant par rapport a l'ocean de la maree --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"><![CDATA[ + currentTripSeine.ocean == null || longitude == null || latitude == null + || (currentTripSeine.ocean.getPropertyValue("code") == 3) + || (currentTripSeine.ocean.getPropertyValue("code") == 1) + || (currentTripSeine.ocean.getPropertyValue("code") == 2 && ( longitude >= 0)) + ]]> + </param> + <message> + validator.activity.invalid.quadrant##${currentTripSeine.ocean.getPropertyValue("label")} + </message> + </field-validator> + + + </field> + + <field name="time"> + + <!-- heure observation non selectionnee --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.required.time</message> + </field-validator> + + <!-- heure observation non duplique --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ currentRoute.isTimeAvailable(topiaId, time) ]]> + </param> + <message>validator.activity.duplicated.time</message> + </field-validator> + + </field> + + <field name="surroundingActivity"> + + <!-- surroundingActivity desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ surroundingActivity == null || surroundingActivity.enabled ]]> + </param> + <message>validator.activity.desactivated.surroundingActivity</message> + </field-validator> + + </field> + + <field name="reasonForNoFishing"> + + <!-- reasonForNoFishing desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ reasonForNoFishing == null || reasonForNoFishing.enabled ]]> + </param> + <message>validator.activity.desactivated.reasonForNoFishing</message> + </field-validator> + + </field> + + <field name="detectionMode"> + + <!-- detectionMode desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ detectionMode == null || detectionMode.enabled ]]> + </param> + <message>validator.activity.desactivated.detectionMode</message> + </field-validator> + + </field> + + <field name="wind"> + + <!-- windSpeed desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ windSpeed == null || ventBeaufort.enabled ]]> + </param> + <message>validator.activity.desactivated.wind</message> + </field-validator> + + </field> + + <field name="vesselSpeed"> + + <!-- 0 <= vesselSpeed <= 35 --> + <field-validator type="double" short-circuit="true"> + <param name="minInclusive">0</param> + <param name="maxInclusive">35</param> + <message> + validator.activity.bound.vesselSpeed##${minInclusive}##${maxInclusive} + </message> + </field-validator> + + </field> + + <field name="seaSurfaceTemperature"> + + <!-- temperature surface non saisie || 12.0 <= temperature surface <= 35.0 --> + <field-validator type="fieldexpressionwithparams" short-circuit="true"> + <param name="doubleParams">min:12.0|max:35.0</param> + <param name="expression"> + <![CDATA[ seaSurfaceTemperature == null || (doubles.min <= seaSurfaceTemperature && seaSurfaceTemperature <= doubles.max)]]> + </param> + <message> + validator.activity.bound.seaSurfaceTemperature##${doubles.min}##${doubles.max} + </message> + </field-validator> + + <!-- coherence temperature surface (delta de 12° par rapport a celle de l'activity precedente) --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ + seaSurfaceTemperature == null || previousActivity == null || previousActivity.seaSurfaceTemperature == null || + (previousActivity.seaSurfaceTemperature > seaSurfaceTemperature ? + previousActivity.seaSurfaceTemperature - seaSurfaceTemperature <= 12.0 + : seaSurfaceTemperature - previousActivity.seaSurfaceTemperature <= 12.0 + ) + ]]> + </param> + <message> + validator.activity.invalid.seaSurfaceTemperature##${seaSurfaceTemperature}##${previousActivity.seaSurfaceTemperature}##${previousActivity.time} + </message> + </field-validator> + + </field> + + <field name="comment"> + + <!-- comentaire de moins de 1024 caractères --> + <field-validator type="stringlength"> + <param name="maxLength">1024</param> + <message>validator.activity.comment.tobig</message> + </field-validator> + + <!-- comentaire requis pour le type d'activity vessel selectionne --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ vesselActivitySeine == null || !vesselActivitySeine.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.vesselActivity + </message> + </field-validator> + + <!-- comentaire requis pour le type de mode de dectection selectionne --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ detectionMode == null || !detectionMode.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.detectionMode + </message> + </field-validator> + + <!-- comentaire requis pour le type de cause non coup de senne selectionne --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ reasonForNoFishing == null || !reasonForNoFishing.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.reasonForNoFishing + </message> + </field-validator> + + <!-- comentaire requis pour previousFpaZone --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ previousFpaZone == null || !previousFpaZone.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.previousFpaZone + </message> + </field-validator> + + <!-- comentaire requis pour currentFpaZone --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ currentFpaZone == null || !currentFpaZone.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.currentFpaZone + </message> + </field-validator> + + <!-- comentaire requis pour nextFpaZone --> + <field-validator type="fieldexpression"> + <param name="expression"> + <![CDATA[ nextFpaZone == null || !nextFpaZone.needComment || (comment != null && !comment.empty) ]]> + </param> + <message> + validator.activity.required.comment.for.nextFpaZone + </message> + </field-validator> + + <!-- comment requis selon le systeme observe --> + + <!--FIXME les système observée ne sont pas connue sur cette écran--> + <!--<field-validator type="collectionFieldExpression">--> + + <!--<param name="collectionFieldName">observedSystem</param>--> + <!--<param name="mode">ALL</param>--> + <!--<param name="useSensitiveContext">true</param>--> + <!--<param name="expression">--> + <!--<![CDATA[ (comment != null && !comment.empty) || !current.needComment ]]>--> + <!--</param>--> + <!--<message>--> + <!--validator.activity.required.comment.for.observedSystem##${index}--> + <!--</message>--> + <!--</field-validator>--> + + </field> + +</validators> diff --git a/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-update-warning-validation.xml b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-update-warning-validation.xml new file mode 100644 index 0000000..f7d2799 --- /dev/null +++ b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/ActivitySeineDto-n1-update-warning-validation.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe :: Validation + %% + Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="surroundingActivity"> + + <!-- Aucune activity environnante selectionnee --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.null.surroundingActivity</message> + </field-validator> + + </field> + + <field name="wind"> + + <!-- Aucun vent beaufort selectionne --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.null.wind</message> + </field-validator> + + </field> + + + <field name="floatingObjectEmpty"> + + <!-- Aucun DCP saisie --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ !floatingObjectEmpty ]]></param> + <message>validator.activity.null.dcp</message> + </field-validator> + + </field> + + <field name="seaSurfaceTemperature"> + + <!-- temperature surface non saisie --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.null.seaSurfaceTemperature</message> + </field-validator> + + </field> + + <field name="observedSystemDistance"> + + <!-- Pas de distance au système observé renseignee --> + <field-validator type="required" short-circuit="true"> + <message>validator.activity.null.observedSystemDistance</message> + </field-validator> + + </field> + + <field name="observedSystemEmpty"> + + <!-- Aucune systeme observe selectionne --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ !observedSystemEmpty ]]></param> + <message>validator.activity.null.observedSystem</message> + </field-validator> + + </field> + + <field name="time"> + + <field-validator type="activitySimpleSpeedDto" short-circuit="true"> + <param name="speed">30.0</param> + <message>validator.activity.invalid.speed##${foundSpeed}##${speed}</message> + </field-validator> + + </field> + +</validators> diff --git a/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/RouteDto-n1-update-error-validation.xml b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/RouteDto-n1-update-error-validation.xml index fc8e70f..b1a5529 100644 --- a/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/RouteDto-n1-update-error-validation.xml +++ b/observe-application-swing/src/main/resources/fr/ird/observe/services/dto/seine/RouteDto-n1-update-error-validation.xml @@ -92,7 +92,7 @@ || (currentTripSeine.ocean.getPropertyValue("code") == 2 && ( current.longitude >= 0)) ]]> </param> - <message>validator.route.invalid.quadrant##${index}##${tripSeineDto.ocean.libelle}</message> + <message>validator.route.invalid.quadrant##${index}##${currentTripSeine.ocean.getPropertyValue("code")}</message> </field-validator> </field> diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/seine/ActivitySeineServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/seine/ActivitySeineServiceController.java index 368aa10..bf7847c 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/seine/ActivitySeineServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/seine/ActivitySeineServiceController.java @@ -25,6 +25,7 @@ package fr.ird.observe.application.web.controller.v1.seine; import fr.ird.observe.application.web.controller.v1.ObserveAuthenticatedServiceControllerSupport; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.ReferenceSetDto; +import fr.ird.observe.services.dto.result.SaveResultDto; import fr.ird.observe.services.dto.seine.ActivitySeineDto; import fr.ird.observe.services.service.seine.ActivitySeineService; @@ -43,6 +44,11 @@ public class ActivitySeineServiceController extends ObserveAuthenticatedServiceC } @Override + public int getActivitySeinePositionInRoute(String routeId, String activitySeineId) { + return service.getActivitySeinePositionInRoute(routeId, activitySeineId); + } + + @Override public FormDto<ActivitySeineDto> loadToRead(String activitySeineId) { return service.loadToRead(activitySeineId); } @@ -58,7 +64,7 @@ public class ActivitySeineServiceController extends ObserveAuthenticatedServiceC } @Override - public String save(String routeId, ActivitySeineDto dto) { + public SaveResultDto save(String routeId, ActivitySeineDto dto) { return service.save(routeId, dto); } 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 21435f8..bf22c23 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 @@ -22,6 +22,7 @@ package fr.ird.observe.entities.seine; * #L% */ +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import fr.ird.observe.entities.constants.ReferenceLocale; import fr.ird.observe.entities.constants.seine.SchoolType; @@ -301,4 +302,13 @@ public class ActivitySeines { } return i; } + + public static Predicate<ActivitySeine> newDateBeforePredicate(final Date time) { + return new Predicate<ActivitySeine>() { + @Override + public boolean apply(ActivitySeine input) { + return input.getTime().before(time); + } + }; + } } 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..d49e279 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,11 +22,13 @@ package fr.ird.observe.entities.seine; * #L% */ +import com.google.common.base.Predicate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.List; /** @@ -91,4 +93,12 @@ public class Routes { return previous; } + public static Predicate<Route> newDateBeforePredicate(final Date date) { + return new Predicate<Route>() { + @Override + public boolean apply(Route input) { + return input.getDate().before(date); + } + }; + } } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineService.java index 05b91b2..1aa93f3 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineService.java @@ -25,6 +25,7 @@ package fr.ird.observe.services.service.seine; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.ReferenceSetDto; +import fr.ird.observe.services.dto.result.SaveResultDto; import fr.ird.observe.services.dto.seine.ActivitySeineDto; import fr.ird.observe.services.spi.DeleteRequest; import fr.ird.observe.services.spi.PostRequest; @@ -41,6 +42,9 @@ public interface ActivitySeineService extends ObserveService { ReferenceSetDto<ActivitySeineDto> getActivitySeineByRoute(String routeId); @ReadDataPermission + int getActivitySeinePositionInRoute(String routeId, String activitySeineId); + + @ReadDataPermission FormDto<ActivitySeineDto> loadToRead(String activitySeineId); @WriteDataPermission @@ -52,7 +56,7 @@ public interface ActivitySeineService extends ObserveService { @Write @WriteDataPermission @PostRequest - String save(String routeId, ActivitySeineDto dto); + SaveResultDto save(String routeId, ActivitySeineDto dto); @Write @WriteDataPermission diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java index 84b5114..b29f2f3 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/referential/ReferentialReferenceDto.java @@ -25,6 +25,7 @@ package fr.ird.observe.services.dto.referential; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import fr.ird.observe.services.dto.constants.ReferenceStatus; import fr.ird.observe.services.dto.constants.ReferentialLocale; import java.io.Serializable; @@ -84,4 +85,8 @@ public class ReferentialReferenceDto<D extends ReferentialDto> extends AbstractR init(type, labelPropertyNamesBuilder.build()); } + public boolean isEnabled() { + return ! ReferenceStatus.disabled.equals(getPropertyValue(ReferentialDto.PROPERTY_STATUS)); + } + } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/ActivitySeineDto.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/ActivitySeineDto.java new file mode 100644 index 0000000..ec9976d --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/ActivitySeineDto.java @@ -0,0 +1,21 @@ +package fr.ird.observe.services.dto.seine; + +import fr.ird.observe.services.dto.referential.seine.VesselActivitySeineDto; + +public class ActivitySeineDto extends AbstractActivitySeineDto { + + public static final String ACTIVITY_FIN_DE_VEILLE = "16"; + + public static final String ACTIVITY_DEBUT_DE_PECHE = "7"; + + public static final String ACTIVITY_FIN_DE_PECHE = "6"; + + + private static final long serialVersionUID = 3846974823980413495L; + + public boolean isActivityFinDeVeille() { + return vesselActivitySeine != null + && ACTIVITY_FIN_DE_VEILLE.equals( + vesselActivitySeine.getPropertyValue(VesselActivitySeineDto.PROPERTY_CODE)); + } +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/RouteDto.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/RouteDto.java new file mode 100644 index 0000000..095f342 --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/RouteDto.java @@ -0,0 +1,59 @@ +package fr.ird.observe.services.dto.seine; + +import com.google.common.base.Optional; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; +import fr.ird.observe.services.dto.IdDtos; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Date; + +public class RouteDto extends AbstractRouteDto { + + private static final Log log = LogFactory.getLog(RouteDto.class); + + private static final long serialVersionUID = 7162466353421772386L; + + public boolean isActivityFindDeVeilleFound() { + int position = Iterables.indexOf( + getActivitySeine(), + ActivitySeineStubDtos.newActivityFinDeVeillePredicate(true)); + return position >= 0; + + } + + public boolean isTimeAvailable(String activitySeineId, Date time) { + Optional<ActivitySeineStubDto> optional = Iterables.tryFind(getActivitySeine(), + Predicates.and(ActivitySeineStubDtos.newTimePredicate(time), + Predicates.not(IdDtos.newIdPredicate(activitySeineId)))); + + return ! optional.isPresent(); + } + + public ActivitySeineStubDto getPreviousActivity(String activitySeineId) { + + ActivitySeineStubDto previous = null; + + if (activitySeineId != null) { + + int currentPosition = Iterables.indexOf(getActivitySeine(), IdDtos.newIdPredicate(activitySeineId)); + if (currentPosition >= 1) { + previous = Iterables.get(getActivitySeine(), currentPosition - 1); + } + } + + if (previous != null) { + if (log.isDebugEnabled()) { + log.debug("previous activity " + + previous.getTime()); + } + } else { + if (log.isDebugEnabled()) { + log.debug("no previous activity for " + activitySeine); + } + } + + return previous; + } +} diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/TripSeineDto.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/TripSeineDto.java new file mode 100644 index 0000000..ea34acf --- /dev/null +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/seine/TripSeineDto.java @@ -0,0 +1,23 @@ +package fr.ird.observe.services.dto.seine; + +import com.google.common.base.Optional; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; +import fr.ird.observe.services.dto.IdDtos; + +import java.util.Date; + +public class TripSeineDto extends AbstractTripSeineDto { + + private static final long serialVersionUID = 3976788848141361507L; + + public boolean isDateAvailable(String routeId, Date date) { + Optional<RouteStubDto> optional = Iterables.tryFind(getRoute(), + Predicates.and(RouteStubDtos.newDatePredicate(date), + Predicates.not(IdDtos.newIdPredicate(routeId)))); + + return ! optional.isPresent(); + } + + +} diff --git a/observe-services-model/src/main/xmi/observe-services-dto-seine.zargo b/observe-services-model/src/main/xmi/observe-services-dto-seine.zargo index 7d5b32d..146b059 100644 Binary files a/observe-services-model/src/main/xmi/observe-services-dto-seine.zargo and b/observe-services-model/src/main/xmi/observe-services-dto-seine.zargo differ diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java index 21a9f84..3539f72 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/dto/ObserveDtosInitializer.java @@ -280,7 +280,12 @@ public class ObserveDtosInitializer implements ObserveModelInitializer { I18nReferentialDto.PROPERTY_LABEL8 }; - private static final String[] DEFAULT_REFERENTIAL_REFERENCE_PROPERTIES = {ReferentialDto.PROPERTY_CODE, I18nReferentialDto.PROPERTY_LABEL1, I18nReferentialDto.PROPERTY_LABEL2, I18nReferentialDto.PROPERTY_LABEL3, + private static final String[] DEFAULT_REFERENTIAL_REFERENCE_PROPERTIES = { + ReferentialDto.PROPERTY_CODE, + I18nReferentialDto.PROPERTY_LABEL1, + I18nReferentialDto.PROPERTY_LABEL2, + I18nReferentialDto.PROPERTY_LABEL3, + ReferentialDto.PROPERTY_STATUS, ReferentialDto.PROPERTY_LAST_UPDATE}; // { @@ -1333,6 +1338,7 @@ public class ObserveDtosInitializer implements ObserveModelInitializer { ActivitySeineDto.PROPERTY_CURRENT_FPA_ZONE, ActivitySeineDto.PROPERTY_NEXT_FPA_ZONE, ActivitySeineDto.PROPERTY_WIND, + ActivitySeineDto.PROPERTY_OBSERVED_SYSTEM_DISTANCE, ActivitySeineDto.PROPERTY_LAST_UPDATE ); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineServiceTopia.java index 54135b3..6630e10 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/ActivitySeineServiceTopia.java @@ -28,6 +28,7 @@ import com.google.common.collect.Sets; import fr.ird.observe.entities.constants.ReferenceLocale; import fr.ird.observe.entities.referentiel.FpaZone; import fr.ird.observe.entities.seine.ActivitySeine; +import fr.ird.observe.entities.seine.ActivitySeines; import fr.ird.observe.entities.seine.Route; import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.dto.FormDto; @@ -35,6 +36,8 @@ import fr.ird.observe.services.dto.ReferenceDto; import fr.ird.observe.services.dto.ReferenceDtos; import fr.ird.observe.services.dto.ReferenceSetDto; import fr.ird.observe.services.dto.ReferenceSetDtos; +import fr.ird.observe.services.dto.result.SaveResultDto; +import fr.ird.observe.services.dto.result.SaveResultDtos; import fr.ird.observe.services.dto.seine.ActivitySeineDto; import fr.ird.observe.services.dto.seine.RouteDto; import fr.ird.observe.services.service.DataNotFoundException; @@ -80,12 +83,28 @@ public class ActivitySeineServiceTopia extends ObserveServiceTopia implements Ac } @Override + public int getActivitySeinePositionInRoute(String routeId, String activitySeineId) { + Route route = loadEntity(RouteDto.class, Route.class, routeId); + + ActivitySeine activitySeine = route.getActivitySeineByTopiaId(activitySeineId); + + int position = Iterables.size(Iterables.filter( + route.getActivitySeine(), + ActivitySeines.newDateBeforePredicate(activitySeine.getTime()))); + + return position; + } + + @Override public FormDto<ActivitySeineDto> loadToRead(String activitySeineId) { ActivitySeine activitySeine = loadEntity(ActivitySeineDto.class, ActivitySeine.class, activitySeineId); FormDto<ActivitySeineDto> form = entityToReadFormDto(ActivitySeineDto.class, ActivitySeine.class, activitySeine); + form.getForm().setObservedSystemEmpty(activitySeine.isObservedSystemEmpty()); + form.getForm().setFloatingObjectEmpty(activitySeine.isFloatingObjectEmpty()); + return form; } @@ -96,6 +115,9 @@ public class ActivitySeineServiceTopia extends ObserveServiceTopia implements Ac FormDto<ActivitySeineDto> form = entityToEditFormDto(ActivitySeineDto.class, ActivitySeine.class, activitySeine); + form.getForm().setObservedSystemEmpty(activitySeine.isObservedSystemEmpty()); + form.getForm().setFloatingObjectEmpty(activitySeine.isFloatingObjectEmpty()); + return form; } @@ -147,11 +169,14 @@ public class ActivitySeineServiceTopia extends ObserveServiceTopia implements Ac FormDto<ActivitySeineDto> form = entityToEditFormDto(ActivitySeineDto.class, ActivitySeine.class, preCreated); + form.getForm().setObservedSystemEmpty(preCreated.isObservedSystemEmpty()); + form.getForm().setFloatingObjectEmpty(preCreated.isFloatingObjectEmpty()); + return form; } @Override - public String save(String routeId, ActivitySeineDto activitySeineDto) { + public SaveResultDto save(String routeId, ActivitySeineDto activitySeineDto) { Route route = loadEntity(RouteDto.class, Route.class, routeId); @@ -167,7 +192,7 @@ public class ActivitySeineServiceTopia extends ObserveServiceTopia implements Ac } - return activitySeine.getTopiaId(); + return SaveResultDtos.newSaveResult(activitySeine.getTopiaId(), activitySeine.getLastUpdate()); } @Override diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/RouteServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/RouteServiceTopia.java index ef284d8..7a00014 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/RouteServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/RouteServiceTopia.java @@ -49,7 +49,6 @@ import org.nuiton.util.DateUtil; import java.util.Date; import java.util.LinkedHashSet; -import java.util.List; import java.util.Set; /** @@ -87,11 +86,11 @@ public class RouteServiceTopia extends ObserveServiceTopia implements RouteServi Route route = tripSeine.getRouteByTopiaId(routeId); - List<Route> routes = Lists.newArrayList(tripSeine.getRoute()); + int position = Iterables.size(Iterables.filter( + tripSeine.getRoute(), + Routes.newDateBeforePredicate(route.getDate()))); - Routes.sort(routes); - - return routes.indexOf(route); + return position; } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.