Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: d035bec2 by Tony Chemit at 2021-10-25T20:40:12+02:00 Contrôle total marché local - Closes #2059 - - - - - 140d751f by Tony Chemit at 2021-10-25T20:40:12+02:00 Unicité Trip PS & LL - Closes #2060 - - - - - 3273fd95 by Tony Chemit at 2021-10-25T20:40:12+02:00 Erreur sur ouverture des forms objet flottant en mode serveur, sur les logbooks et les observations - Closes #2055 - - - - - 1b95f2d2 by Tony Chemit at 2021-10-25T21:28:49+02:00 Reconnexion - Closes #2057 - - - - - 28 changed files: - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorBodyContent.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorHandler.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/actions/ReloadStorageAction.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationNode.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/common/TripUI.jaxx - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/DcpUIAdapter.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/FloatingObjectUICommon.jcss - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/presets/FloatingObjectPresetUI.jaxx - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/presets/FloatingObjectPresetUI.jcss - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/presets/FloatingObjectPresetUIHandler.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUI.jaxx - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUIHandler.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUI.jaxx - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUIHandler.java - models/definition/src/main/models/Observe/dto/attribute/boundNumber.properties - models/dto/java/src/main/java/fr/ird/observe/dto/referential/ps/common/ObjectMaterialHierarchyDto.java - models/persistence/java/src/main/java/fr/ird/observe/entities/data/ps/logbook/FloatingObjectSpi.java - server/core/src/main/filtered-resources/META-INF/mapping-api-v1.wm - services/api-test/src/main/java/fr/ird/observe/services/service/data/ps/common/TripServiceFixtures.java - services/api/src/main/java/fr/ird/observe/services/service/data/ps/common/TripService.java - services/local-impl/src/main/java/fr/ird/observe/services/local/service/data/ps/common/TripServiceLocalSupport.java - services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-create-error-validation.xml → services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-create-warning-validation.xml - services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-update-error-validation.xml - + services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-update-warning-validation.xml - services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-create-error-validation.xml - + services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-create-warning-validation.xml - services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-update-error-validation.xml - services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-update-warning-validation.xml Changes: ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorBodyContent.java ===================================== @@ -40,6 +40,7 @@ import fr.ird.observe.client.datasource.editor.api.menu.actions.CloseStorageActi import fr.ird.observe.client.datasource.editor.api.menu.actions.ImportAvdthFileAction; import fr.ird.observe.client.datasource.editor.api.menu.actions.ReloadStorageAction; import fr.ird.observe.client.datasource.editor.api.menu.actions.ShowDataSourcePresetsAction; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.main.ObserveMainUI; import fr.ird.observe.client.main.body.HideBodyContentNotAcceptedException; import fr.ird.observe.client.main.body.MainUIBodyContent; @@ -79,6 +80,7 @@ public class DataSourceEditorBodyContent extends MainUIBodyContent<DataSourceEdi private DataSourceEditorMenu editorMenu; private DataSourceEditorNavigationMenu navigationMenu; private ObserveSwingDataSource dataSource; + private NavigationNode previousNode; public DataSourceEditorBodyContent() { super(1, DataSourceEditor.class); @@ -86,6 +88,10 @@ public class DataSourceEditorBodyContent extends MainUIBodyContent<DataSourceEdi this.reload = e -> reload(); } + public void setPreviousNode(NavigationNode previousNode) { + this.previousNode = previousNode; + } + private Supplier<DataSourceEditor> createSupplier() { return () -> { ObserveMainUI mainUI = getClientUIContext().getMainUI(); @@ -193,7 +199,10 @@ public class DataSourceEditorBodyContent extends MainUIBodyContent<DataSourceEdi focusModel.addZone(new ContentZone(focusModel, dataSourceEditor)); navigationMenu.getUiModel().setConfig(dataSourceEditor.getNavigationUI().getTree().getModel().getConfig()); - dataSourceEditor.getHandler().loadNavigationUI(progressModel); + NavigationNode previousNode = this.previousNode; + // remove it right now + setPreviousNode(null); + dataSourceEditor.getHandler().loadNavigationUI(progressModel, previousNode); progressModel.increments(); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorHandler.java ===================================== @@ -30,6 +30,7 @@ import fr.ird.observe.client.datasource.editor.api.content.ContentUIManager; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTreeModel; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationUI; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.util.ProgressModel; import fr.ird.observe.client.util.init.UIInitHelper; import fr.ird.observe.client.util.session.ObserveSwingSessionHelper; @@ -153,8 +154,9 @@ public class DataSourceEditorHandler implements UIHandler<DataSourceEditor>, Wit * <b>Note:</b> cette méthode doit être appelée après tout rechargement de modèle de navigation. * * @param progressModel the progress model to interact with ui + * @param previousNode */ - public void loadNavigationUI(ProgressModel progressModel) { + public void loadNavigationUI(ProgressModel progressModel, NavigationNode previousNode) { boolean canReadData = getClientUIContext().getDataSourcesManager().getMainDataSource().canReadData(); NavigationUI navigationUI = ui.getNavigationUI(); NavigationTree tree = navigationUI.getTree(); @@ -163,10 +165,20 @@ public class DataSourceEditorHandler implements UIHandler<DataSourceEditor>, Wit treeModel.populate(null); progressModel.increments(); // select initial node - try { - tree.selectInitialNode(); - } catch (Exception e) { - log.error("Could not load initial node", e); + if (previousNode != null) { + try { + tree.reselectInitialNode(previousNode); + } catch (Exception e) { + log.error("Could not load previous node", e); + previousNode = null; + } + } + if (previousNode == null) { + try { + tree.selectInitialNode(); + } catch (Exception e) { + log.error("Could not load initial node", e); + } } progressModel.increments(); tree.setVisible(true); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/actions/ReloadStorageAction.java ===================================== @@ -23,8 +23,9 @@ package fr.ird.observe.client.datasource.editor.api.menu.actions; */ import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; +import fr.ird.observe.client.datasource.editor.api.DataSourceEditorBodyContent; import fr.ird.observe.client.datasource.editor.api.menu.DataSourceEditorMenu; -import fr.ird.observe.client.main.ObserveMainUI; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.util.ObserveSwingTechnicalException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -60,28 +61,24 @@ public class ReloadStorageAction extends DataSourceEditorMenuActionSupport imple log.info(String.format("Will close main data source: %s", dataSource)); - // Close - getDataSourceEditorBodyContent().doCloseStorage(); + DataSourceEditorBodyContent bodyContent = getDataSourceEditorBodyContent(); - ObserveMainUI mainUI = getClientUIContext().getMainUI(); + // keep selected node to select it on new navigation tree + NavigationNode selectedNode = bodyContent.get().getNavigationUI().getTree().getSelectedNode(); + bodyContent.setPreviousNode(selectedNode); - //FIXME:BodyContent reload previous selected node - getClientUIContext().getBusyModel().addTask("Reload storage"); - try { - - //FIXME:Datasource See why we do this? - dataSource.setCanMigrate(getClientConfig()); + // Close storage + bodyContent.doCloseStorage(); - log.info(String.format("Will load main data source: %s", dataSource)); + //FIXME:Datasource See why we do this? + dataSource.setCanMigrate(getClientConfig()); - try { - getDataSourceEditorBodyContent().loadStorage(mainUI, dataSource); - } catch (Exception e) { - throw new ObserveSwingTechnicalException(e); - } + log.info(String.format("Will load main data source: %s", dataSource)); - } finally { - getClientUIContext().getBusyModel().popTask(); + try { + bodyContent.loadStorage(getClientUIContext().getMainUI(), dataSource); + } catch (Exception e) { + throw new ObserveSwingTechnicalException(e); } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationNode.java ===================================== @@ -141,7 +141,7 @@ public class RootNavigationNode extends NavigationNode { return result; } - public <N extends NavigationNode> N findChildByType0(Class<N> childType, String id) { + public <N extends NavigationNode> N findChildByTypeWithNoCreate(Class<N> childType, String id) { return super.findChildByType(childType, id); } @@ -173,7 +173,10 @@ public class RootNavigationNode extends NavigationNode { NavigationNode next; NavigationNode oldNode = (NavigationNode) treeNode; if (oldNode.getLevel() == 0) { - next = ((RootNavigationNode) result).findChildByType0(oldNode.getClass(), oldNode.getInitializer().getSelectNodeId()); + next = result; + } else if (oldNode.getLevel() == 1) { + // use the method which will not create node + next = ((RootNavigationNode) result).findChildByTypeWithNoCreate(oldNode.getClass(), oldNode.getInitializer().getSelectNodeId()); } else if (oldNode.getScope().isSelectNode()) { next = result.findChildByType(oldNode.getClass(), oldNode.getInitializer().getSelectNodeId()); } else { ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/common/TripUI.jaxx ===================================== @@ -320,8 +320,8 @@ </cell> <cell anchor='west' weightx="0.5"> <JPanel layout="{new GridLayout()}"> - <NumberEditor id='landingTotalWeight' styleClass="float3 logbookEnabled"/> <NumberEditor id='localMarketTotalWeight' styleClass="float3 logbookEnabled"/> + <NumberEditor id='landingTotalWeight' styleClass="float3 logbookEnabled"/> </JPanel> </cell> </row> ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/DcpUIAdapter.java ===================================== @@ -39,7 +39,7 @@ import fr.ird.observe.dto.referential.ps.common.ObjectMaterialDto; import fr.ird.observe.dto.referential.ps.common.ObjectMaterialHierarchyDto; import fr.ird.observe.dto.referential.ps.common.ObjectOperationReference; import fr.ird.observe.dto.referential.ps.common.TransmittingBuoyTypeReference; -import fr.ird.observe.services.service.data.ps.common.TripService; +import fr.ird.observe.services.service.referential.ReferentialService; import fr.ird.observe.spi.decoration.DecoratorService; import io.ultreia.java4all.jaxx.widgets.combobox.BeanEnumEditor; import io.ultreia.java4all.jaxx.widgets.combobox.FilterableComboBox; @@ -60,6 +60,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.TreeMap; /** @@ -86,7 +87,7 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec JPanel getTransmittingBuoys(); - JLabel getNoBaliseEditor(); + JLabel getNoBuoyEditor(); FilterableComboBox<TransmittingBuoyTypeReference> getTransmittingBuoyType1(); @@ -121,9 +122,10 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec getTransmittingBuoy2()); } - default void onInit(DcpUIModelStates<?> states, TripService psCommonTripService, DecoratorService decoratorService) { + default void onInit(DcpUIModelStates<?> states, ReferentialService referentialService, DecoratorService decoratorService) { - ObjectMaterialHierarchyDto detailedForm = psCommonTripService.getObjectMaterialHierarchy(); + Set<ObjectMaterialDto> dtoList = referentialService.loadDtoList(ObjectMaterialDto.class); + ObjectMaterialHierarchyDto detailedForm = ObjectMaterialHierarchyDto.build(dtoList); Map<String, ObjectMaterialDto> allMap = new TreeMap<>(); detailedForm.getAllDto().forEach(s -> allMap.putIfAbsent(s.getId(), s)); @@ -141,13 +143,13 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec states.getBean().addPropertyChangeListener(FloatingObjectDto.PROPERTY_OBJECT_OPERATION, e -> states.updateMaterials(getTable().getTreeTableModel(), (ObjectOperationReference) e.getNewValue())); } - default void installExtraActions(DcpUIModelStates<?> states) { + default void installExtraActions() { AddFloatingObjectPreset.init((ContentUI) this, getAddPreset(), AddFloatingObjectPreset.class); CopyFloatingObjectPartToRight.init((ContentUI) this, getCopyFloatingObjectPartToRight(), CopyFloatingObjectPartToRight.class); CopyFloatingObjectPartToLeft.init((ContentUI) this, getCopyFloatingObjectPartToLeft(), CopyFloatingObjectPartToLeft.class); } - default void customizeUI(DcpUIModelStates<?> states) { + default void customizeUI() { ContentUIInitializer.setDecoratorIndex(getVessel1(), 1); ContentUIInitializer.setDecoratorIndex(getVessel2(), 1); ContentUIInitializer.setDecoratorIndex(getCountry1(), 1); @@ -160,7 +162,7 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec changeTypeOperation(states, typeOperation, false); } - default void stopEditUI(DcpUIModelStates<?> states) { + default void stopEditUI() { if (getMainTabbedPane().getSelectedIndex() == 1) { getTable().editingCanceled(null); } @@ -214,17 +216,12 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec getValidatorBuoy1().setBean(null); getValidatorBuoy2().setBean(null); } -// if (TypeTransmittingBuoyOperation.retrait == typeOperation) { -// addTransmittingBuoyCoordinate(); -// } else { -// removeTransmittingBuoyCoordinate(reset); -// } String[] codeOperations = typeOperation.getCodeOperation(); JComponent focusOwner = null; switch (typeOperation) { case pasDeBalise: - editorPanel.add(getNoBaliseEditor()); + editorPanel.add(getNoBuoyEditor()); focusOwner = getComment(); break; case recuperationEtRemplacement: ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/FloatingObjectUICommon.jcss ===================================== @@ -85,7 +85,7 @@ visible:{typeOperation.getSelectedValue() != null}; } -#noBaliseEditor { +#noBuoyEditor { horizontalAlignment:"center"; text:"observe.Common.noBuoy"; } ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/presets/FloatingObjectPresetUI.jaxx ===================================== @@ -155,7 +155,7 @@ <JPanel id="buoys" layout="{new GridLayout(1,0)}"> <FloatingObjectBuoyPresetUI id="buoy1" constructorParams="this"/> <FloatingObjectBuoyPresetUI id="buoy2" constructorParams="this"/> - <JLabel id='noBaliseEditor' styleClass="skipI18n"/> + <JLabel id='noBuoyEditor' styleClass="skipI18n"/> </JPanel> </cell> </row> ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/presets/FloatingObjectPresetUI.jcss ===================================== @@ -92,7 +92,7 @@ JLabel { border:{new TitledBorder(t("observe.Common.second.buoy"))}; } -#noBaliseEditor { +#noBuoyEditor { horizontalAlignment:"center"; text:"observe.Common.noBuoy"; } ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/presets/FloatingObjectPresetUIHandler.java ===================================== @@ -64,7 +64,7 @@ public class FloatingObjectPresetUIHandler implements UIHandler<FloatingObjectPr initializer.disabledIfNull(model, bean, "keepSupplyName"); ui.getBuoys().removeAll(); SwingValidatorUtil.setValidatorBean(ui, bean); - ui.getBuoys().add(ui.getNoBaliseEditor()); + ui.getBuoys().add(ui.getNoBuoyEditor()); Optional.ofNullable(floatingObjectPreset.getBuoy1()).ifPresent(t -> prepareBuoy(t, ui, buoy1)); Optional.ofNullable(floatingObjectPreset.getBuoy2()).ifPresent(t -> prepareBuoy(t, ui, buoy2)); @@ -115,7 +115,7 @@ public class FloatingObjectPresetUIHandler implements UIHandler<FloatingObjectPr FloatingObjectBuoyPreset bean = buoyUI.getBean(); FloatingObjectBuoyPresetUIModel model = buoyUI.getModel(); preset.copy(bean); - ui.getBuoys().remove(ui.getNoBaliseEditor()); + ui.getBuoys().remove(ui.getNoBuoyEditor()); ui.getBuoys().add(buoyUI); SwingValidatorUtil.setValidatorBean(buoyUI, model.getBean()); ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUI.jaxx ===================================== @@ -323,7 +323,7 @@ </row> </Table> </JXTitledPanel> - <JLabel id='noBaliseEditor' styleClass="skipI18n"/> + <JLabel id='noBuoyEditor' styleClass="skipI18n"/> </JPanel> </JPanel> </tab> ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUIHandler.java ===================================== @@ -43,19 +43,19 @@ public class FloatingObjectUIHandler extends GeneratedFloatingObjectUIHandler { coordinate1Label = ui.transmittingBuoy1Editor.getComponent(10); coordinate1 = ui.transmittingBuoy1Editor.getComponent(11); comment1 = ui.transmittingBuoy1Editor.getComponent(12); - ui.onInit(ui.getModel().getStates(), getPsCommonTripService(), getDecoratorService()); + ui.onInit(ui.getModel().getStates(), getReferentialService(), getDecoratorService()); } @Override protected void customizeUI() { super.customizeUI(); - ui.customizeUI(ui.getModel().getStates()); + ui.customizeUI(); } @Override protected void installExtraActions() { super.installExtraActions(); - ui.installExtraActions(ui.getModel().getStates()); + ui.installExtraActions(); } //FIXME:Focus ui.getModel().getStates().isCreatingMode() ? getUi().getObjectOperation() : getUi().getSupportVesselName() @@ -72,7 +72,7 @@ public class FloatingObjectUIHandler extends GeneratedFloatingObjectUIHandler { @Override public void stopEditUI() { - ui.stopEditUI(ui.getModel().getStates()); + ui.stopEditUI(); super.stopEditUI(); } ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUI.jaxx ===================================== @@ -298,7 +298,7 @@ </row> </Table> </JXTitledPanel> - <JLabel id='noBaliseEditor' styleClass="skipI18n"/> + <JLabel id='noBuoyEditor' styleClass="skipI18n"/> </JPanel> </JPanel> </tab> ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUIHandler.java ===================================== @@ -32,19 +32,19 @@ public class FloatingObjectUIHandler extends GeneratedFloatingObjectUIHandler { @Override public void onInit(FloatingObjectUI ui) { super.onInit(ui); - ui.onInit(ui.getModel().getStates(), getPsCommonTripService(), getDecoratorService()); + ui.onInit(ui.getModel().getStates(), getReferentialService(), getDecoratorService()); } @Override protected void customizeUI() { super.customizeUI(); - ui.customizeUI(ui.getModel().getStates()); + ui.customizeUI(); } @Override protected void installExtraActions() { super.installExtraActions(); - ui.installExtraActions(ui.getModel().getStates()); + ui.installExtraActions(); } //FIXME:Focus ui.getModel().getStates().isCreatingMode() ? getUi().getObjectOperation() : getUi().getSupportVesselName() @@ -61,7 +61,7 @@ public class FloatingObjectUIHandler extends GeneratedFloatingObjectUIHandler { @Override public void stopEditUI() { - ui.stopEditUI(ui.getModel().getStates()); + ui.stopEditUI(); super.stopEditUI(); } ===================================== models/definition/src/main/models/Observe/dto/attribute/boundNumber.properties ===================================== @@ -69,7 +69,7 @@ data.ll.observation.SizeMeasure.attribute.size=0.0:1000.0 data.ll.observation.WeightMeasure.attribute.weight=0.0:1000.0 data.ps.common.Trip.attribute.fishingTime=0:1300:!logbookEnabled data.ps.common.Trip.attribute.landingTotalWeight=0.1:3000.0:!targetWellsSamplingEnabled -data.ps.common.Trip.attribute.localMarketTotalWeight=0.1:3000.0:!localMarketWellsSamplingEnabled && !localMarketSurveySamplingEnabled +data.ps.common.Trip.attribute.localMarketTotalWeight=0.0:1500.0:!localMarketWellsSamplingEnabled && !localMarketSurveySamplingEnabled data.ps.common.Trip.attribute.timeAtSea=10:2400:!logbookEnabled data.ps.landing.Landing.attribute.weight=0.0:600.0 data.ps.localmarket.Batch.attribute.weight=0.0:5.0:!countOrWeightValid ===================================== models/dto/java/src/main/java/fr/ird/observe/dto/referential/ps/common/ObjectMaterialHierarchyDto.java ===================================== @@ -22,13 +22,22 @@ package fr.ird.observe.dto.referential.ps.common; * #L% */ +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import fr.ird.observe.dto.referential.FormulaHelper; import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; /** * Created by tchemit on 29/05/17. @@ -40,6 +49,62 @@ public class ObjectMaterialHierarchyDto extends ObjectMaterialDto { private final List<ObjectMaterialHierarchyDto> children; + public static class Builder { + + private final List<ObjectMaterialDto> dtoList; + + public Builder(Collection<ObjectMaterialDto> dtoList) { + this.dtoList = new ArrayList<>(dtoList); + + } + + public ObjectMaterialHierarchyDto build() { + dtoList.sort(Comparator.comparing(ObjectMaterialDto::getCode)); + return getObjectMaterialHierarchyList(dtoList).get(0); + } + + + public List<ObjectMaterialHierarchyDto> getObjectMaterialHierarchyList(List<ObjectMaterialDto> objectMaterials) { + Multimap<String, ObjectMaterialDto> childrenByParent = ArrayListMultimap.create(); + objectMaterials.forEach(o -> childrenByParent.put(Optional.ofNullable(o.getParent()).map(ObjectMaterialReference::getId).orElse("Yo"), o)); + Collection<ObjectMaterialDto> topLevelMaterials = childrenByParent.get("Yo"); + List<ObjectMaterialHierarchyDto> result = new LinkedList<>(); + Set<String> idsDone = new TreeSet<>(); + for (ObjectMaterialDto topLevelMaterial : topLevelMaterials) { + ObjectMaterialHierarchyDto hierarchyDto = fillHierarchyDto(childrenByParent, topLevelMaterial, idsDone); + result.add(hierarchyDto); + } + result.sort(Comparator.comparing(ObjectMaterialDto::getCode)); + return result; + } + + private ObjectMaterialHierarchyDto fillHierarchyDto(Multimap<String, ObjectMaterialDto> childrenByParent, ObjectMaterialDto topLevelMaterial, Set<String> idsDone) { + Collection<ObjectMaterialDto> childrenEntities = childrenByParent.get(topLevelMaterial.getId()); + String code = topLevelMaterial.getCode(); + int level = code == null || code.isEmpty() ? 0 : code.split("-").length; + Map<Integer, ObjectMaterialDto> orderMap = new TreeMap<>(); + for (ObjectMaterialDto child : childrenEntities) { + String code1 = child.getCode().split("-")[level]; + orderMap.put(Integer.valueOf(code1), child); + } + List<ObjectMaterialDto> orderedChildren = new LinkedList<>(); + orderMap.forEach((k, v) -> orderedChildren.add(v)); + ObjectMaterialHierarchyDto hierarchyDto = new ObjectMaterialHierarchyDto(topLevelMaterial); + boolean add = idsDone.add(hierarchyDto.getId()); + if (add) { + for (ObjectMaterialDto child : orderedChildren) { + ObjectMaterialHierarchyDto hierarchyDto1 = fillHierarchyDto(childrenByParent, child, idsDone); + hierarchyDto.addChild(hierarchyDto1); + } + } + return hierarchyDto; + } + } + + public static ObjectMaterialHierarchyDto build(Collection<ObjectMaterialDto> dtoList) { + return new Builder(dtoList).build(); + } + public ObjectMaterialHierarchyDto(ObjectMaterialDto root) { root.copy(this); this.children = new LinkedList<>(); ===================================== models/persistence/java/src/main/java/fr/ird/observe/entities/data/ps/logbook/FloatingObjectSpi.java ===================================== @@ -22,16 +22,12 @@ package fr.ird.observe.entities.data.ps.logbook; * #L% */ -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; import fr.ird.observe.dto.ProtectedIdsPs; import fr.ird.observe.dto.data.ps.dcp.FloatingObjectBuoyPreset; import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPreset; import fr.ird.observe.dto.data.ps.logbook.FloatingObjectDto; import fr.ird.observe.dto.form.Form; import fr.ird.observe.dto.referential.ReferentialLocale; -import fr.ird.observe.dto.referential.ps.common.ObjectMaterialDto; -import fr.ird.observe.dto.referential.ps.common.ObjectMaterialHierarchyDto; import fr.ird.observe.entities.ObserveTopiaPersistenceContextSupport; import fr.ird.observe.entities.referential.common.Country; import fr.ird.observe.entities.referential.common.Vessel; @@ -44,19 +40,13 @@ import fr.ird.observe.entities.referential.ps.common.TransmittingBuoyType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; import java.util.function.Supplier; /** @@ -68,12 +58,6 @@ import java.util.function.Supplier; public class FloatingObjectSpi extends GeneratedFloatingObjectSpi { private static final Logger log = LogManager.getLogger(FloatingObjectSpi.class); - public ObjectMaterialHierarchyDto getObjectMaterialHierarchy(ObserveTopiaPersistenceContextSupport persistenceContext, ReferentialLocale referentialLocale) { - List<ObjectMaterial> objectMaterials = ObjectMaterial.getDao(persistenceContext).findAll(); - objectMaterials.sort(Comparator.comparing(ObjectMaterial::getCode)); - return getObjectMaterialHierarchyList(objectMaterials, referentialLocale).get(0); - } - public Form<FloatingObjectDto> preCreate(ObserveTopiaPersistenceContextSupport persistenceContext, Locale applicationLocale, ReferentialLocale referentialLocale, Supplier<Date> nowSupplier, FloatingObjectPreset floatingObjectPreset) { Date now = nowSupplier.get(); FloatingObject entity = newEntity(now); @@ -122,43 +106,6 @@ public class FloatingObjectSpi extends GeneratedFloatingObjectSpi { super.onSave(persistenceContext, applicationLocale, referentialLocale, nowSupplier, parent, entity, dto); } - public List<ObjectMaterialHierarchyDto> getObjectMaterialHierarchyList(List<ObjectMaterial> objectMaterials, ReferentialLocale referentialLocale) { - Multimap<String, ObjectMaterial> childrenByParent = ArrayListMultimap.create(); - objectMaterials.forEach(o -> childrenByParent.put(Optional.ofNullable(o.getParent()).map(ObjectMaterial::getTopiaId).orElse("Yo"), o)); - Collection<ObjectMaterial> topLevelMaterials = childrenByParent.get("Yo"); - List<ObjectMaterialHierarchyDto> result = new LinkedList<>(); - Set<String> idsDone = new TreeSet<>(); - for (ObjectMaterial topLevelMaterial : topLevelMaterials) { - ObjectMaterialHierarchyDto hierarchyDto = fillHierarchyDto(childrenByParent, referentialLocale, ObjectMaterial.toDto(referentialLocale, topLevelMaterial), idsDone); - result.add(hierarchyDto); - } - result.sort(Comparator.comparing(ObjectMaterialDto::getCode)); - return result; - } - - private ObjectMaterialHierarchyDto fillHierarchyDto(Multimap<String, ObjectMaterial> childrenByParent, ReferentialLocale referentialLocale, ObjectMaterialDto topLevelMaterial, Set<String> idsDone) { - Collection<ObjectMaterial> childrenEntities = childrenByParent.get(topLevelMaterial.getId()); - List<ObjectMaterialDto> children = ObjectMaterial.toDtoList(referentialLocale, childrenEntities.stream()); - String code = topLevelMaterial.getCode(); - int level = code == null|| code.isEmpty() ? 0 : code.split("-").length; - Map<Integer, ObjectMaterialDto> orderMap = new TreeMap<>(); - for (ObjectMaterialDto child : children) { - String code1 = child.getCode().split("-")[level]; - orderMap.put(Integer.valueOf(code1), child); - } - List<ObjectMaterialDto> orderedChildren = new LinkedList<>(); - orderMap.forEach((k, v) -> orderedChildren.add(v)); - ObjectMaterialHierarchyDto hierarchyDto = new ObjectMaterialHierarchyDto(topLevelMaterial); - boolean add = idsDone.add(hierarchyDto.getId()); - if (add) { - for (ObjectMaterialDto child : orderedChildren) { - ObjectMaterialHierarchyDto hierarchyDto1 = fillHierarchyDto(childrenByParent, referentialLocale, child, idsDone); - hierarchyDto.addChild(hierarchyDto1); - } - } - return hierarchyDto; - } - private TransmittingBuoy preCreate(ObserveTopiaPersistenceContextSupport topiaPersistenceContext, Locale applicationLocale, FloatingObjectBuoyPreset floatingObjectBuoyPreset, Date now) { TransmittingBuoy transmittingBuoy = TransmittingBuoy.newEntity(now); transmittingBuoy.setCode(floatingObjectBuoyPreset.getCode()); ===================================== server/core/src/main/filtered-resources/META-INF/mapping-api-v1.wm ===================================== @@ -105,7 +105,6 @@ GET /data/ps/common/TripService/getAllTripIds data GET /data/ps/common/TripService/getLogbookSetActivities data.ps.common.TripServiceRestApi.getLogbookSetActivities GET /data/ps/common/TripService/getLogbookWellPlanActivities data.ps.common.TripServiceRestApi.getLogbookWellPlanActivities GET /data/ps/common/TripService/getMatchingTripsVesselWithinDateRange data.ps.common.TripServiceRestApi.getMatchingTripsVesselWithinDateRange -GET /data/ps/common/TripService/getObjectMaterialHierarchy data.ps.common.TripServiceRestApi.getObjectMaterialHierarchy GET /data/ps/common/TripService/getSpeciesByListAndTrip data.ps.common.TripServiceRestApi.getSpeciesByListAndTrip GET /data/ps/common/TripService/getTripMap data.ps.common.TripServiceRestApi.getTripMap GET /data/ps/common/TripService/isActivityEndOfSearchFound data.ps.common.TripServiceRestApi.isActivityEndOfSearchFound ===================================== services/api-test/src/main/java/fr/ird/observe/services/service/data/ps/common/TripServiceFixtures.java ===================================== @@ -34,7 +34,6 @@ import fr.ird.observe.dto.reference.DataDtoReferenceSet; import fr.ird.observe.dto.reference.ReferentialDtoReferenceSet; import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.dto.referential.common.SpeciesReference; -import fr.ird.observe.dto.referential.ps.common.ObjectMaterialHierarchyDto; import fr.ird.observe.services.ObserveServicesProvider; import fr.ird.observe.services.service.data.EditableServiceFixtures; import fr.ird.observe.services.service.data.OpenableServiceFixtures; @@ -126,12 +125,6 @@ public class TripServiceFixtures extends GeneratedTripServiceFixtures { Assert.assertTrue(activityEndOfSearchFound); } - @Override - public void getObjectMaterialHierarchy(ObserveServicesProvider servicesProvider, TripService service) { - ObjectMaterialHierarchyDto form = service.getObjectMaterialHierarchy(); - Assert.assertNotNull(form); - } - @Override public void preCreateLogbookFloatingObject(ObserveServicesProvider servicesProvider, TripService service) { String activityId = getProperty("preCreateLogbookFloatingObject.activityId"); ===================================== services/api/src/main/java/fr/ird/observe/services/service/data/ps/common/TripService.java ===================================== @@ -26,7 +26,6 @@ import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPreset; import fr.ird.observe.dto.data.ps.logbook.ActivityReference; import fr.ird.observe.dto.form.Form; import fr.ird.observe.dto.reference.DataDtoReferenceSet; -import fr.ird.observe.dto.referential.ps.common.ObjectMaterialHierarchyDto; import fr.ird.observe.security.Permission; import fr.ird.observe.services.service.data.TripAwareService; import fr.ird.observe.services.spi.MethodCredential; @@ -65,10 +64,6 @@ public interface TripService extends TripAwareService { @MethodCredential(Permission.READ_DATA) boolean isActivityEndOfSearchFound(String routeId); - @Get - @MethodCredential(Permission.READ_REFERENTIAL) - ObjectMaterialHierarchyDto getObjectMaterialHierarchy(); - @Get @MethodCredential(Permission.WRITE_DATA) Form<fr.ird.observe.dto.data.ps.observation.FloatingObjectDto> preCreateObservationFloatingObject(String activityId, @Nullable FloatingObjectPreset floatingObjectPreset); ===================================== services/local-impl/src/main/java/fr/ird/observe/services/local/service/data/ps/common/TripServiceLocalSupport.java ===================================== @@ -29,13 +29,11 @@ import fr.ird.observe.dto.data.ps.logbook.ActivityReference; import fr.ird.observe.dto.form.Form; import fr.ird.observe.dto.reference.DataDtoReferenceSet; import fr.ird.observe.dto.referential.ReferentialLocale; -import fr.ird.observe.dto.referential.ps.common.ObjectMaterialHierarchyDto; import fr.ird.observe.entities.data.ps.common.Program; import fr.ird.observe.entities.data.ps.common.Trip; import fr.ird.observe.entities.data.ps.common.TripSpi; import fr.ird.observe.entities.data.ps.common.TripTopiaDao; import fr.ird.observe.entities.data.ps.logbook.Activity; -import fr.ird.observe.entities.data.ps.logbook.FloatingObject; import fr.ird.observe.entities.data.ps.observation.Route; import fr.ird.observe.services.service.data.ps.common.TripService; @@ -73,11 +71,6 @@ public abstract class TripServiceLocalSupport extends fr.ird.observe.services.lo return route.getActivity().stream().anyMatch(fr.ird.observe.entities.data.ps.observation.Activity::isActivityEndOfSearching); } - @Override - public ObjectMaterialHierarchyDto getObjectMaterialHierarchy() { - return FloatingObject.SPI.getObjectMaterialHierarchy(getTopiaPersistenceContext(), getReferentialLocale()); - } - @Override public Form<fr.ird.observe.dto.data.ps.observation.FloatingObjectDto> preCreateObservationFloatingObject(String activityId, FloatingObjectPreset floatingObjectPreset) { return fr.ird.observe.entities.data.ps.observation.FloatingObject.SPI.preCreate(getTopiaPersistenceContext(), getApplicationLocale(), getReferentialLocale(), this::now, floatingObjectPreset); ===================================== services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-create-error-validation.xml → services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-create-warning-validation.xml ===================================== ===================================== services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-update-error-validation.xml ===================================== @@ -23,13 +23,6 @@ "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> - <field name="vessel"> - <!-- check vessel availability on trip --> - <field-validator type="tripVessel" short-circuit="true"> - <param name="serviceName">servicesProvider.llCommonTripService</param> - <message/> - </field-validator> - </field> <field name="startDate"> <!-- startDate < any activity date --> <field-validator type="collectionFieldExpression"> ===================================== services/validation/src/main/validation/fr/ird/observe/dto/data/ll/common/TripDto-update-warning-validation.xml ===================================== @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe Services :: Validation + %% + Copyright (C) 2008 - 2021 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% + --> + +<!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="vessel"> + <!-- check vessel availability on trip --> + <field-validator type="tripVessel" short-circuit="true"> + <param name="serviceName">servicesProvider.psCommonTripService</param> + <message/> + </field-validator> + </field> +</validators> ===================================== services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-create-error-validation.xml ===================================== @@ -23,13 +23,6 @@ "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> - <field name="vessel"> - <!-- check vessel availability on trip --> - <field-validator type="tripVessel" short-circuit="true"> - <param name="serviceName">servicesProvider.psCommonTripService</param> - <message/> - </field-validator> - </field> <field name="formsUrl"> <!-- check url syntax except if !observationsAvailability --> <field-validator type="url" short-circuit="true"> ===================================== services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-create-warning-validation.xml ===================================== @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe Services :: Validation + %% + Copyright (C) 2008 - 2021 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% + --> + +<!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="vessel"> + <!-- check vessel availability on trip --> + <field-validator type="tripVessel" short-circuit="true"> + <param name="serviceName">servicesProvider.psCommonTripService</param> + <message/> + </field-validator> + </field> +</validators> ===================================== services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-update-error-validation.xml ===================================== @@ -23,13 +23,6 @@ "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> - <field name="vessel"> - <!-- check vessel availability on trip --> - <field-validator type="tripVessel" short-circuit="true"> - <param name="serviceName">servicesProvider.psCommonTripService</param> - <message/> - </field-validator> - </field> <field name="startDate"> <!-- routes date check --> <field-validator type="collectionFieldExpression"> ===================================== services/validation/src/main/validation/fr/ird/observe/dto/data/ps/common/TripDto-update-warning-validation.xml ===================================== @@ -23,6 +23,13 @@ "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> + <field name="vessel"> + <!-- check vessel availability on trip --> + <field-validator type="tripVessel" short-circuit="true"> + <param name="serviceName">servicesProvider.psCommonTripService</param> + <message/> + </field-validator> + </field> <field name="routeObs"> <!-- check routes loch --> <field-validator type="collectionFieldExpression"> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/e828c2dbe1aecb14f3df14d55... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/e828c2dbe1aecb14f3df14d55... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)