Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: f2f85a78 by Tony CHEMIT at 2018-10-16T16:36:40Z Calcul de l'activité d'observation sur l'écran de l'activité logbook - closes #1150 - - - - - 23 changed files: - client/src/main/java/fr/ird/observe/client/ui/ObserveKeyStrokes.java - + client/src/main/java/fr/ird/observe/client/ui/actions/content/data/longline/ChooseRelatedObservedActivityUIAction.java - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jcss - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIModel.java - client/src/main/resources/i18n/client_en_GB.properties - client/src/main/resources/i18n/client_es_ES.properties - client/src/main/resources/i18n/client_fr_FR.properties - dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineAware.java - dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineLogbookDto.java - dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineObsDto.java - dto/src/main/java/fr/ird/observe/dto/decoration/DecoratorService.java - dto/src/main/resources/i18n/dto_en_GB.properties - dto/src/main/resources/i18n/dto_es_ES.properties - dto/src/main/resources/i18n/dto_fr_FR.properties - services/pom.xml - services/src/main/java/fr/ird/observe/services/service/actions/pairing/ActivityLonglinePairingEngine.java - services/src/main/java/fr/ird/observe/services/service/actions/pairing/TripLonglinePairingContext.java - dto/src/main/java/fr/ird/observe/dto/data/pairing/ActivityLonglinePairingResult.java → services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/ActivityLonglinePairingResult.java - dto/src/main/java/fr/ird/observe/dto/data/pairing/ActivityLonglinePairingResultItem.java → services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/ActivityLonglinePairingResultItem.java - + services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/ActivityLonglinePairingResultItemDecorator.java - dto/src/main/java/fr/ird/observe/dto/data/pairing/TripLonglinePairingResult.java → services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/TripLonglinePairingResult.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/ui/ObserveKeyStrokes.java ===================================== @@ -75,6 +75,7 @@ public abstract class ObserveKeyStrokes { public static final KeyStroke KEY_STROKE_CONFIGURE_SYNCHRO_FROM_BOTH = KeyStroke.getKeyStroke("ctrl pressed C"); public static final KeyStroke KEY_STROKE_COPY_VALUES_AND_SAVE = KeyStroke.getKeyStroke("ctrl pressed T"); + public static final KeyStroke KEY_STROKE_CHOOSE_RELATED_OBSERVATION_ACTIVITY = KeyStroke.getKeyStroke("ctrl pressed T"); public static final KeyStroke KEY_STROKE_SELECT_TRANSSHIPMENT = KeyStroke.getKeyStroke("ctrl pressed T"); public static final KeyStroke KEY_STROKE_SAVE_TABLE_ENTRY = KeyStroke.getKeyStroke("ctrl pressed S"); public static final KeyStroke KEY_STROKE_PRESSED_ENTER = KeyStroke.getKeyStroke("pressed ENTER"); ===================================== client/src/main/java/fr/ird/observe/client/ui/actions/content/data/longline/ChooseRelatedObservedActivityUIAction.java ===================================== @@ -0,0 +1,145 @@ +package fr.ird.observe.client.ui.actions.content.data.longline; + +/*- + * #%L + * ObServe :: Client + * %% + * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.client.ObserveSwingApplicationContext; +import fr.ird.observe.client.ui.ObserveKeyStrokes; +import fr.ird.observe.client.ui.ObserveMainUI; +import fr.ird.observe.client.ui.actions.content.api.AbstractContentUIAction; +import fr.ird.observe.client.ui.content.api.ContentUI; +import fr.ird.observe.client.ui.content.data.longline.logbook.ActivityLonglineLogbookUI; +import fr.ird.observe.client.ui.content.data.longline.logbook.ActivityLonglineLogbookUIModel; +import fr.ird.observe.client.ui.content.ref.usage.UsageUIHandlerSupport; +import fr.ird.observe.client.ui.util.UIHelper; +import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookDto; +import fr.ird.observe.dto.data.longline.ActivityLonglineObsDto; +import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; +import fr.ird.observe.services.service.data.longline.pairing.ActivityLonglinePairingResult; +import fr.ird.observe.services.service.data.longline.pairing.ActivityLonglinePairingResultItem; +import fr.ird.observe.dto.decoration.DecoratorService; +import fr.ird.observe.dto.decoration.ObserveI18nLabelsBuilder; +import fr.ird.observe.services.service.data.longline.pairing.ActivityLonglinePairingResultItemDecorator; +import fr.ird.observe.services.service.actions.pairing.ActivityLonglinePairingConfig; +import fr.ird.observe.services.service.actions.pairing.ActivityLonglinePairingEngine; +import fr.ird.observe.services.service.actions.pairing.TripLonglinePairingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.jaxx.widgets.select.BeanFilterableComboBox; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; + +/** + * Created by tchemit on 16/10/2018. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public class ChooseRelatedObservedActivityUIAction extends AbstractContentUIAction { + + public static final String ACTION_NAME = ChooseRelatedObservedActivityUIAction.class.getName(); + private static final Logger log = LogManager.getLogger(ChooseRelatedObservedActivityUIAction.class); + private final ActivityLonglinePairingResultItemDecorator decorator; + + public ChooseRelatedObservedActivityUIAction(ObserveMainUI mainUI) { + super(mainUI, ACTION_NAME, n("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity"), n("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity"), "data-calcule", ObserveKeyStrokes.KEY_STROKE_CHOOSE_RELATED_OBSERVATION_ACTIVITY); + ObserveSwingApplicationContext applicationContext = ObserveSwingApplicationContext.get(); + DecoratorService decoratorService = applicationContext.getDecoratorService(); + decorator = new ActivityLonglinePairingResultItemDecorator(decoratorService, applicationContext.getConfig().getLocale()); + } + + @Override + protected void actionPerformed(ContentUI contentUI) { + + ActivityLonglineLogbookUI ui = (ActivityLonglineLogbookUI) contentUI; + ActivityLonglineLogbookUIModel model = ui.getModel(); + + ActivityLonglinePairingEngine pairingEngine = new ActivityLonglinePairingEngine(getServicesProvider(), ui.getConfig()); + + ActivityLonglineLogbookDto bean = model.getBean(); + + TripLonglinePairingContext pairingContext = pairingEngine.newTripContext(model.getSelectedParentId(), model.getAllActivityObs()); + + ActivityLonglinePairingResult activityLonglinePairingResult = pairingEngine.computeForActivityLogbook(pairingContext, bean); + + Optional<ActivityLonglineObsReference> optionalActivityLonglineObs = askNewParent(activityLonglinePairingResult.getItems(), pairingEngine.getConfig()); + + if (optionalActivityLonglineObs.isPresent()) { + ActivityLonglineObsReference activityLonglineObs = optionalActivityLonglineObs.get(); + log.info("will use new related activity obs: " + activityLonglineObs); + bean.setRelatedObservedActivity(activityLonglineObs); + } + } + + private Optional<ActivityLonglineObsReference> askNewParent(List<ActivityLonglinePairingResultItem> pairingResult, ActivityLonglinePairingConfig pairingConfig) { + + BeanFilterableComboBox<ActivityLonglinePairingResultItem> editor = new BeanFilterableComboBox<>(); + editor.setI18nPrefix("observe.common."); + editor.setBeanType(ActivityLonglinePairingResultItem.class); + editor.setI18nLabelBuilder(ObserveI18nLabelsBuilder.createFromReferenceType(ActivityLonglineObsDto.class)); + + editor.init(decorator, new ArrayList<>(pairingResult)); + +// JComboBox combobox = editor.getCombobox(); +// @SuppressWarnings("unchecked") ListCellRenderer toolTipRenderer = new ComboBoxListCellRenderer(combobox.getRenderer()); +// combobox.setRenderer(toolTipRenderer); + + String continueActionText = t("observe.choice.continue"); + Object[] options = {continueActionText, t("observe.choice.cancel")}; + JPanel panel = new JPanel(new BorderLayout()); + panel.add(BorderLayout.NORTH, new JLabel(t("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message", + pairingConfig.getLonglineActivityPairingMaxTime(), pairingConfig.getLonglineActivityPairingMaxDistance()))); + panel.add(BorderLayout.CENTER, editor); + + JOptionPane pane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]); + + JButton jButton = UsageUIHandlerSupport.findButton(pane, continueActionText); + Objects.requireNonNull(jButton); + jButton.setEnabled(false); + editor.addPropertyChangeListener("selectedItem", evt -> jButton.setEnabled(evt.getNewValue() != null)); + + int response = UIHelper.askUser(ObserveSwingApplicationContext.get().getMainUI(), pane, t("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title"), options); + + ActivityLonglinePairingResultItem newActivityLonglineObs = null; + switch (response) { + case 0: + newActivityLonglineObs = editor.getComboBoxModel().getSelectedItem(); + log.info(String.format("Selected new related observed activity id: %s", newActivityLonglineObs)); + break; + default: + log.info("Use cancel choice of related observed activity"); + } + return Optional.ofNullable(newActivityLonglineObs).map(ActivityLonglinePairingResultItem::getObservationActivity); + } + +} + ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jaxx ===================================== @@ -41,8 +41,9 @@ fr.ird.observe.client.ui.actions.content.data.longline.delete.DeleteActivityLonglineLogbookUIAction fr.ird.observe.client.ui.actions.content.data.longline.move.MoveSingleActivityLonglineLogbookUIAction fr.ird.observe.client.ui.actions.content.data.longline.save.SaveActivityLonglineLogbookUIAction + fr.ird.observe.client.ui.actions.content.data.longline.ChooseRelatedObservedActivityUIAction - fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem + fr.ird.observe.services.service.data.longline.pairing.ActivityLonglinePairingResultItem fr.ird.observe.client.ui.util.JComment @@ -190,7 +191,10 @@ <JLabel id='relatedObservedActivityLabel'/> </cell> <cell anchor='east' fill="both"> - <BeanFilterableComboBox id='relatedObservedActivity' genericType='ActivityLonglinePairingResultItem' constructorParams='this'/> + <JPanel layout="{new BorderLayout()}"> + <BeanFilterableComboBox id='relatedObservedActivity' genericType='ActivityLonglineObsReference' constructorParams='this' constraints='BorderLayout.CENTER'/> + <JButton id='chooseRelatedObservedActivity' constraints='BorderLayout.EAST'/> + </JPanel> </cell> </row> ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jcss ===================================== @@ -84,10 +84,8 @@ #relatedObservedActivity { _listNoLoad:true; - bean:{model}; - property:activityObs; - data:{model.getActivityObsCandidates()}; - selectedItem:{model.getActivityObs()}; + data:{model.getActivityObs()}; + selectedItem:{bean.getRelatedObservedActivity()}; } #reopen { @@ -119,3 +117,9 @@ enabled:{!model.isModified() && model.isValid() && model.isSetOperation() && ! bean.isHasSetLongline()}; _observeAction:{AddActivityLonglineLogbookSetUIAction.ACTION_NAME}; } + +#chooseRelatedObservedActivity { + visible:{!model.isReadingMode()}; + enabled:{model.isValid()}; + _observeAction:{ChooseRelatedObservedActivityUIAction.ACTION_NAME}; +} \ No newline at end of file ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIHandler.java ===================================== @@ -22,44 +22,19 @@ package fr.ird.observe.client.ui.content.data.longline.logbook; * #L% */ -import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.ui.content.api.data.open.ContentOpenableUIHandler; -import fr.ird.observe.client.ui.content.api.data.open.ContentOpenableUIInitializer; import fr.ird.observe.client.ui.content.api.ui.ObserveLayoutFocusTraversalPolicy; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookDto; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookReference; -import fr.ird.observe.dto.data.longline.ActivityLonglineObsDto; import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResult; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem; -import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; -import fr.ird.observe.dto.decoration.ObserveI18nLabelsBuilder; import fr.ird.observe.dto.form.Form; -import fr.ird.observe.services.service.actions.pairing.ActivityLonglinePairingEngine; -import fr.ird.observe.services.service.actions.pairing.TripLonglinePairingContext; -import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.nuiton.decorator.Decorator; -import org.nuiton.decorator.JXPathDecorator; import org.nuiton.jaxx.runtime.spi.UIHandler; -import org.nuiton.jaxx.widgets.select.BeanFilterableComboBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.KeyStroke; -import javax.swing.ListCellRenderer; import java.awt.Component; import java.awt.Container; -import java.awt.Dimension; -import java.awt.event.KeyEvent; -import java.beans.PropertyChangeListener; -import java.util.Collections; -import java.util.Optional; - -import static org.nuiton.i18n.I18n.t; +import java.util.List; /** * Created on 8/29/14. @@ -69,65 +44,13 @@ import static org.nuiton.i18n.I18n.t; */ class ActivityLonglineLogbookUIHandler extends ContentOpenableUIHandler<ActivityLonglineLogbookDto, ActivityLonglineLogbookReference, ActivityLonglineLogbookUI> implements UIHandler<ActivityLonglineLogbookUI> { - private static final ImmutableSet<String> PAIRING_PROPERTIES = ImmutableSet.of( - ActivityLonglineLogbookDto.PROPERTY_LATITUDE, - ActivityLonglineLogbookDto.PROPERTY_LONGITUDE, - ActivityLonglineLogbookDto.PROPERTY_TIME_STAMP, - ActivityLonglineLogbookUIModel.PROPERTY_VALID); - private static final Logger log = LogManager.getLogger(ActivityLonglineLogbookUIHandler.class); - private final PropertyChangeListener onRecomputePairing; - private final PropertyChangeListener onActivityObsChanged; - private ActivityLonglinePairingEngine pairingEngine; - private boolean adjusting; - - ActivityLonglineLogbookUIHandler() { - onRecomputePairing = e -> onRecomputePairing(e.getPropertyName()); - onActivityObsChanged = e -> onActivityObsChanged(); - } @Override public ActivityLonglineLogbookUIModel getModel() { return ui.getModel(); } - @Override - protected ContentOpenableUIInitializer<ActivityLonglineLogbookUI> createContentUIInitializer(ActivityLonglineLogbookUI ui) { - return new ContentOpenableUIInitializer<ActivityLonglineLogbookUI>(ui) { - - @SuppressWarnings("unchecked") - protected void init(BeanFilterableComboBox comboBox) { - if (!"relatedObservedActivity".equals(comboBox.getName())) { - super.init(comboBox); - return; - } - - comboBox.getCombobox().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, 0), "none"); - Class referenceType = comboBox.getBeanType(); - comboBox.setI18nLabelBuilder(ObserveI18nLabelsBuilder.createFromReferenceType(ActivityLonglineObsDto.class)); - comboBox.setI18nPrefix("observe.common."); - comboBox.setMinimumSize(new Dimension(0, 24)); - - if (StringUtils.isEmpty(comboBox.getProperty())) { - comboBox.setProperty(comboBox.getName()); - } - - log.info("Init relatedObservedActivity comboBox"); - Decorator decorator = decoratorService.getDecoratorByType(referenceType); - - String entityLabel = t(ObserveI18nDecoratorHelper.getTypeI18nKey(ActivityLonglineObsDto.class)); - comboBox.setPopupTitleText(t("observe.common.DataDto.type", entityLabel)); - - comboBox.init((JXPathDecorator) decorator, Collections.emptyList()); - - JComboBox combobox = comboBox.getCombobox(); - - @SuppressWarnings("unchecked") ListCellRenderer toolTipRenderer = new ComboBoxListCellRenderer(combobox.getRenderer()); - combobox.setRenderer(toolTipRenderer); - } - }; - } - @Override protected ObserveLayoutFocusTraversalPolicy<ActivityLonglineLogbookUI> createFocusTraversalPolicy() { return new ObserveLayoutFocusTraversalPolicy<ActivityLonglineLogbookUI>() { @@ -148,101 +71,6 @@ class ActivityLonglineLogbookUIHandler extends ContentOpenableUIHandler<Activity }; } - @Override - public void afterInit(ActivityLonglineLogbookUI ui) { - super.afterInit(ui); - pairingEngine = getDataSource().newActivityLonglinePairingEngine(ui.getConfig()); - } - - private void onRecomputePairing(String propertyName) { - if (adjusting || !PAIRING_PROPERTIES.contains(propertyName)) { - return; - } - log.info(prefix + "Need to recompute pairing data."); - ActivityLonglineLogbookUIModel model = getModel(); - if (!model.isValid()) { - log.info(prefix + "Reject: model is not valid."); - return; - } - adjusting = true; - try { - ActivityLonglineLogbookDto bean = model.getBean(); - ActivityLonglinePairingResult activityLonglinePairingResult = pairingEngine.computeForActivityLogbook(model.getPairingContext(), bean); - ActivityLonglinePairingResultItem pairingActivityObs = model.getActivityObs(); - ActivityLonglineObsReference relatedObservedActivity = model.getBean().getRelatedObservedActivity(); - - model.setActivityObsCandidates(activityLonglinePairingResult.getItems()); - - if (pairingActivityObs == null) { - - if (relatedObservedActivity != null) { - // use dto value - Optional<ActivityLonglinePairingResultItem> first = model.getActivityObsCandidates().stream().filter(e -> e.getObservationActivity().equals(relatedObservedActivity)).findFirst(); - if (!first.isPresent()) { - // Should never occurs ? - bean.setRelatedObservedActivity(null); - } else { - pairingActivityObs = first.get(); - model.setActivityObs(pairingActivityObs); - bean.setRelatedObservedActivity(pairingActivityObs.getObservationActivity()); - } - } - } else { - if (!model.getActivityObsCandidates().contains(pairingActivityObs)) { - // can not keep this pairing, - model.setActivityObs(null); - bean.setRelatedObservedActivity(null); - } else { - // keep this pairing - // use pairing value - bean.setRelatedObservedActivity(pairingActivityObs.getObservationActivity()); - } - } - } finally { - adjusting = false; - } - } - - private void onActivityObsChanged() { - if (adjusting) { - return; - } - adjusting = true; - try { - ActivityLonglineLogbookUIModel model = getModel(); - ActivityLonglinePairingResultItem activityObs = model.getActivityObs(); - model.getBean().setRelatedObservedActivity(activityObs == null ? null : activityObs.getObservationActivity()); - } finally { - adjusting = false; - } - } - - @Override - protected void onOpenBeforeOpenModel() { - ActivityLonglineLogbookUIModel model = getModel(); - ActivityLonglineLogbookDto bean = model.getBean(); - model.removePropertyChangeListener(ActivityLonglineLogbookUIModel.PROPERTY_VALID, onRecomputePairing); - bean.removePropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LATITUDE, onRecomputePairing); - bean.removePropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LONGITUDE, onRecomputePairing); - bean.removePropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_TIME_STAMP, onRecomputePairing); - bean.removePropertyChangeListener("activityObs", onActivityObsChanged); - - super.onOpenBeforeOpenModel(); - } - - @Override - protected void onOpenAfterOpenModel() { - super.onOpenAfterOpenModel(); - ActivityLonglineLogbookUIModel model = getModel(); - ActivityLonglineLogbookDto bean = model.getBean(); - model.addPropertyChangeListener(ActivityLonglineLogbookUIModel.PROPERTY_VALID, onRecomputePairing); - bean.addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LATITUDE, onRecomputePairing); - bean.addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LONGITUDE, onRecomputePairing); - bean.addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_TIME_STAMP, onRecomputePairing); - bean.addPropertyChangeListener("activityObs", onActivityObsChanged); - onRecomputePairing(ActivityLonglineLogbookUIModel.PROPERTY_VALID); - } - @Override protected void onOpenModel() { super.onOpenModel(); @@ -260,37 +88,8 @@ class ActivityLonglineLogbookUIHandler extends ContentOpenableUIHandler<Activity form = getActivityLonglineLogbookService().loadForm(activityId); } - TripLonglinePairingContext pairingContext = pairingEngine.newTripContext(tripId); - model.openForm(form, pairingContext); + List<ActivityLonglineObsReference> allActivityLonglineObs = getActivityLonglineObsService().getActivityLonglineByTripLongline(tripId).toList(); + model.openForm(form, allActivityLonglineObs); } - - private static class ComboBoxListCellRenderer<E extends ActivityLonglinePairingResultItem> implements ListCellRenderer<E> { - - private final ListCellRenderer<? super E> renderer; - - ComboBoxListCellRenderer(ListCellRenderer<? super E> renderer) { - this.renderer = renderer; - } - - @Override - public Component getListCellRendererComponent(JList<? extends E> list, - E value, - int index, - boolean isSelected, - boolean cellHasFocus) { - Component comp = renderer.getListCellRendererComponent( - list, - value, - index, - isSelected, - cellHasFocus - ); - if (comp instanceof JLabel) { - JLabel jcomp = (JLabel) comp; - jcomp.setToolTipText(jcomp.getText()); - } - return comp; - } - } } ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIModel.java ===================================== @@ -22,20 +22,23 @@ package fr.ird.observe.client.ui.content.data.longline.logbook; * #L% */ +import com.google.common.collect.ImmutableList; import fr.ird.observe.client.ui.content.api.data.open.ContentOpenableUIModel; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookDto; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookReference; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem; +import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; import fr.ird.observe.dto.form.Form; import fr.ird.observe.dto.referential.longline.VesselActivityLonglineHelper; import fr.ird.observe.dto.referential.longline.VesselActivityLonglineReference; -import fr.ird.observe.services.service.actions.pairing.TripLonglinePairingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.i18n.I18n; import org.nuiton.util.DateUtil; -import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * Created on 9/26/14. @@ -45,22 +48,26 @@ import java.util.List; */ public class ActivityLonglineLogbookUIModel extends ContentOpenableUIModel<ActivityLonglineLogbookDto, ActivityLonglineLogbookReference> { - public static final String PROPERTY_SET_OPERATION = "setOperation"; public static final String PROPERTY_DATE = "date"; public static final String PROPERTY_TIME = "time"; + private static final String PROPERTY_SET_OPERATION = "setOperation"; private static final long serialVersionUID = 1L; - - private TripLonglinePairingContext pairingContext; - private List<ActivityLonglinePairingResultItem> activityObsCandidates; - private ActivityLonglinePairingResultItem activityObs; + private static final Logger log = LogManager.getLogger(ActivityLonglineLogbookUIModel.class); + private List<ActivityLonglineObsReference> allActivityObs; + private List<ActivityLonglineObsReference> activityObs; + private boolean opening = false; public ActivityLonglineLogbookUIModel() { super(ActivityLonglineLogbookDto.class, I18n.n("observe.common.ActivityLonglineLogbookDto.message.not.open")); getBean().addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_VESSEL_ACTIVITY_LONGLINE, evt -> { boolean oldValue = VesselActivityLonglineHelper.isSetOperation((VesselActivityLonglineReference) evt.getOldValue()); - boolean newValue = VesselActivityLonglineHelper.isSetOperation((VesselActivityLonglineReference) evt.getNewValue()); + VesselActivityLonglineReference vesselActivityLonglineReference = (VesselActivityLonglineReference) evt.getNewValue(); + boolean newValue = VesselActivityLonglineHelper.isSetOperation(vesselActivityLonglineReference); firePropertyChange(PROPERTY_SET_OPERATION, oldValue, newValue); + if (!opening) { + updateActivityObs(); + } }); } @@ -94,31 +101,45 @@ public class ActivityLonglineLogbookUIModel extends ContentOpenableUIModel<Activ } } - public void openForm(Form<ActivityLonglineLogbookDto> form, TripLonglinePairingContext pairingContext) { - this.pairingContext = pairingContext; - super.openForm(form); - } - - public TripLonglinePairingContext getPairingContext() { - return pairingContext; + public void openForm(Form<ActivityLonglineLogbookDto> form, List<ActivityLonglineObsReference> allActivityObs) { + this.allActivityObs = ImmutableList.copyOf(allActivityObs); + opening = true; + try { + super.openForm(form); + } finally { + opening = false; + } + updateActivityObs(); } - public List<ActivityLonglinePairingResultItem> getActivityObsCandidates() { - return activityObsCandidates; + public List<ActivityLonglineObsReference> getActivityObs() { + return activityObs; } - public void setActivityObsCandidates(List<ActivityLonglinePairingResultItem> activityObsCandidates) { - this.activityObsCandidates = activityObsCandidates == null ? null : new ArrayList<>(activityObsCandidates); - firePropertyChange("activityObsCandidates", null, this.activityObsCandidates); + public void setActivityObs(List<ActivityLonglineObsReference> activityObs) { + // only used for jaxx binding } - public ActivityLonglinePairingResultItem getActivityObs() { - return activityObs; + public List<ActivityLonglineObsReference> getAllActivityObs() { + return allActivityObs; } - public void setActivityObs(ActivityLonglinePairingResultItem activityObs) { - ActivityLonglinePairingResultItem oldValue = getActivityObs(); - this.activityObs = activityObs; - firePropertyChange("activityObs", oldValue, activityObs); + private void updateActivityObs() { + log.info(getPrefix() + "Will update release observed actities..."); + ActivityLonglineLogbookDto bean = getBean(); + if (allActivityObs == null || bean.getVesselActivityLonglineId() == null) { + activityObs = Collections.emptyList(); + } else { + String vesselActivityLonglineId = bean.getVesselActivityLonglineId(); + activityObs = allActivityObs.stream().filter(e -> vesselActivityLonglineId.equals(e.getVesselActivityLonglineId())).collect(Collectors.toList()); + } + log.info(getPrefix() + "Found " + activityObs.size() + " related observed activities."); + ActivityLonglineObsReference relatedObservedActivity = bean.getRelatedObservedActivity(); + boolean removeRelatedObservedActivity = !opening && relatedObservedActivity != null && !activityObs.contains(relatedObservedActivity); + firePropertyChange("activityObs", null, activityObs); + if (removeRelatedObservedActivity) { + log.info(getPrefix() + "Removed not matching related observed activity: " + relatedObservedActivity); + bean.setRelatedObservedActivity(null); + } } } ===================================== client/src/main/resources/i18n/client_en_GB.properties ===================================== @@ -363,6 +363,9 @@ observe.common.ActivityLogbookDto.action.goToOpen.short=Logbook - Open activity observe.common.ActivityLogbookDto.action.goToOpen.tip=Go to open activity (Logbook) observe.common.ActivityLonglineLogbookDto.action.addSet=Add the fishing operation observe.common.ActivityLonglineLogbookDto.action.addSet.tip=Add the fishing operation associated with this activity +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity=Choose activity +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message=Choose an activity beyoung the universe of possible ones (time minus than %s (minutes) and distance minus than %s (km))\: +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title=Choose the related observed activity observe.common.ActivityLonglineLogbookDto.action.moves=Change trip observe.common.ActivityLonglineLogbookDto.action.moves.tip=Change trip of activities observe.common.ActivityLonglineLogbookDto.list.message.none=< No activity for current trip > ===================================== client/src/main/resources/i18n/client_es_ES.properties ===================================== @@ -363,6 +363,9 @@ observe.common.ActivityLogbookDto.action.goToOpen.short=Logbook - Open activity observe.common.ActivityLogbookDto.action.goToOpen.tip=Go to open activity (Logbook) \#TODO observe.common.ActivityLonglineLogbookDto.action.addSet=Añadir la operación de pesca observe.common.ActivityLonglineLogbookDto.action.addSet.tip=Añadir la operación de pesca asociada a esta actividad +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity=Choose activity \#TODO +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message=Choose an activity beyoung the universe of possible ones (time minus than %s (minutes) and distance minus than %s (km))\: \#TODO +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title=Choose the related observed activity \#TODO observe.common.ActivityLonglineLogbookDto.action.moves=Cambiar de marea observe.common.ActivityLonglineLogbookDto.action.moves.tip=Cambiar la marea de las actividades seleccionas observe.common.ActivityLonglineLogbookDto.list.message.none=< Ninguna actividad por la marea actual > ===================================== client/src/main/resources/i18n/client_fr_FR.properties ===================================== @@ -363,6 +363,9 @@ observe.common.ActivityLogbookDto.action.goToOpen.short=Livre de bord - Activit observe.common.ActivityLogbookDto.action.goToOpen.tip=Accéder à l'activité ouverte (Livre de bord) observe.common.ActivityLonglineLogbookDto.action.addSet=Ajouter l'opération de pêche observe.common.ActivityLonglineLogbookDto.action.addSet.tip=Ajouter l'opération de pêche associée à cette activité +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity=Choisir l'activité +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message=Veuillez choisir une activité parmis celles possible (durée de moins de %s minutes et distance moins de %s kms) \: +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title=Choisir l'activité d'observation associée observe.common.ActivityLonglineLogbookDto.action.moves=Changer de marée observe.common.ActivityLonglineLogbookDto.action.moves.tip=Changer la marée des activités sélectionnées observe.common.ActivityLonglineLogbookDto.list.message.none=< Aucune activité pour la marée courante > ===================================== dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineAware.java ===================================== @@ -51,4 +51,6 @@ public interface ActivityLonglineAware extends ObserveDto { Float getLatitude(); Float getLongitude(); + + String getVesselActivityLonglineId(); } ===================================== dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineLogbookDto.java ===================================== @@ -70,4 +70,8 @@ public class ActivityLonglineLogbookDto extends GeneratedActivityLonglineLogbook return ActivityLonglineAware.newGPSPoint(this); } + @Override + public String getVesselActivityLonglineId() { + return vesselActivityLongline == null ? null : vesselActivityLongline.getId(); + } } ===================================== dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineObsDto.java ===================================== @@ -69,4 +69,9 @@ public class ActivityLonglineObsDto extends GeneratedActivityLonglineObsDto impl public GPSPoint getGPSPoint() { return ActivityLonglineAware.newGPSPoint(this); } + + @Override + public String getVesselActivityLonglineId() { + return vesselActivityLongline == null ? null : vesselActivityLongline.getId(); + } } ===================================== dto/src/main/java/fr/ird/observe/dto/decoration/DecoratorService.java ===================================== @@ -83,7 +83,6 @@ import fr.ird.observe.dto.data.longline.TripLonglineActivityObsDto; import fr.ird.observe.dto.data.longline.TripLonglineReference; import fr.ird.observe.dto.data.longline.WeightMeasureObsDto; import fr.ird.observe.dto.data.longline.WeightMeasureObsReference; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem; import fr.ird.observe.dto.data.seine.ActivitySeineDto; import fr.ird.observe.dto.data.seine.ActivitySeineReference; import fr.ird.observe.dto.data.seine.ActivitySeineStubDto; @@ -306,8 +305,6 @@ public class DecoratorService extends DecoratorProvider { private String haulingIdentifier; private String settingIdentifier; - private String pairingTime; - private String pairingDistance; private String libelle; private Locale locale; @@ -317,8 +314,6 @@ public class DecoratorService extends DecoratorProvider { libelle = referentialLocale.getLibelle(); settingIdentifier = l(locale, "observe.common.settingIdentifier"); haulingIdentifier = l(locale, "observe.common.haulingIdentifier"); - pairingTime = l(locale, "observe.common.pairingTime"); - pairingDistance = l(locale, "observe.common.pairingDistance"); } @Override @@ -346,10 +341,6 @@ public class DecoratorService extends DecoratorProvider { registerObserveDecorator(ServerDataSourceConfiguration.class, "${name}$s", " "); registerObserveDecorator(WITH_URL, ServerDataSourceConfiguration.class, "${name}$s##${url}$s"); registerObserveDecorator(FloatingObjectPreset.class, "${name}$s", " "); - - registerObserveDecorator(ActivityLonglinePairingResultItem.class, - "${observationActivity/timeStamp}$td/%1$tm/%1$tY %1$tH:%1$tM##${observationActivity/vesselActivityLonglineLabel}$s##" + pairingTime + " ${computedTime}$s##" + pairingDistance + " ${computedDistance}$s", " "); - } ===================================== dto/src/main/resources/i18n/dto_en_GB.properties ===================================== @@ -298,8 +298,8 @@ observe.common.lengthWeightFormula=Length weight formula observe.common.no.unit=No unit observe.common.nocode=Nocode observe.common.none=None -observe.common.pairingDistance=Distance (km) -observe.common.pairingTime=Time (minutes) +observe.common.pairingDistance=Distance (in kms) +observe.common.pairingTime=Time (in minutes) observe.common.program=Program observe.common.scientificLabel=Scientific label observe.common.settingIdentifier=Setting ===================================== dto/src/main/resources/i18n/dto_es_ES.properties ===================================== @@ -296,8 +296,8 @@ observe.common.lengthWeightFormula=Relación de peso observe.common.no.unit=No unit \#TODO observe.common.nocode=codigo ausente observe.common.none=Ninguno -observe.common.pairingDistance=Distance (km) \#TODO -observe.common.pairingTime=Time (minutes) \#TODO +observe.common.pairingDistance=Distance (in kms) \#TODO +observe.common.pairingTime=Time (in minutes) \#TODO observe.common.program=Programa observe.common.scientificLabel=Texto científico observe.common.settingIdentifier=Calada ===================================== dto/src/main/resources/i18n/dto_fr_FR.properties ===================================== @@ -298,8 +298,8 @@ observe.common.lengthWeightFormula=Relation Poids observe.common.no.unit=Pas d'unité observe.common.nocode=code absent observe.common.none=Aucun -observe.common.pairingDistance=Distance (km) -observe.common.pairingTime=Temps (mn) +observe.common.pairingDistance=Distance (en kms) +observe.common.pairingTime=Temps (en minutes) observe.common.program=Programme observe.common.scientificLabel=Libellé scientifique observe.common.settingIdentifier=Filage ===================================== services/pom.xml ===================================== @@ -118,6 +118,10 @@ <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> </dependency> + <dependency> + <groupId>commons-jxpath</groupId> + <artifactId>commons-jxpath</artifactId> + </dependency> <dependency> <groupId>com.google.guava</groupId> ===================================== services/src/main/java/fr/ird/observe/services/service/actions/pairing/ActivityLonglinePairingEngine.java ===================================== @@ -27,12 +27,13 @@ import com.google.common.collect.ImmutableMap; import fr.ird.observe.dto.data.longline.ActivityLonglineAware; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookReference; import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResult; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem; -import fr.ird.observe.dto.data.pairing.TripLonglinePairingResult; +import fr.ird.observe.services.service.data.longline.pairing.ActivityLonglinePairingResult; +import fr.ird.observe.services.service.data.longline.pairing.ActivityLonglinePairingResultItem; +import fr.ird.observe.services.service.data.longline.pairing.TripLonglinePairingResult; import fr.ird.observe.services.ObserveServicesProvider; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Set; @@ -53,11 +54,13 @@ public class ActivityLonglinePairingEngine { this.config = config; } - public TripLonglinePairingContext newTripContext(String tripLonglineId) { - Set<ActivityLonglineObsReference> activityLonglineObsReferenceSet = servicesProvider.getActivityLonglineObsService().getActivityLonglineByTripLongline(tripLonglineId).toSet(); - return new TripLonglinePairingContext(config, tripLonglineId, ImmutableList.copyOf(activityLonglineObsReferenceSet)); + public ActivityLonglinePairingConfig getConfig() { + return config; } + public TripLonglinePairingContext newTripContext(String tripLonglineId, Collection<ActivityLonglineObsReference> allActivityLonglineObs) { + return new TripLonglinePairingContext(config, tripLonglineId, ImmutableList.copyOf(allActivityLonglineObs)); + } public TripLonglinePairingResult computeForTrip(TripLonglinePairingContext context) { ImmutableMap.Builder<ActivityLonglineLogbookReference, ActivityLonglinePairingResult> resultBuilder = ImmutableMap.builder(); @@ -70,7 +73,7 @@ public class ActivityLonglinePairingEngine { } public ActivityLonglinePairingResult computeForActivityLogbook(TripLonglinePairingContext context, ActivityLonglineAware activityLonglineLogbook) { - ImmutableList<ActivityLonglineObsReference> activityLonglineObsList = context.getActivityLonglineObsList(); + ImmutableList<ActivityLonglineObsReference> activityLonglineObsList = context.getActivityLonglineObsList(activityLonglineLogbook.getVesselActivityLonglineId()); List<ActivityLonglinePairingResultItem> itemBuilder = new ArrayList<>(activityLonglineObsList.size()); long longlineActivityPairingMaxTime = context.getConfig().getLonglineActivityPairingMaxTime(); long longlineActivityPairingMaxDistance = context.getConfig().getLonglineActivityPairingMaxDistance(); @@ -84,7 +87,7 @@ public class ActivityLonglinePairingEngine { private ActivityLonglinePairingResultItem toActivityResultItem(ActivityLonglineAware activityLonglineLogbook, ActivityLonglineObsReference activityLonglineObsReference, double maxTime, double maxDistance) { Date logbookTimeStamp = activityLonglineLogbook.getTimeStamp(); Date obsTimeStamp = activityLonglineObsReference.getTimeStamp(); - double computedTime = Math.abs(TimeUnit.MINUTES.convert(logbookTimeStamp.getTime() - obsTimeStamp.getTime(), TimeUnit.MILLISECONDS)); + long computedTime = Math.abs(TimeUnit.MINUTES.convert(logbookTimeStamp.getTime() - obsTimeStamp.getTime(), TimeUnit.MILLISECONDS)); double computedDistance = activityLonglineLogbook.getGPSPoint().getDistanceInKm(activityLonglineObsReference.getGPSPoint()); return new ActivityLonglinePairingResultItem(activityLonglineObsReference, computedTime, computedDistance, computedTime < maxTime, computedDistance < maxDistance); } ===================================== services/src/main/java/fr/ird/observe/services/service/actions/pairing/TripLonglinePairingContext.java ===================================== @@ -26,6 +26,8 @@ import com.google.common.collect.ImmutableList; import fr.ird.observe.dto.ObserveDto; import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; +import java.util.stream.Collectors; + /** * Created by tchemit on 15/10/2018. * @@ -35,28 +37,24 @@ public class TripLonglinePairingContext implements ObserveDto { private final ActivityLonglinePairingConfig config; private final String tripLonglineId; - private final ImmutableList<ActivityLonglineObsReference> activityLonglineObsList; + private final ImmutableList<ActivityLonglineObsReference> allActivityLonglineObs; - public TripLonglinePairingContext(ActivityLonglinePairingConfig config, String tripLonglineId, ImmutableList<ActivityLonglineObsReference> activityLonglineObsList) { + public TripLonglinePairingContext(ActivityLonglinePairingConfig config, String tripLonglineId, ImmutableList<ActivityLonglineObsReference> allActivityLonglineObs) { this.config = config; this.tripLonglineId = tripLonglineId; - this.activityLonglineObsList = activityLonglineObsList; + this.allActivityLonglineObs = allActivityLonglineObs; } public ActivityLonglinePairingConfig getConfig() { return config; } - - public ImmutableList<ActivityLonglineObsReference> getActivityLonglineObsList() { - return activityLonglineObsList; + public ImmutableList<ActivityLonglineObsReference> getActivityLonglineObsList(String vesselActivityLonglineId) { + return ImmutableList.copyOf(allActivityLonglineObs.stream().filter(e -> vesselActivityLonglineId.equals(e.getVesselActivityLonglineId())).collect(Collectors.toList())); } public String getTripLonglineId() { return tripLonglineId; } - public boolean isEnabled() { - return !activityLonglineObsList.isEmpty(); - } } ===================================== dto/src/main/java/fr/ird/observe/dto/data/pairing/ActivityLonglinePairingResult.java → services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/ActivityLonglinePairingResult.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.dto.data.pairing; +package fr.ird.observe.services.service.data.longline.pairing; /*- * #%L - * ObServe :: Dto + * ObServe :: Services API * %% * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io * %% @@ -10,19 +10,18 @@ package fr.ird.observe.dto.data.pairing; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ - import com.google.common.collect.ImmutableList; import fr.ird.observe.dto.ObserveDto; ===================================== dto/src/main/java/fr/ird/observe/dto/data/pairing/ActivityLonglinePairingResultItem.java → services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/ActivityLonglinePairingResultItem.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.dto.data.pairing; +package fr.ird.observe.services.service.data.longline.pairing; /*- * #%L - * ObServe :: Dto + * ObServe :: Services API * %% * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io * %% @@ -10,21 +10,21 @@ package fr.ird.observe.dto.data.pairing; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ - import fr.ird.observe.dto.ObserveDto; import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; +import io.ultreia.java4all.lang.Numbers; import java.util.Objects; @@ -36,15 +36,15 @@ import java.util.Objects; public class ActivityLonglinePairingResultItem implements ObserveDto { private final ActivityLonglineObsReference observationActivity; - private final double computedTime; + private final long computedTime; private final double computedDistance; private final boolean timeValid; private final boolean distanceValid; - public ActivityLonglinePairingResultItem(ActivityLonglineObsReference observationActivity, double computedTime, double computedDistance, boolean timeValid, boolean distanceValid) { + public ActivityLonglinePairingResultItem(ActivityLonglineObsReference observationActivity, long computedTime, double computedDistance, boolean timeValid, boolean distanceValid) { this.observationActivity = observationActivity; this.computedTime = computedTime; - this.computedDistance = computedDistance; + this.computedDistance = Numbers.roundOneDigit((float) computedDistance); this.timeValid = timeValid; this.distanceValid = distanceValid; } @@ -53,7 +53,7 @@ public class ActivityLonglinePairingResultItem implements ObserveDto { return observationActivity; } - public double getComputedTime() { + public long getComputedTime() { return computedTime; } ===================================== services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/ActivityLonglinePairingResultItemDecorator.java ===================================== @@ -0,0 +1,65 @@ +package fr.ird.observe.services.service.data.longline.pairing; + +/*- + * #%L + * ObServe :: Services API + * %% + * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; +import fr.ird.observe.dto.decoration.DecoratorService; +import fr.ird.observe.dto.decoration.decorators.DataReferenceDecorator; +import fr.ird.observe.dto.decoration.decorators.ObserveDecorator; +import org.apache.commons.jxpath.JXPathContext; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * Created by tchemit on 16/10/2018. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public class ActivityLonglinePairingResultItemDecorator extends ObserveDecorator<ActivityLonglinePairingResultItem> { + + private final Locale locale; + private final DataReferenceDecorator<ActivityLonglineObsReference> activityDecorator; + + public ActivityLonglinePairingResultItemDecorator(DecoratorService decoratorService, Locale locale) { + super(ActivityLonglinePairingResultItem.class, "${observationActivity}$s##${computedTime}$s##${computedDistance}$s"); + this.locale = locale; + activityDecorator = decoratorService.getDataReferenceDecorator(ActivityLonglineObsReference.class); + } + + @SuppressWarnings("unchecked") + @Override + protected Comparable<Comparable<?>> getTokenValue(JXPathContext jxcontext, String token) { + Object value0 = jxcontext.getValue(token); + switch (token) { + case "computedTime": + return (Comparable) l(locale, "observe.common.pairingTime", value0); + case "computedDistance": + return (Comparable) l(locale, "observe.common.pairingDistance", value0); + case "observationActivity": + return (Comparable) activityDecorator.toString(value0); + } + return super.getTokenValue(jxcontext, token); + } +} ===================================== dto/src/main/java/fr/ird/observe/dto/data/pairing/TripLonglinePairingResult.java → services/src/main/java/fr/ird/observe/services/service/data/longline/pairing/TripLonglinePairingResult.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.dto.data.pairing; +package fr.ird.observe.services.service.data.longline.pairing; /*- * #%L - * ObServe :: Dto + * ObServe :: Services API * %% * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io * %% @@ -10,19 +10,18 @@ package fr.ird.observe.dto.data.pairing; * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ - import com.google.common.collect.ImmutableMap; import fr.ird.observe.dto.ObserveDto; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookReference; View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/f2f85a78cf07144c43ab2c3af1d5... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/f2f85a78cf07144c43ab2c3af1d5... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT