Tutti-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
April 2013
- 5 participants
- 210 discussions
25 Apr '13
Author: kmorin
Date: 2013-04-25 19:22:52 +0200 (Thu, 25 Apr 2013)
New Revision: 875
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/875
Log:
refs #2079 [CONTROLE] - Contr?\195?\180le / Validation apr?\195?\168s la saisie
Modified:
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-edit-warning-validation.xml
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-error-validation.xml
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-warning-validation.xml
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java 2013-04-25 17:22:52 UTC (rev 875)
@@ -44,11 +44,13 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.beans.AbstractBean;
+import org.nuiton.util.DateUtil;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Closeable;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -765,6 +767,19 @@
return existingFishingOperations;
}
+ public boolean isDateInCruise(Date date) {
+ return DateUtil.between(date, getCruise().getBeginDate(), getCruise().getEndDate());
+ }
+
+ public boolean isValidDuration(Date gearShootingStartDate, Date gearShootingEndDate) {
+ boolean result = gearShootingStartDate == null || gearShootingEndDate == null;
+ if (!result) {
+ int minutes = DateUtil.getDifferenceInMinutes(gearShootingStartDate, gearShootingEndDate);
+ result |= minutes <= 45 && minutes >= 20;
+ }
+ return result;
+ }
+
public void reset() {
existingPrograms = null;
existingProtocols = null;
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java 2013-04-25 17:22:52 UTC (rev 875)
@@ -79,6 +79,7 @@
TuttiDataContext dataContext = context.getDataContext();
List<FishingOperation> operations = persistenceService.getAllFishingOperation(dataContext.getCruiseId());
for (FishingOperation operation : operations) {
+ operation = persistenceService.getFishingOperation(operation.getId());
NuitonValidatorResult validator = validationService.validateFishingOperation(operation, ValidationService.VALIDATION_CONTEXT_VALIDATE);
checkOperation(operation, validator);
@@ -89,6 +90,16 @@
}
/**
+ * Validates the operation of the currently selected cruise whose id is the given id.
+ * @return the validation results
+ */
+ public NuitonValidatorResult validateCruiseOperation(FishingOperation operation) {
+ NuitonValidatorResult validator = validationService.validateFishingOperation(operation, ValidationService.VALIDATION_CONTEXT_VALIDATE);
+ checkOperation(operation, validator);
+ return validator;
+ }
+
+ /**
* Adds additional messages to the validation results
* @param fishingOperation the operation to validate
* @param validator the validatpr containing the messages.
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-edit-warning-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-edit-warning-validation.xml 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-edit-warning-validation.xml 2013-04-25 17:22:52 UTC (rev 875)
@@ -67,8 +67,8 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null
- || isValidDuration()
+ <![CDATA[
+ isValidDuration(gearShootingStartDate, gearShootingEndDate)
]]>
</param>
<message>tutti.validator.error.fishingOperation.dates.wrongTime</message>
@@ -91,8 +91,8 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null
- || isValidDuration()
+ <![CDATA[
+ isValidDuration(gearShootingStartDate, gearShootingEndDate)
]]>
</param>
<message>tutti.validator.error.fishingOperation.dates.wrongTime</message>
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-error-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-error-validation.xml 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-error-validation.xml 2013-04-25 17:22:52 UTC (rev 875)
@@ -99,13 +99,7 @@
<field name="gearShootingStartLatitude">
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[
- !"DD".equals(coordinateEditorType.toString()) || gearShootingStartLatitude != null
- ]]>
- </param>
-
+ <field-validator type="required" short-circuit="true">
<message>tutti.validator.error.latitude.start.required</message>
</field-validator>
@@ -113,13 +107,9 @@
<param name="doubleParams">min:90.0|max:90.0</param>
<param name="expression">
<![CDATA[
- !"DD".equals(coordinateEditorType.toString()) ||
- ( gearShootingStartLatitude != null
- && -doubles.min <= gearShootingStartLatitude
- && gearShootingStartLatitude <= doubles.max )
+ -doubles.min <= gearShootingStartLatitude && gearShootingStartLatitude <= doubles.max
]]>
</param>
-
<message>tutti.validator.warning.latitude.outOfBounds</message>
</field-validator>
@@ -130,13 +120,7 @@
<field name="gearShootingStartLongitude">
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[
- !"DD".equals(coordinateEditorType.toString()) || gearShootingStartLongitude != null
- ]]>
- </param>
-
+ <field-validator type="required" short-circuit="true">
<message>tutti.validator.error.longitude.start.required</message>
</field-validator>
@@ -144,10 +128,7 @@
<param name="doubleParams">min:180.0|max:180.0</param>
<param name="expression">
<![CDATA[
- !"DD".equals(coordinateEditorType.toString()) ||
- ( gearShootingStartLongitude != null
- && -doubles.min <= gearShootingStartLongitude
- && gearShootingStartLongitude <= doubles.max )
+ -doubles.min <= gearShootingStartLongitude && gearShootingStartLongitude <= doubles.max
]]>
</param>
@@ -161,13 +142,7 @@
<field name="gearShootingEndLatitude">
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[
- !"DD".equals(coordinateEditorType.toString()) || gearShootingEndLatitude != null
- ]]>
- </param>
-
+ <field-validator type="required" short-circuit="true">
<message>tutti.validator.error.latitude.end.required</message>
</field-validator>
@@ -175,10 +150,7 @@
<param name="doubleParams">min:90.0|max:90.0</param>
<param name="expression">
<![CDATA[
- !"DD".equals(coordinateEditorType.toString()) ||
- ( gearShootingEndLatitude != null
- && -doubles.min <= gearShootingEndLatitude
- && gearShootingEndLatitude <= doubles.max )
+ -doubles.min <= gearShootingEndLatitude && gearShootingEndLatitude <= doubles.max
]]>
</param>
@@ -192,13 +164,7 @@
<field name="gearShootingEndLongitude">
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[
- !"DD".equals(coordinateEditorType.toString()) || gearShootingEndLongitude != null
- ]]>
- </param>
-
+ <field-validator type="required" short-circuit="true">
<message>tutti.validator.error.longitude.end.required</message>
</field-validator>
@@ -206,10 +172,7 @@
<param name="doubleParams">min:180.0|max:180.0</param>
<param name="expression">
<![CDATA[
- !"DD".equals(coordinateEditorType.toString()) ||
- ( gearShootingEndLongitude != null
- && -doubles.min <= gearShootingEndLongitude
- && gearShootingEndLongitude <= doubles.max )
+ -doubles.min <= gearShootingEndLongitude && gearShootingEndLongitude <= doubles.max
]]>
</param>
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-warning-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-warning-validation.xml 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/FishingOperation-validate-warning-validation.xml 2013-04-25 17:22:52 UTC (rev 875)
@@ -33,9 +33,8 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null
- || org.nuiton.util.DateUtil.getDifferenceInMinutes(gearShootingStartDate, gearShootingEndDate) <= 45
- && org.nuiton.util.DateUtil.getDifferenceInMinutes(gearShootingStartDate, gearShootingEndDate) >= 20 )
+ <![CDATA[
+ isValidDuration(gearShootingStartDate, gearShootingEndDate)
]]>
</param>
<message>tutti.validator.error.fishingOperation.dates.wrongTime</message>
@@ -47,9 +46,8 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null
- || org.nuiton.util.DateUtil.getDifferenceInMinutes(gearShootingStartDate, gearShootingEndDate) <= 45
- && org.nuiton.util.DateUtil.getDifferenceInMinutes(gearShootingStartDate, gearShootingEndDate) >= 20 )
+ <![CDATA[
+ isValidDuration(gearShootingStartDate, gearShootingEndDate)
]]>
</param>
<message>tutti.validator.error.fishingOperation.dates.wrongTime</message>
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java 2013-04-25 17:22:52 UTC (rev 875)
@@ -53,7 +53,7 @@
protected FishingOperation fishingOperation;
public EditCruiseFishingOperationAction(ValidateCruiseUIHandler handler) {
- super(handler, true);
+ super(handler, false);
setActionDescription(_("tutti.editFishingOperation.action.editFishingOperation.tip"));
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java 2013-04-25 17:22:52 UTC (rev 875)
@@ -24,19 +24,31 @@
* #L%
*/
+import com.google.common.base.Preconditions;
import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
import fr.ifremer.tutti.service.PersistenceService;
import fr.ifremer.tutti.service.ValidationService;
+import fr.ifremer.tutti.service.catches.ValidateCruiseOperationsService;
+import fr.ifremer.tutti.ui.swing.TuttiUIContext;
+import fr.ifremer.tutti.ui.swing.content.MainUI;
+import fr.ifremer.tutti.ui.swing.content.MainUIHandler;
+import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel;
import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI;
import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler;
import fr.ifremer.tutti.ui.swing.util.CloseableUI;
+import fr.ifremer.tutti.ui.swing.util.RemoveablePropertyChangeListener;
import fr.ifremer.tutti.ui.swing.util.TuttiUI;
import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction;
import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper;
+import fr.ifremer.tutti.ui.swing.util.action.TuttiUIAction;
+import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
import jaxx.runtime.SwingUtil;
import jaxx.runtime.validator.swing.SwingValidator;
+import jaxx.runtime.validator.swing.SwingValidatorMessage;
+import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.validator.NuitonValidatorResult;
@@ -45,16 +57,19 @@
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTree;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeModel;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.tree.*;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
import java.util.Map;
import static org.nuiton.i18n.I18n._;
+import static org.nuiton.i18n.I18n.n_;
/**
* @author kmorin <kmorin(a)codelutin.com>
@@ -64,29 +79,71 @@
private final static Log log = LogFactory.getLog(ValidateCruiseUIHandler.class);
- /** Persistence service. */
- private final PersistenceService persistenceService;
-
/** Validation service. */
- private final ValidationService validationService;
+ private final ValidateCruiseOperationsService validationService;
protected EditCruiseFishingOperationAction editFishingOperationAction;
- protected Map<FishingOperation, NuitonValidatorResult> validator;
+ protected final PropertyChangeListener editFishingOperationModelListener = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ List<String> propertiesToIgnore = Lists.newArrayList(
+ EditFishingOperationUIModel.PROPERTY_MODIFY,
+ EditFishingOperationUIModel.PROPERTY_VALID,
+ EditFishingOperationUIModel.PROPERTY_PERSISTED
+ );
+ EditFishingOperationUIModel model = (EditFishingOperationUIModel) evt.getSource();
+
+ if (!getUI().getOperationPanel().getModel().isEditionAdjusting()
+ && model.getFishingOperation() != null
+ &&!propertiesToIgnore.contains(evt.getPropertyName())) {
+
+ if (model.getCoordinateEditorType() != CoordinateEditorType.DD) {
+ model.convertGearShootingCoordinatesDMSToDD();
+ }
+
+ FishingOperation operation = model.toBean();
+ NuitonValidatorResult validationResult = validationService.validateCruiseOperation(operation);
+
+ updateCurrentOperatonNode(validationResult);
+
+ }
+ }
+ };
+
public ValidateCruiseUIHandler(TuttiUI parentUi, ValidateCruiseUI ui) {
super(parentUi.getHandler().getContext(), ui);
- persistenceService = context.getPersistenceService();
- validationService = context.getValidationService();
+ validationService = context.getValidateCruiseOperationsService();
}
@Override
public void beforeInitUI() {
- validator = context.getValidateCruiseOperationsService().validateCruiseOperations();
ValidateCruiseUIModel model = new ValidateCruiseUIModel();
+
+ model.setValidator(validationService.validateCruiseOperations());
+
+ model.addPropertyChangeListener(ValidateCruiseUIModel.PROPERTY_SELECTED_FISHING_OPERATION,
+ new RemoveablePropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ FishingOperation operation = (FishingOperation) evt.getNewValue();
+
+ ui.getOperationPanel().getFishingOperationTabContent().getModel().
+ removePropertyChangeListener(editFishingOperationModelListener);
+
+ editFishingOperationAction.setFishingOperation(null);
+ AbstractTuttiAction.runAction(editFishingOperationAction);
+
+ if (operation != null) {
+ editFishingOperationAction.setFishingOperation(operation);
+ TuttiActionHelper.runAction(editFishingOperationAction);
+ }
+ }
+ });
+
ui.setContextValue(model);
-
}
@Override
@@ -98,15 +155,11 @@
ui.getOperationPanel().getModel().setSelectedFishingOperation(null);
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
+ Map<FishingOperation, NuitonValidatorResult> validator = getModel().getValidator();
+
for (FishingOperation operation : validator.keySet()) {
- operation = persistenceService.getFishingOperation(operation.getId());
NuitonValidatorResult result = validator.get(operation);
-
- Multimap<NuitonValidatorScope, String> messages = LinkedListMultimap.create();
- messages.putAll(NuitonValidatorScope.ERROR, result.getMessagesForScope(NuitonValidatorScope.ERROR));
- messages.putAll(NuitonValidatorScope.WARNING, result.getMessagesForScope(NuitonValidatorScope.WARNING));
-
- OperationTreeNode node = new OperationTreeNode(operation, messages);
+ OperationTreeNode node = new OperationTreeNode(operation, result);
root.add(node);
}
TreeModel model = new DefaultTreeModel(root);
@@ -117,23 +170,36 @@
navigation.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() == 2) {
- Object[] paths = navigation.getSelectionPath().getPath();
- FishingOperation operation = null;
- for (Object o : paths) {
- if (o != null && OperationTreeNode.class.isAssignableFrom(o.getClass())) {
- operation = (FishingOperation) ((OperationTreeNode) o).getUserObject();
- break;
- }
- }
- editFishingOperationAction.setFishingOperation(operation);
- AbstractTuttiAction.runAction(editFishingOperationAction);
+ TreePath selectionPath = navigation.getSelectionPath();
+ Preconditions.checkArgument(selectionPath.getPathCount() > 1);
+
+ Object o = selectionPath.getPathComponent(1);
+ FishingOperation operation = null;
+
+ if (o != null) {
+ operation = (FishingOperation) ((OperationTreeNode) o).getUserObject();
}
+ getModel().setSelectedFishingOperation(operation);
}
});
+ SwingUtil.expandTree(navigation);
+ SwingUtil.addExpandOnClickListener(navigation);
FishingOperationsUI operationPanel = ui.getOperationPanel();
operationPanel.getTopPanel().setVisible(false);
+
+ operationPanel.getFishingOperationTabContent().getModel().addPropertyChangeListener(
+ EditFishingOperationUIModel.PROPERTY_PERSISTED, new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ EditFishingOperationUIModel model = (EditFishingOperationUIModel) evt.getSource();
+ if (Boolean.TRUE.equals(evt.getNewValue())) {
+ model.addPropertyChangeListener(editFishingOperationModelListener);
+ } else {
+ model.removePropertyChangeListener(editFishingOperationModelListener);
+ }
+ }
+ });
}
@Override
@@ -159,6 +225,20 @@
return true;
}
+ protected void updateCurrentOperatonNode(NuitonValidatorResult validationResult) {
+ JTree navigation = ui.getNavigation();
+ TreePath selectionPath = navigation.getSelectionPath();
+ Preconditions.checkArgument(selectionPath.getPathCount() > 1);
+
+ OperationTreeNode operationNode = (OperationTreeNode) selectionPath.getPathComponent(1);
+ operationNode.removeAllChildren();
+ operationNode.createChildren(validationResult);
+
+ DefaultTreeModel treeModel = (DefaultTreeModel) navigation.getModel();
+ treeModel.reload(operationNode);
+ navigation.setSelectionPath(selectionPath);
+ }
+
protected class ValidationTreeCellRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
@@ -170,11 +250,15 @@
if (value != null) {
if (value instanceof OperationTreeNode) {
OperationTreeNode node = (OperationTreeNode) value;
- label.setText(getDecorator(FishingOperation.class, null).toString(node.getUserObject()));
+ String text = getDecorator(FishingOperation.class, null).toString(node.getUserObject());
+ label.setText(text);
+ label.setToolTipText(text);
} else if (value instanceof MessageTreeNode) {
MessageTreeNode node = (MessageTreeNode) value;
- label.setText(_(String.valueOf(node.getUserObject())));
+ String text = _(String.valueOf(node.getUserObject()));
+ label.setText(text);
+ label.setToolTipText(text);
String iconName = node.getScope().toString().toLowerCase();
label.setIcon(SwingUtil.createImageIcon(iconName + ".png"));
}
@@ -188,20 +272,32 @@
private static final long serialVersionUID = 1L;
public OperationTreeNode(FishingOperation operation,
- Multimap<NuitonValidatorScope, String> messages) {
+ NuitonValidatorResult validationResult) {
super(operation);
- setAllowsChildren(messages != null);
- createChildren(messages);
+
+ setAllowsChildren(true);
+ createChildren(validationResult);
}
- public void createChildren(Multimap<NuitonValidatorScope, String> messages) {
- for (NuitonValidatorScope scope : messages.keySet()) {
- for (String message : messages.get(scope)) {
- MessageTreeNode child = new MessageTreeNode(scope, message);
- this.add(child);
- }
+ public void createChildren(NuitonValidatorResult validationResult) {
+ int messageNb = 0;
+ messageNb += addMessages(NuitonValidatorScope.ERROR,
+ validationResult.getMessagesForScope(NuitonValidatorScope.ERROR));
+ messageNb += addMessages(NuitonValidatorScope.WARNING,
+ validationResult.getMessagesForScope(NuitonValidatorScope.WARNING));
+
+ if (messageNb == 0) {
+ addMessages(NuitonValidatorScope.INFO, Lists.newArrayList(_("tutti.validator.info.operation.noError")));
}
}
+
+ protected int addMessages(NuitonValidatorScope scope, List<String> messages) {
+ for (String message : messages) {
+ MessageTreeNode child = new MessageTreeNode(scope, message);
+ this.add(child);
+ }
+ return messages.size();
+ }
}
protected class MessageTreeNode extends DefaultMutableTreeNode {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java 2013-04-25 17:22:52 UTC (rev 875)
@@ -35,359 +35,53 @@
import fr.ifremer.tutti.persistence.entities.referential.Vessel;
import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel;
import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentModelAware;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jdesktop.beans.AbstractSerializableBean;
+import org.nuiton.validator.NuitonValidatorResult;
import java.util.Collection;
import java.util.Date;
import java.util.List;
+import java.util.Map;
/**
* @author kmorin <kmorin(a)codelutin.com>
* @since 1.4
*/
-public class ValidateCruiseUIModel extends AbstractTuttiBeanUIModel<FishingOperation, ValidateCruiseUIModel>
- implements AttachmentModelAware, FishingOperation {
+public class ValidateCruiseUIModel extends AbstractSerializableBean {
- protected ValidateCruiseUIModel() {
- super(FishingOperation.class, null, null);
- }
+ private static final long serialVersionUID = 1L;
- /**
- * Delegate edit object.
- *
- * @since 1.4
- */
- protected FishingOperation editObject = null;
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(ValidateCruiseUIModel.class);
- public FishingOperation getEditFishingOperation() {
- return editObject;
- }
+ public static final String PROPERTY_SELECTED_FISHING_OPERATION = "selectedFishingOperation";
- public void setEditFishingOperation(FishingOperation editObject) {
- this.editObject = editObject;
- }
+ public static final String PROPERTY_VALIDATOR = "validator";
- @Override
- protected FishingOperation newEntity() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
+ protected FishingOperation selectedFishingOperation;
- @Override
- public AttachementObjectTypeEnum getObjectType() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
+ protected Map<FishingOperation, NuitonValidatorResult> validator;
- @Override
- public Integer getObjectId() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ public FishingOperation getSelectedFishingOperation() {
+ return selectedFishingOperation;
}
- @Override
- public List<Attachment> getAttachment() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ public void setSelectedFishingOperation(FishingOperation selectedFishingOperation) {
+ Object oldValue = getSelectedFishingOperation();
+ this.selectedFishingOperation = selectedFishingOperation;
+ firePropertyChange(PROPERTY_SELECTED_FISHING_OPERATION, oldValue, selectedFishingOperation);
}
- @Override
- public void addAllAttachment(Collection<Attachment> attachments) {
- //To change body of implemented methods use File | Settings | File Templates.
+ public Map<FishingOperation, NuitonValidatorResult> getValidator() {
+ return validator;
}
- @Override
- public void addAttachment(Attachment attachment) {
- //To change body of implemented methods use File | Settings | File Templates.
+ public void setValidator(Map<FishingOperation, NuitonValidatorResult> validator) {
+ Object oldValue = getValidator();
+ this.validator = validator;
+ firePropertyChange(PROPERTY_VALIDATOR, oldValue, validator);
}
-
- @Override
- public void removeAllAttachment(Collection<Attachment> attachments) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void removeAttachment(Attachment attachment) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public String getStationNumber() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setStationNumber(String stationNumber) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Integer getFishingOperationNumber() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setFishingOperationNumber(Integer fishingOperationNumber) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Float getGearShootingStartLatitude() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGearShootingStartLatitude(Float gearShootingStartLatitude) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Float getGearShootingStartLongitude() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGearShootingStartLongitude(Float gearShootingStartLongitude) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Date getGearShootingStartDate() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGearShootingStartDate(Date gearShootingStartDate) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Float getGearShootingEndLatitude() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGearShootingEndLatitude(Float gearShootingEndLatitude) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Float getGearShootingEndLongitude() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGearShootingEndLongitude(Float gearShootingEndLongitude) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Date getGearShootingEndDate() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGearShootingEndDate(Date gearShootingEndDate) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean isFishingOperationRectiligne() {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setFishingOperationRectiligne(boolean fishingOperationRectiligne) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Float getTrawlDistance() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setTrawlDistance(Float trawlDistance) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Boolean getFishingOperationValid() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setFishingOperationValid(Boolean fishingOperationValid) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean isPlanktonObserved() {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setPlanktonObserved(boolean planktonObserved) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public CaracteristicMap getVesselUseFeatures() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setVesselUseFeatures(CaracteristicMap vesselUseFeatures) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public CaracteristicMap getGearUseFeatures() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGearUseFeatures(CaracteristicMap gearUseFeatures) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean isAccidentalObserved() {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setAccidentalObserved(boolean accidentalObserved) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public String getMultirigAggregation() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setMultirigAggregation(String multirigAggregation) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public String getComment() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setComment(String comment) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Cruise getCruise() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setCruise(Cruise cruise) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Person getRecorderPerson(int index) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean isRecorderPersonEmpty() {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public int sizeRecorderPerson() {
- return 0; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void addRecorderPerson(Person recorderPerson) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void addAllRecorderPerson(Collection<Person> recorderPerson) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean removeRecorderPerson(Person recorderPerson) {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean removeAllRecorderPerson(Collection<Person> recorderPerson) {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean containsRecorderPerson(Person recorderPerson) {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean containsAllRecorderPerson(Collection<Person> recorderPerson) {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public List<Person> getRecorderPerson() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setRecorderPerson(List<Person> recorderPerson) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Gear getGear() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setGear(Gear gear) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Vessel getVessel() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setVessel(Vessel vessel) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public TuttiLocation getStrata() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setStrata(TuttiLocation strata) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public TuttiLocation getSubStrata() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setSubStrata(TuttiLocation subStrata) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public TuttiLocation getLocation() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void setLocation(TuttiLocation location) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-25 17:22:52 UTC (rev 875)
@@ -29,6 +29,7 @@
import fr.ifremer.tutti.ui.swing.TuttiScreen;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.content.AbstractChangeScreenAction;
+import fr.ifremer.tutti.ui.swing.content.MainUI;
import fr.ifremer.tutti.ui.swing.content.MainUIHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml 2013-04-25 17:22:52 UTC (rev 875)
@@ -29,56 +29,6 @@
<validators>
- <field name="gearShootingStartDate">
-
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ gearShootingStartDate == null || isDateInCruise(gearShootingStartDate) ]]>
- </param>
- <message>
- tutti.validator.error.fishingOperation.dates.startOutOfCruiseDates
- </message>
- </field-validator>
-
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null
- || isValidDuration()
- ]]>
- </param>
- <message>tutti.validator.error.fishingOperation.dates.wrongTime</message>
- </field-validator>
-
- </field>
-
- <field name="gearShootingEndDate">
-
- <field-validator type="required" short-circuit="true">
- <message>
- tutti.validator.error.fishingOperation.date.end.required
- </message>
- </field-validator>
-
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ gearShootingEndDate == null || isDateInCruise(gearShootingEndDate) ]]>
- </param>
- <message>
- tutti.validator.error.fishingOperation.dates.endOutOfCruiseDates
- </message>
- </field-validator>
-
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null
- || isValidDuration()
- ]]>
- </param>
- <message>tutti.validator.error.fishingOperation.dates.wrongTime</message>
- </field-validator>
-
- </field>
-
<field name="gearShootingStartLatitudeDegree">
<field-validator type="fieldexpression" short-circuit="true">
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-25 17:22:52 UTC (rev 875)
@@ -1147,6 +1147,7 @@
tutti.validator.error.splitSpeciesBatch.sampleWeight.invalidValue=
tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight=
tutti.validator.error.splitSpeciesBatch.selectedCategory.required=
+tutti.validator.info.operation.noError=
tutti.validator.warning.cruise.name.format=
tutti.validator.warning.latitude.degree.outOfBounds=
tutti.validator.warning.latitude.minute.outOfBounds=
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-25 09:22:03 UTC (rev 874)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-25 17:22:52 UTC (rev 875)
@@ -55,7 +55,7 @@
tutti.common.askSaveBeforeLeaving.title=Modifications non enregistrées
tutti.common.cancel=Annuler
tutti.common.cancel.mnemonic=A
-tutti.common.datefield.tip=Format attendu : %s
+tutti.common.datefield.tip=Format attendu \: %s
tutti.common.file.csv=Extension d'un fichier csv
tutti.common.file.pdf=Extension d'un fichier pdf
tutti.common.file.protocol=Extension d'un fichier de protocole Tutti
@@ -1133,6 +1133,7 @@
tutti.validator.error.splitSpeciesBatch.sampleWeight.invalidValue=La somme des poids ventilés doit être strictement positive
tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight=La somme des poids ventilés doit être inférieur ou égale à celle du poids du lot
tutti.validator.error.splitSpeciesBatch.selectedCategory.required=La catégorie est obligatoire
+tutti.validator.info.operation.noError=Trait sans erreur
tutti.validator.warning.cruise.name.format=Le format n'est pas celui ...
tutti.validator.warning.latitude.degree.outOfBounds=Le degré de la latitude doit être compris entre -90 et 90
tutti.validator.warning.latitude.minute.outOfBounds=La minute de la latitude doit être comprise entre 0 et 59
1
0
r874 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing/util resources/i18n
by kmorin@users.forge.codelutin.com 25 Apr '13
by kmorin@users.forge.codelutin.com 25 Apr '13
25 Apr '13
Author: kmorin
Date: 2013-04-25 11:22:03 +0200 (Thu, 25 Apr 2013)
New Revision: 874
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/874
Log:
fixes #2217 [ERGO] - M?\195?\169canisme de validation des champs saisissables
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java 2013-04-23 16:52:15 UTC (rev 873)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java 2013-04-25 09:22:03 UTC (rev 874)
@@ -599,6 +599,7 @@
}
String dateFormat = getConfig().getDateFormat();
picker.setFormats(dateFormat);
+ picker.setToolTipText(_("tutti.common.datefield.tip", dateFormat));
picker.getEditor().addFocusListener(new FocusAdapter() {
@Override
@@ -610,6 +611,7 @@
if (log.isDebugEnabled()) {
log.debug("format error", ex);
}
+ picker.requestFocus();
}
}
});
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-23 16:52:15 UTC (rev 873)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-25 09:22:03 UTC (rev 874)
@@ -55,6 +55,7 @@
tutti.common.askSaveBeforeLeaving.title=
tutti.common.cancel=
tutti.common.cancel.mnemonic=
+tutti.common.datefield.tip=
tutti.common.file.csv=
tutti.common.file.export=
tutti.common.file.pdf=
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-23 16:52:15 UTC (rev 873)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-25 09:22:03 UTC (rev 874)
@@ -55,6 +55,7 @@
tutti.common.askSaveBeforeLeaving.title=Modifications non enregistrées
tutti.common.cancel=Annuler
tutti.common.cancel.mnemonic=A
+tutti.common.datefield.tip=Format attendu : %s
tutti.common.file.csv=Extension d'un fichier csv
tutti.common.file.pdf=Extension d'un fichier pdf
tutti.common.file.protocol=Extension d'un fichier de protocole Tutti
1
0
23 Apr '13
Author: kmorin
Date: 2013-04-23 18:52:15 +0200 (Tue, 23 Apr 2013)
New Revision: 873
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/873
Log:
refs #2079 [CONTROLE] - Contr?\195?\180le / Validation apr?\195?\168s la saisie
Added:
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml
Removed:
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml
trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml
trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties
trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties
trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -28,14 +28,19 @@
import com.esotericsoftware.yamlbeans.YamlReader;
import com.esotericsoftware.yamlbeans.YamlWriter;
import com.google.common.base.Charsets;
+import com.google.common.collect.Lists;
import com.google.common.io.Files;
import fr.ifremer.tutti.TuttiTechnicalException;
import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory;
+import fr.ifremer.tutti.persistence.entities.data.*;
+import fr.ifremer.tutti.persistence.entities.referential.Species;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.Reader;
+import java.util.List;
/**
* Helper classaround {@link TuttiProtocol}.
@@ -88,4 +93,111 @@
result.writeConfig.setWriteRootTags(false);
return result;
}
+
+ /**
+ * Is the species batch respecting the protocol recommendations?
+ * @param protocol the current protocol
+ * @param batch the batch to check (it should be a leaf)
+ * @param frequencies the frequencies of the batch
+ * @return true if the batch respects the protocol, false otherwise
+ */
+ public static boolean isSpeciesBatchValid(TuttiProtocol protocol,
+ SpeciesBatch batch,
+ List<SpeciesBatchFrequency> frequencies) {
+ boolean result = true;
+
+ if (protocol != null) {
+ Species species = batch.getSpecies();
+ List<SpeciesProtocol> speciesProtocols = protocol.getSpecies();
+ SpeciesProtocol speciesProtocol = getSpeciesProtocol(species, speciesProtocols);
+
+ if (speciesProtocol != null) {
+ List<SampleCategoryEnum> mandatoryCategories = getMandatoryCategories(speciesProtocol);
+
+ SpeciesBatch browsingBatch = batch;
+ while (browsingBatch.getParentBatch() != null) {
+ mandatoryCategories.remove(browsingBatch.getSampleCategoryType());
+ browsingBatch = browsingBatch.getParentBatch();
+ }
+ result = mandatoryCategories.isEmpty() &&
+ (!speciesProtocol.isCountIfNoFrequencyEnabled()
+ || CollectionUtils.isNotEmpty(frequencies)
+ || batch.getNumber() != null);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Is the benthos batch respecting the protocol recommendations?
+ * @param protocol the current protocol
+ * @param batch the batch to check (it should be a leaf)
+ * @param frequencies the frequencies of the batch
+ * @return true if the batch respects the protocol, false otherwise
+ */
+ public static boolean isBenthosBatchValid(TuttiProtocol protocol,
+ BenthosBatch batch,
+ List<BenthosBatchFrequency> frequencies) {
+ boolean result = true;
+
+ if (protocol != null) {
+ Species species = batch.getSpecies();
+ List<SpeciesProtocol> speciesProtocols = protocol.getBenthos();
+ SpeciesProtocol speciesProtocol = getSpeciesProtocol(species, speciesProtocols);
+
+ if (speciesProtocol != null) {
+ // get the categories which should be set
+ List<SampleCategoryEnum> mandatoryCategories = getMandatoryCategories(speciesProtocol);
+
+ BenthosBatch browsingBatch = batch;
+ while (browsingBatch.getParentBatch() != null) {
+ mandatoryCategories.remove(browsingBatch.getSampleCategoryType());
+ browsingBatch = browsingBatch.getParentBatch();
+ }
+ result = mandatoryCategories.isEmpty() &&
+ (!speciesProtocol.isCountIfNoFrequencyEnabled()
+ || CollectionUtils.isNotEmpty(frequencies)
+ || batch.getNumber() != null);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Retrieve the speciesprotocol corresponding to the species of the batch
+ * @param species
+ * @param speciesProtocols
+ * @return
+ */
+ protected static SpeciesProtocol getSpeciesProtocol(Species species, List<SpeciesProtocol> speciesProtocols) {
+ for (SpeciesProtocol speciesProtocol : speciesProtocols) {
+ if (species.getReferenceTaxonId().equals(
+ speciesProtocol.getSpeciesReferenceTaxonId())) {
+ return speciesProtocol;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Gets the mandatory categories accroding to the protocol
+ * @param speciesProtocol
+ * @return
+ */
+ protected static List<SampleCategoryEnum> getMandatoryCategories(SpeciesProtocol speciesProtocol) {
+ List<SampleCategoryEnum> mandatoryCategories = Lists.newArrayList();
+ if (speciesProtocol.isSizeEnabled()) {
+ mandatoryCategories.add(SampleCategoryEnum.size);
+ }
+ if (speciesProtocol.isSexEnabled()) {
+ mandatoryCategories.add(SampleCategoryEnum.sex);
+ }
+ if (speciesProtocol.isMaturityEnabled()) {
+ mandatoryCategories.add(SampleCategoryEnum.maturity);
+ }
+ if (speciesProtocol.isAgeEnabled()) {
+ mandatoryCategories.add(SampleCategoryEnum.age);
+ }
+ return mandatoryCategories;
+ }
}
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiDataContext.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -24,8 +24,10 @@
* #L%
*/
+import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
import fr.ifremer.tutti.persistence.entities.TuttiEntities;
import fr.ifremer.tutti.persistence.entities.data.Cruise;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -142,65 +142,6 @@
return result;
}
- /**
- * To check if can compute the weights of the given operation
- * <p/>
- * If no error found, then return is a empty list, otherwise the errors found
- *
- * @param fishingOperation the operation to check.
- * @return list of errors, or empty list if no error found.
- * @since 1.4
- */
- public List<String> checkOperation(FishingOperation fishingOperation) {
-
- if (log.isDebugEnabled()) {
- log.debug("Will check fishingOperation: " + fishingOperation);
- }
-
- List<String> result = Lists.newArrayList();
- String fishingOperationId = fishingOperation.getId();
- CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId);
-
- BatchContainer<SpeciesBatch> rootSpeciesBatch;
- try {
- rootSpeciesBatch = getComputedSpeciesBatches(fishingOperation);
-
- } catch (TuttiBusinessException e) {
- result.add(e.getMessage());
- rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId);
- }
-
- BatchContainer<BenthosBatch> rootBenthosBatch;
- try {
- rootBenthosBatch = getComputedBenthosBatches(fishingOperation);
-
- } catch (TuttiBusinessException e) {
- result.add(e.getMessage());
- rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId);
- }
-
- BatchContainer<MarineLitterBatch> rootMarineLitterBatch;
- try {
- rootMarineLitterBatch = getComputedMarineLitterBatches(fishingOperation);
-
- } catch (TuttiBusinessException e) {
- result.add(e.getMessage());
- rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId);
- }
-
- try {
- if (catchBatch != null) {
- computeCatchBatchWeights(catchBatch,
- rootSpeciesBatch,
- rootBenthosBatch,
- rootMarineLitterBatch);
- }
- } catch (TuttiBusinessException e) {
- result.add(e.getMessage());
- }
- return result;
- }
-
public void computeCatchBatchWeights(CatchBatch catchBatch,
BatchContainer<SpeciesBatch> rootSpeciesBatch,
BatchContainer<BenthosBatch> rootBenthosBatch,
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -24,25 +24,37 @@
* #L%
*/
+import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
+import fr.ifremer.tutti.TuttiBusinessException;
+import fr.ifremer.tutti.persistence.entities.data.*;
+import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
+import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols;
import fr.ifremer.tutti.service.AbstractTuttiService;
import fr.ifremer.tutti.service.PersistenceService;
import fr.ifremer.tutti.service.TuttiDataContext;
import fr.ifremer.tutti.service.TuttiServiceContext;
import fr.ifremer.tutti.service.ValidationService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.nuiton.validator.NuitonValidatorResult;
import org.nuiton.validator.NuitonValidatorScope;
import java.util.List;
import java.util.Map;
+import static org.nuiton.i18n.I18n._;
+
/**
+ * Service to validate the operations of a cruise
+ *
* @author kmorin <kmorin(a)codelutin.com>
* @since 1.4
*/
public class ValidateCruiseOperationsService extends AbstractTuttiService {
+ private static final Log log = LogFactory.getLog(ValidateCruiseOperationsService.class);
+
protected PersistenceService persistenceService;
protected ValidationService validationService;
@@ -57,6 +69,10 @@
tuttiWeightComputingService = getService(TuttiWeightComputingService.class);
}
+ /**
+ * Validates the operations of the currently selected cruise.
+ * @return a map containing the operations and the validation results
+ */
public Map<FishingOperation, NuitonValidatorResult> validateCruiseOperations() {
Map<FishingOperation, NuitonValidatorResult> result = Maps.newHashMap();
@@ -65,13 +81,134 @@
for (FishingOperation operation : operations) {
NuitonValidatorResult validator = validationService.validateFishingOperation(operation, ValidationService.VALIDATION_CONTEXT_VALIDATE);
- List<String> errors = tuttiWeightComputingService.checkOperation(operation);
- Map<String, List<String>> errorMap = Maps.newHashMap();
- errorMap.put("cacthes", errors);
- validator.addMessagesForScope(NuitonValidatorScope.ERROR, errorMap);
+ checkOperation(operation, validator);
result.put(operation, validator);
}
return result;
}
+
+ /**
+ * Adds additional messages to the validation results
+ * @param fishingOperation the operation to validate
+ * @param validator the validatpr containing the messages.
+ */
+ protected void checkOperation(FishingOperation fishingOperation,
+ NuitonValidatorResult validator) {
+ if (log.isDebugEnabled()) {
+ log.debug("Will check fishingOperation: " + fishingOperation);
+ }
+
+ List<String> errors = Lists.newArrayList();
+ String fishingOperationId = fishingOperation.getId();
+ CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId);
+
+ BatchContainer<SpeciesBatch> rootSpeciesBatch;
+ try {
+ rootSpeciesBatch = tuttiWeightComputingService.getComputedSpeciesBatches(fishingOperation);
+
+ } catch (TuttiBusinessException e) {
+ errors.add(e.getMessage());
+ rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId);
+ }
+
+ BatchContainer<BenthosBatch> rootBenthosBatch;
+ try {
+ rootBenthosBatch = tuttiWeightComputingService.getComputedBenthosBatches(fishingOperation);
+
+ } catch (TuttiBusinessException e) {
+ errors.add(e.getMessage());
+ rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId);
+ }
+
+ BatchContainer<MarineLitterBatch> rootMarineLitterBatch;
+ try {
+ rootMarineLitterBatch = tuttiWeightComputingService.getComputedMarineLitterBatches(fishingOperation);
+
+ } catch (TuttiBusinessException e) {
+ errors.add(e.getMessage());
+ rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId);
+ }
+
+ try {
+ if (catchBatch != null) {
+ tuttiWeightComputingService.computeCatchBatchWeights(catchBatch,
+ rootSpeciesBatch,
+ rootBenthosBatch,
+ rootMarineLitterBatch);
+ }
+ } catch (TuttiBusinessException e) {
+ errors.add(e.getMessage());
+ }
+
+ Map<String, List<String>> errorMap = Maps.newHashMap();
+ errorMap.put("catches", errors);
+ validator.addMessagesForScope(NuitonValidatorScope.ERROR, errorMap);
+
+ TuttiDataContext dataContext = context.getDataContext();
+ if (dataContext.isProtocolFilled()) {
+ TuttiProtocol protocol = dataContext.getProtocol();
+ Map<String, List<String>> warningMap = Maps.newHashMap();
+
+ for (SpeciesBatch batch : rootSpeciesBatch.getChildren()) {
+ if (isSpeciesBatchInvalid(batch, protocol)) {
+ warningMap.put("species", Lists.newArrayList(_("tutti.validator.warning.species.protocolNotRespected")));
+ break;
+ }
+ }
+
+ for (BenthosBatch batch : rootBenthosBatch.getChildren()) {
+ if (isBenthosBatchInvalid(batch, protocol)) {
+ warningMap.put("benthos", Lists.newArrayList(_("tutti.validator.warning.benthos.protocolNotRespected")));
+ break;
+ }
+ }
+
+ validator.addMessagesForScope(NuitonValidatorScope.WARNING, warningMap);
+ }
+ }
+
+ /**
+ * Is the species batch respecting the protocol recommendations?
+ * @param batch the batch to check
+ * @param protocol the current protocol
+ * @return true if the batch or one of its children does not respect the protocol, false otherwise
+ */
+ protected boolean isSpeciesBatchInvalid(SpeciesBatch batch, TuttiProtocol protocol) {
+ if (batch.isChildBatchsEmpty()) {
+ List<SpeciesBatchFrequency> frequencies =
+ persistenceService.getAllSpeciesBatchFrequency(batch.getId());
+ return !TuttiProtocols.isSpeciesBatchValid(protocol, batch, frequencies);
+ }
+
+ for (SpeciesBatch child : batch.getChildBatchs()) {
+ boolean invalid = isSpeciesBatchInvalid(child, protocol);
+ if (invalid) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Is the benthos batch respecting the protocol recommendations?
+ * @param batch the batch to check
+ * @param protocol the current protocol
+ * @return true if the batch or one of its children does not respect the protocol, false otherwise
+ */
+ protected boolean isBenthosBatchInvalid(BenthosBatch batch, TuttiProtocol protocol) {
+ if (batch.isChildBatchsEmpty()) {
+ List<BenthosBatchFrequency> frequencies =
+ persistenceService.getAllBenthosBatchFrequency(batch.getId());
+ return !TuttiProtocols.isBenthosBatchValid(protocol, batch, frequencies);
+ }
+
+ for (BenthosBatch child : batch.getChildBatchs()) {
+ boolean invalid = isBenthosBatchInvalid(child, protocol);
+ if (invalid) {
+ return true;
+ }
+ }
+ return false;
+ }
}
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/AccidentalBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873)
@@ -30,9 +30,7 @@
<field name="species">
<field-validator type="required" short-circuit="true">
- <message>
- tutti.service.operations.accidental.error.species.required
- </message>
+ <message>tutti.validator.error.accidental.species.required</message>
</field-validator>
</field>
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873)
@@ -28,6 +28,12 @@
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
+ <field name="species">
+ <field-validator type="required" short-circuit="true">
+ <message>tutti.validator.error.benthosBatch.species.required</message>
+ </field-validator>
+ </field>
+
<field name="weight">
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/IndividualObservationBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873)
@@ -31,7 +31,7 @@
<field name="species">
<field-validator type="required" short-circuit="true">
<message>
- tutti.service.operations.individualObservation.error.species.required
+ tutti.validator.error.individualObservation.species.required
</message>
</field-validator>
</field>
@@ -39,7 +39,7 @@
<field name="weight">
<field-validator type="required" short-circuit="true">
<message>
- tutti.service.operations.individualObservation.error.weight.required
+ tutti.validator.error.individualObservation.weight.required
</message>
</field-validator>
</field>
@@ -47,7 +47,7 @@
<field name="size">
<field-validator type="required" short-circuit="true">
<message>
- tutti.service.operations.individualObservation.error.size.required
+ tutti.validator.error.individualObservation.size.required
</message>
</field-validator>
</field>
@@ -55,7 +55,7 @@
<field name="lengthStepCaracteristic">
<field-validator type="required" short-circuit="true">
<message>
- tutti.service.operations.individualObservation.error.lengthStepCaracteristic.required
+ tutti.validator.error.individualObservation.lengthStepCaracteristic.required
</message>
</field-validator>
</field>
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873)
@@ -31,19 +31,19 @@
<field name="marineLitterCategory">
<field-validator type="required" short-circuit="true">
- <message>tutti.service.operations.marineLitter.error.marineLitterCategory.required</message>
+ <message>tutti.validator.error.marineLitter.marineLitterCategory.required</message>
</field-validator>
</field>
<field name="marineLitterSizeCategory">
<field-validator type="required" short-circuit="true">
- <message>tutti.service.operations.marineLitter.error.marineLitterSizeCategory.required</message>
+ <message>tutti.validator.error.marineLitter.marineLitterSizeCategory.required</message>
</field-validator>
</field>
<field name="number">
<field-validator type="required" short-circuit="true">
- <message>tutti.service.operations.marineLitter.error.number.required</message>
+ <message>tutti.validator.error.marineLitter.number.required</message>
</field-validator>
</field>
Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/MarineLitterBatch-warning-validation.xml 2013-04-23 16:52:15 UTC (rev 873)
@@ -31,7 +31,7 @@
<field name="weight">
<field-validator type="required" short-circuit="true">
- <message>tutti.service.operations.marineLitter.warning.weight.required</message>
+ <message>tutti.validator.warning.marineLitter.weight.required</message>
</field-validator>
</field>
Deleted: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873)
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- #%L
- Tutti :: Service
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2012 - 2013 Ifremer
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public
- License along with this program. If not, see
- <http://www.gnu.org/licenses/gpl-3.0.html>.
- #L%
- -->
-
-<!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="weight">
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ !(sampleCategoryWeight == null && weight != null) ]]>
- </param>
- <message>tutti.service.operations.computeWeights.error.species.incoherentRowWeightCategory</message>
- </field-validator>
-
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ weight == null || sampleCategoryWeight == null || weight <= sampleCategoryWeight ]]>
- </param>
- <message>tutti.service.operations.computeWeights.error.species.incoherentSampleWeight</message>
- </field-validator>
- </field>
-
-</validators>
\ No newline at end of file
Added: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml
===================================================================
--- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml (rev 0)
+++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-23 16:52:15 UTC (rev 873)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: Service
+ $Id: SpeciesBatch-error-validation.xml 862 2013-04-23 08:09:40Z kmorin $
+ $HeadURL: http://svn.forge.codelutin.com/svn/tutti/trunk/tutti-service/src/main/resou… $
+ %%
+ Copyright (C) 2012 - 2013 Ifremer
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/gpl-3.0.html>.
+ #L%
+ -->
+
+<!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="species">
+ <field-validator type="required" short-circuit="true">
+ <message>tutti.validator.error.speciesBatch.species.required</message>
+ </field-validator>
+ </field>
+
+ <field name="weight">
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ !(sampleCategoryWeight == null && weight != null) ]]>
+ </param>
+ <message>tutti.service.operations.computeWeights.error.species.incoherentRowWeightCategory</message>
+ </field-validator>
+
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ weight == null || sampleCategoryWeight == null || weight <= sampleCategoryWeight ]]>
+ </param>
+ <message>tutti.service.operations.computeWeights.error.species.incoherentSampleWeight</message>
+ </field-validator>
+ </field>
+
+</validators>
\ No newline at end of file
Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties
===================================================================
--- trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-04-23 16:52:15 UTC (rev 873)
@@ -105,6 +105,8 @@
tutti.service.operations.validate.marineLitter.error.marineLitterSizeCategory.required=
tutti.service.operations.validate.marineLitter.error.number.required=
tutti.service.operations.validate.marineLitter.warning.weight.required=
+tutti.validator.error.accidental.species.required=
+tutti.validator.error.benthosBatch.species.required=
tutti.validator.error.comment.too.long=
tutti.validator.error.cruise.beginDate.required=
tutti.validator.error.cruise.dates.endBeforeStart=
@@ -137,10 +139,17 @@
tutti.validator.error.fishingOperation.trawlDistance.tooLong=
tutti.validator.error.fishingOperation.trawlNetNumber.required=
tutti.validator.error.fishingOperation.vessel.required=
+tutti.validator.error.individualObservation.lengthStepCaracteristic.required=
+tutti.validator.error.individualObservation.size.required=
+tutti.validator.error.individualObservation.species.required=
+tutti.validator.error.individualObservation.weight.required=
tutti.validator.error.latitude.end.required=
tutti.validator.error.latitude.start.required=
tutti.validator.error.longitude.end.required=
tutti.validator.error.longitude.start.required=
+tutti.validator.error.marineLitter.marineLitterCategory.required=
+tutti.validator.error.marineLitter.marineLitterSizeCategory.required=
+tutti.validator.error.marineLitter.number.required=
tutti.validator.error.program.description.required=
tutti.validator.error.program.description.too.long=
tutti.validator.error.program.existingKey=
@@ -148,5 +157,9 @@
tutti.validator.error.program.zone.required=
tutti.validator.error.protocol.name.alreadyUsed=
tutti.validator.error.protocol.name.required=
+tutti.validator.error.speciesBatch.species.required=
+tutti.validator.warning.benthos.protocolNotRespected=
tutti.validator.warning.latitude.outOfBounds=
tutti.validator.warning.longitude.outOfBounds=
+tutti.validator.warning.marineLitter.weight.required=
+tutti.validator.warning.species.protocolNotRespected=
Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties
===================================================================
--- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-04-23 16:52:15 UTC (rev 873)
@@ -62,7 +62,6 @@
tutti.service.exportSumatra.header.species=Espèce
tutti.service.exportSumatra.header.station=Station
tutti.service.exportSumatra.header.weight=Total
-tutti.service.operations.accidental.error.species.required=L'espèce est obligatoire
tutti.service.operations.computeWeights.error.benthos.incoherentCategoryWeight=Le poids total des mensurations d'un lot du benthos est supérieur au poids de la catégorie
tutti.service.operations.computeWeights.error.benthos.incoherentParentCategoryWeight=Le poids de la catégorie d'un lot du benthos est différent de la somme des poids de ses sous-catégories
tutti.service.operations.computeWeights.error.benthos.incoherentRowWeightCategory=Le poids de sous-échantillon est renseigné alors que le lot n'a pas de poids.
@@ -81,14 +80,8 @@
tutti.service.operations.computeWeights.error.species.incoherentTotalSorted=Le poids total Vrac des espèces est inférieur à la somme des poids Vrac triés, inerte trié et vivant non détaillé trié
tutti.service.operations.computeWeights.error.species.noWeight=Un lot des espèces n'a pas de poids
tutti.service.operations.exportCatchesReport.error=Erreur lors de la génération du rapport des captures
-tutti.service.operations.individualObservation.error.lengthStepCaracteristic.required=La classe de taille est obligatoire
-tutti.service.operations.individualObservation.error.size.required=La taille est obligatoire
-tutti.service.operations.individualObservation.error.species.required=L'espèce est obligatoire
-tutti.service.operations.individualObservation.error.weight.required=Le poids est obligatoire
-tutti.service.operations.marineLitter.error.marineLitterCategory.required=La catégorie du lot de macro-déchet est obligatoire
-tutti.service.operations.marineLitter.error.marineLitterSizeCategory.required=La catégorie de taille du lot de macro-déchet est obligatoire
-tutti.service.operations.marineLitter.error.number.required=Le nombre du lot de macro-déchet est obligatoire
-tutti.service.operations.marineLitter.warning.weight.required=Un lot de macro-déchets n'a pas de poids
+tutti.validator.error.accidental.species.required=L'espèce est obligatoire
+tutti.validator.error.benthosBatch.species.required=L'espèce est obligatoire
tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères)
tutti.validator.error.cruise.beginDate.required=La date de début est obligatoire
tutti.validator.error.cruise.dates.endBeforeStart=La date de fin doit être après la date de début
@@ -121,10 +114,17 @@
tutti.validator.error.fishingOperation.trawlDistance.tooLong=La distance du trait dépasse 3 milles marin (5556 m), merci de vérifier les coordonnées
tutti.validator.error.fishingOperation.trawlNetNumber.required=Le numéro de poche est obligatoire
tutti.validator.error.fishingOperation.vessel.required=Le navire est obligatoire
+tutti.validator.error.individualObservation.lengthStepCaracteristic.required=La classe de taille est obligatoire
+tutti.validator.error.individualObservation.size.required=La taille est obligatoire
+tutti.validator.error.individualObservation.species.required=L'espèce est obligatoire
+tutti.validator.error.individualObservation.weight.required=Le poids est obligatoire
tutti.validator.error.latitude.end.required=La latitude de fin de traîne est obligatoire
tutti.validator.error.latitude.start.required=La latitude de début de traîne est obligatoire
tutti.validator.error.longitude.end.required=La longitude de fin de traîne est obligatoire
tutti.validator.error.longitude.start.required=La longitude de début de traîne est obligatoire
+tutti.validator.error.marineLitter.marineLitterCategory.required=La catégorie du lot de macro-déchet est obligatoire
+tutti.validator.error.marineLitter.marineLitterSizeCategory.required=La catégorie de taille du lot de macro-déchet est obligatoire
+tutti.validator.error.marineLitter.number.required=Le nombre du lot de macro-déchet est obligatoire
tutti.validator.error.program.description.required=La description de la série est obligatoire
tutti.validator.error.program.description.too.long=Taille de la description trop longue (limitée à %s caractères)
tutti.validator.error.program.existingKey=Le couple nom/zone existe déjà
@@ -132,5 +132,9 @@
tutti.validator.error.program.zone.required=La zone de la série est obligatoire
tutti.validator.error.protocol.name.alreadyUsed=Le nom du protocole est déjà utilisé
tutti.validator.error.protocol.name.required=Le nom du protocole est obligatoire
+tutti.validator.error.speciesBatch.species.required=
+tutti.validator.warning.benthos.protocolNotRespected=Un lot du benthos ne suit pas les recommandations du protocole
tutti.validator.warning.latitude.outOfBounds=La Latitude doit être comprise entre -90.0 et 90.0
tutti.validator.warning.longitude.outOfBounds=La longitude doit être comprise entre -180.0 et 180.0
+tutti.validator.warning.marineLitter.weight.required=Un lot de macro-déchets n'a pas de poids
+tutti.validator.warning.species.protocolNotRespected=Un lot des espèces ne suit pas les recommandations du protocole
Modified: trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java
===================================================================
--- trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/BeanValidatorDetectorTest.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -24,11 +24,7 @@
*/
package fr.ifremer.tutti.service;
-import fr.ifremer.tutti.persistence.entities.data.BenthosBatch;
-import fr.ifremer.tutti.persistence.entities.data.Cruise;
-import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
-import fr.ifremer.tutti.persistence.entities.data.Program;
-import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch;
+import fr.ifremer.tutti.persistence.entities.data.*;
import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -69,7 +65,10 @@
TuttiProtocol.class,
SpeciesBatch.class,
BenthosBatch.class,
- FishingOperation.class
+ FishingOperation.class,
+ MarineLitterBatch.class,
+ IndividualObservationBatch.class,
+ AccidentalBatch.class
};
}
@@ -84,7 +83,7 @@
SortedSet<NuitonValidator<?>> validators = detectValidators(ALL_TYPES);
assertFalse(validators.isEmpty());
- assertEquals(7, validators.size());
+ assertEquals(10, validators.size());
}
@Test
@@ -95,8 +94,11 @@
validators = detectValidators(Pattern.compile(contextName), ALL_TYPES);
assertValidatorSetWithSameContextName(validators, null,
+ AccidentalBatch.class,
BenthosBatch.class,
Cruise.class,
+ IndividualObservationBatch.class,
+ MarineLitterBatch.class,
Program.class,
SpeciesBatch.class,
TuttiProtocol.class
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -82,10 +82,6 @@
*/
public class TuttiUIContext extends AbstractBean implements Closeable, UIMessageNotifier, JAXXHelpUIHandler, PropagatePropertyChangeListener.PropagatePropertyChange {
- public static final String VALIDATION_CONTEXT_EDIT = "edit";
-
- public static final String VALIDATION_CONTEXT_VALIDATE = "validate";
-
/** Logger. */
private static final Log log = LogFactory.getLog(TuttiUIContext.class);
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -25,6 +25,7 @@
*/
import com.google.common.base.Preconditions;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.TuttiScreen;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import org.apache.commons.logging.Log;
@@ -52,7 +53,7 @@
if (log.isInfoEnabled()) {
log.info("Edit operations of cruise: " + getContext().getCruiseId());
}
- getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_EDIT);
+ getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_EDIT);
super.doAction();
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -29,6 +29,7 @@
import fr.ifremer.tutti.persistence.entities.data.Program;
import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
import fr.ifremer.tutti.service.PersistenceService;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.RunTutti;
import fr.ifremer.tutti.ui.swing.TuttiScreen;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
@@ -446,7 +447,7 @@
String validationContext = context.getValidationContext();
- if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(validationContext)) {
+ if (ValidationService.VALIDATION_CONTEXT_EDIT.equals(validationContext)) {
// edit operations
screenTitle = _("tutti.fishingOperations.title.edit.operations", getSelectedCruiseTitle());
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -25,6 +25,8 @@
*/
import com.google.common.base.Preconditions;
+import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.TuttiScreen;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import org.apache.commons.logging.Log;
@@ -49,7 +51,7 @@
@Override
protected void doAction() throws Exception {
Preconditions.checkState(getContext().isCruiseFilled());
- getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_VALIDATE);
+ getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_VALIDATE);
// getContext().setScreen(null);
if (log.isInfoEnabled()) {
log.info("Validate operations of cruise: " + getContext().getCruiseId());
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -25,6 +25,7 @@
*/
import com.google.common.base.Preconditions;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.TuttiScreen;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.content.AbstractChangeScreenAction;
@@ -54,7 +55,7 @@
if (log.isInfoEnabled()) {
log.info("Edit operations of cruise: " + getContext().getCruiseId());
}
- getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_EDIT);
+ getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_EDIT);
super.doAction();
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -25,6 +25,7 @@
*/
import com.google.common.base.Preconditions;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.TuttiScreen;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.content.AbstractChangeScreenAction;
@@ -52,7 +53,7 @@
protected void doAction() throws Exception {
Preconditions.checkState(getContext().isProgramFilled());
Preconditions.checkState(getContext().isCruiseFilled());
- getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_VALIDATE);
+ getContext().setValidationContext(ValidationService.VALIDATION_CONTEXT_VALIDATE);
if (log.isInfoEnabled()) {
log.info("Validate operations of cruise: " + getContext().getCruiseId());
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -31,6 +31,7 @@
import fr.ifremer.tutti.persistence.entities.data.CatchBatch;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
import fr.ifremer.tutti.service.PersistenceService;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.content.operation.fishing.AbstractCaracteristicTabUIModel;
import fr.ifremer.tutti.ui.swing.content.operation.fishing.GearUseFeatureTabUIModel;
@@ -129,7 +130,7 @@
saveFishingOperation(toSave);
- if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(getContext().getValidationContext())) {
+ if (ValidationService.VALIDATION_CONTEXT_EDIT.equals(getContext().getValidationContext())) {
handler.getParentUi().getTabPane().setSelectedIndex(1);
handler.getParentUi().getCatchesTabContent().getTabPane().setSelectedIndex(1);
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUIHandler.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -37,9 +37,11 @@
import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum;
import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol;
import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
+import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols;
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
import fr.ifremer.tutti.persistence.entities.referential.Species;
import fr.ifremer.tutti.service.DecoratorService;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler;
import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI;
@@ -56,6 +58,7 @@
import fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.split.SplitBenthosBatchUI;
import fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.split.SplitBenthosBatchUIModel;
import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRowModel;
+import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel;
import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
import fr.ifremer.tutti.ui.swing.util.TuttiUI;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
@@ -80,6 +83,7 @@
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.table.DefaultTableColumnModelExt;
import org.nuiton.util.decorator.Decorator;
+import org.nuiton.validator.NuitonValidatorResult;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
@@ -134,6 +138,8 @@
private final EnumMap<TableViewMode, RowFilter<BenthosBatchTableModel, Integer>> tableFilters;
+ protected ValidationService validationService = getContext().getValidationService();
+
public BenthosBatchUIHandler(TuttiUI<?, ?> parentUi,
BenthosBatchUI ui) {
super(parentUi, ui,
@@ -277,31 +283,19 @@
@Override
protected boolean isRowValid(BenthosBatchRowModel row) {
+ BenthosBatch batch = convertRowToBean(row, true);
+ NuitonValidatorResult validator = validationService.validateBenthosBatch(batch);
+ boolean result = !validator.hasErrorMessagess();
- // a row is valid if species category is not empty and valid
- // then if any of none empty category is valid
- Species species = row.getSpecies();
- boolean result = species != null;
- if (result && row.isBatchLeaf()) {
- if (TuttiUIContext.VALIDATION_CONTEXT_VALIDATE.equals(getContext().getValidationContext())) {
- TuttiProtocol protocol = getDataContext().getProtocol();
- if (protocol != null) {
- List<SpeciesProtocol> speciesProtocols = protocol.getBenthos();
- for (SpeciesProtocol speciesProtocol : speciesProtocols) {
- if (species.getReferenceTaxonId().equals(
- speciesProtocol.getSpeciesReferenceTaxonId())) {
-
- result = (!speciesProtocol.isSizeEnabled() || row.getSizeCategoryValue() != null)
- && (!speciesProtocol.isSexEnabled() || row.getSexCategoryValue() != null)
- && (!speciesProtocol.isMaturityEnabled() || row.getMaturityCategoryValue() != null)
- && (!speciesProtocol.isAgeEnabled() || row.getAgeCategoryValue() != null)
- && (!speciesProtocol.isCountIfNoFrequencyEnabled()
- || CollectionUtils.isNotEmpty(row.getFrequency())
- || row.getNumber() != null);
- }
- }
- }
- }
+ if (result
+ && ValidationService.VALIDATION_CONTEXT_VALIDATE.equals(
+ getContext().getValidationContext())
+ && row.isBatchLeaf()) {
+ List<BenthosBatchFrequency> frequencies =
+ BenthosFrequencyRowModel.toBeans(row.getFrequency(), batch);
+ result = TuttiProtocols.isBenthosBatchValid(getDataContext().getProtocol(),
+ batch,
+ frequencies);
}
return result;
@@ -967,18 +961,12 @@
BenthosBatchRowModel row = tableModel.getEntry(rowIndex);
int selectedRowCount = getTable().getSelectedRowCount();
- if (row.isValid()) {
+ enableSplit = true;
+ enableRemove = true;
+ enableRemoveSub = true;
+ enableRename = true;
+ enableCreateMelag = true;
- // must have at least species filled in row
- // otherwise nothing can be done
-
- enableSplit = true;
- enableRemove = true;
- enableRemoveSub = true;
- enableRename = true;
- enableCreateMelag = true;
- }
-
if (enableSplit) {
// can split if selected batch is a leaf
@@ -1234,4 +1222,24 @@
return model.getSelectedSpecies();
}
+ protected BenthosBatch convertRowToBean(BenthosBatchRowModel row, boolean convertParent) {
+ SampleCategory<?> sampleCategory = row.getFinestCategory();
+ Preconditions.checkNotNull(sampleCategory);
+ Preconditions.checkNotNull(sampleCategory.getCategoryType());
+ Preconditions.checkNotNull(sampleCategory.getCategoryValue());
+
+ BenthosBatch catchBean = row.toBean();
+
+ // apply sample category
+ catchBean.setSampleCategoryType(sampleCategory.getCategoryType());
+ catchBean.setSampleCategoryValue(sampleCategory.getCategoryValue());
+ catchBean.setSampleCategoryWeight(sampleCategory.getCategoryWeight());
+
+ if (convertParent && row.getParentBatch() != null) {
+ BenthosBatch parent = convertRowToBean(row.getParentBatch(), true);
+ catchBean.setParentBatch(parent);
+ }
+
+ return catchBean;
+ }
}
\ No newline at end of file
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-04-23 16:23:05 UTC (rev 872)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-04-23 16:52:15 UTC (rev 873)
@@ -37,9 +37,11 @@
import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency;
import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol;
import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
+import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols;
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
import fr.ifremer.tutti.persistence.entities.referential.Species;
import fr.ifremer.tutti.service.DecoratorService;
+import fr.ifremer.tutti.service.ValidationService;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler;
import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI;
@@ -78,6 +80,7 @@
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.table.DefaultTableColumnModelExt;
import org.nuiton.util.decorator.Decorator;
+import org.nuiton.validator.NuitonValidatorResult;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
@@ -132,6 +135,8 @@
private final EnumMap<TableViewMode, RowFilter<SpeciesBatchTableModel, Integer>> tableFilters;
+ protected ValidationService validationService = getContext().getValidationService();
+
public SpeciesBatchUIHandler(TuttiUI<?, ?> parentUi,
SpeciesBatchUI ui) {
super(parentUi, ui,
@@ -274,31 +279,20 @@
@Override
protected boolean isRowValid(SpeciesBatchRowModel row) {
+ SpeciesBatch batch = convertRowToBean(row, true);
+ NuitonValidatorResult validator = validationService.validateSpeciesBatch(batch);
+ boolean result = !validator.hasErrorMessagess();
- // a row is valid if species category is not empty and valid
- // then if any of none empty category is valid
- Species species = row.getSpecies();
- boolean result = species != null;
- if (result && row.isBatchLeaf()) {
- if (TuttiUIContext.VALIDATION_CONTEXT_VALIDATE.equals(getContext().getValidationContext())) {
- TuttiProtocol protocol = getDataContext().getProtocol();
- if (protocol != null) {
- List<SpeciesProtocol> speciesProtocols = protocol.getSpecies();
- for (SpeciesProtocol speciesProtocol : speciesProtocols) {
- if (species.getReferenceTaxonId().equals(
- speciesProtocol.getSpeciesReferenceTaxonId())) {
+ if (result
+ && ValidationService.VALIDATION_CONTEXT_VALIDATE.equals(
+ getContext().getValidationContext())
+ && row.isBatchLeaf()) {
- result = (!speciesProtocol.isSizeEnabled() || row.getSizeCategoryValue() != null)
- && (!speciesProtocol.isSexEnabled() || row.getSexCategoryValue() != null)
- && (!speciesProtocol.isMaturityEnabled() || row.getMaturityCategoryValue() != null)
- && (!speciesProtocol.isAgeEnabled() || row.getAgeCategoryValue() != null)
- && (!speciesProtocol.isCountIfNoFrequencyEnabled()
- || CollectionUtils.isNotEmpty(row.getFrequency())
- || row.getNumber() != null);
- }
- }
- }
- }
+ List<SpeciesBatchFrequency> frequencies =
+ SpeciesFrequencyRowModel.toBeans(row.getFrequency(), batch);
+ result = TuttiProtocols.isSpeciesBatchValid(getDataContext().getProtocol(),
+ batch,
+ frequencies);
}
return result;
@@ -962,18 +956,12 @@
SpeciesBatchRowModel row = tableModel.getEntry(rowIndex);
int selectedRowCount = getTable().getSelectedRowCount();
- if (row.getSpecies() != null) {
+ enableSplit = true;
+ enableRemove = true;
+ enableRemoveSub = true;
+ enableRename = true;
+ enableCreateMelag = true;
- // must have at least species filled in row
- // otherwise nothing can be done
-
- enableSplit = true;
- enableRemove = true;
- enableRemoveSub = true;
- enableRename = true;
- enableCreateMelag = true;
- }
-
if (enableSplit) {
// can split if selected batch is a leaf
@@ -1229,4 +1217,25 @@
return model.getSelectedSpecies();
}
+
+ protected SpeciesBatch convertRowToBean(SpeciesBatchRowModel row, boolean convertParent) {
+ SampleCategory<?> sampleCategory = row.getFinestCategory();
+ Preconditions.checkNotNull(sampleCategory);
+ Preconditions.checkNotNull(sampleCategory.getCategoryType());
+ Preconditions.checkNotNull(sampleCategory.getCategoryValue());
+
+ SpeciesBatch catchBean = row.toBean();
+
+ // apply sample category
+ catchBean.setSampleCategoryType(sampleCategory.getCategoryType());
+ catchBean.setSampleCategoryValue(sampleCategory.getCategoryValue());
+ catchBean.setSampleCategoryWeight(sampleCategory.getCategoryWeight());
+
+ if (convertParent && row.getParentBatch() != null) {
+ SpeciesBatch parent = convertRowToBean(row.getParentBatch(), true);
+ catchBean.setParentBatch(parent);
+ }
+
+ return catchBean;
+ }
}
1
0
r872 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/content java/fr/ifremer/tutti/ui/swing/util resources/i18n
by tchemit@users.forge.codelutin.com 23 Apr '13
by tchemit@users.forge.codelutin.com 23 Apr '13
23 Apr '13
Author: tchemit
Date: 2013-04-23 18:23:05 +0200 (Tue, 23 Apr 2013)
New Revision: 872
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/872
Log:
fixes #2351: [TECH] Message d'erreur quand d?\195?\169marrage sans r?\195?\169seau
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-04-23 15:36:33 UTC (rev 871)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-04-23 16:23:05 UTC (rev 872)
@@ -24,11 +24,13 @@
* #L%
*/
+import fr.ifremer.tutti.TuttiBusinessException;
import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig;
import fr.ifremer.tutti.ui.swing.content.MainUI;
import fr.ifremer.tutti.ui.swing.content.MainUIHandler;
import fr.ifremer.tutti.ui.swing.content.UpdateApplicationAction;
import fr.ifremer.tutti.ui.swing.util.TuttiExceptionHandler;
+import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper;
import jaxx.runtime.SwingUtil;
import org.apache.commons.logging.Log;
@@ -39,6 +41,8 @@
import java.awt.Color;
import java.util.Arrays;
+import static org.nuiton.i18n.I18n.n_;
+
/**
* To start Tutti application.
*
@@ -96,12 +100,25 @@
log.info("Full launch mode, try to update.");
}
- // try to update jre - i18n - application - help and exit if so
- UpdateApplicationAction logicAction = TuttiActionHelper.createLogicAction(new MainUIHandler(context),
- UpdateApplicationAction.class);
- TuttiActionHelper.runActionAndWait(logicAction);
+ boolean canUpdate = true;
+ try {
+ TuttiUIUtil.tryToConnectToUpdateUrl(
+ config.getUpdateUrl(),
+ n_("tutti.error.update.could.not.reach.url")
+ );
+ } catch (TuttiBusinessException e) {
+ TuttiUIContext.getErrorHelper().showErrorDialog(e.getMessage());
+ canUpdate = false;
+ }
- reload = logicAction.isReload();
+ if (canUpdate) {
+ // try to update jre - i18n - application - help and exit if so
+ UpdateApplicationAction logicAction = TuttiActionHelper.createLogicAction(new MainUIHandler(context),
+ UpdateApplicationAction.class);
+ TuttiActionHelper.runActionAndWait(logicAction);
+
+ reload = logicAction.isReload();
+ }
}
if (!reload) {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java 2013-04-23 15:36:33 UTC (rev 871)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java 2013-04-23 16:23:05 UTC (rev 872)
@@ -27,8 +27,11 @@
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import fr.ifremer.tutti.TuttiBusinessException;
import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack;
+import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig;
+import fr.ifremer.tutti.ui.swing.util.TuttiErrorHelper;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction;
import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper;
@@ -50,6 +53,7 @@
import java.util.Map;
import static org.nuiton.i18n.I18n._;
+import static org.nuiton.i18n.I18n.n_;
/**
* To show about panel.
@@ -68,7 +72,28 @@
super(handler, false);
}
+ protected boolean canUpdate;
+
@Override
+ protected boolean prepareAction() throws Exception {
+ TuttiUIContext context = getContext();
+ TuttiApplicationConfig config = context.getConfig();
+ String url = config.getUpdateUrl();
+
+ try {
+ TuttiUIUtil.tryToConnectToUpdateUrl(
+ url,
+ n_("tutti.error.about.could.not.reach.url"));
+ canUpdate = true;
+ } catch (TuttiBusinessException e) {
+ new TuttiErrorHelper(getContext()).showErrorDialog(e.getMessage());
+ canUpdate = false;
+ }
+
+ return super.prepareAction();
+ }
+
+ @Override
public void postSuccessAction() {
super.postSuccessAction();
@@ -146,12 +171,31 @@
about.getTabs().add(_("tutti.about.translate.title"), translatePane);
- //
- // update tab
- //
+ if (canUpdate) {
+ //
+ // update tab
+ //
+
+ addUpdateTab(config);
+
+ }
+ about.init();
+ }
+
+ protected void addUpdate(Map<String, ApplicationInfo> source,
+ Map<String, ApplicationInfo> target,
+ TuttiApplicationUpdaterCallBack.UpdateType... types) {
+ for (TuttiApplicationUpdaterCallBack.UpdateType type : types) {
+ String appName = type.name().toLowerCase();
+ ApplicationInfo info = source.get(appName);
+ target.put(appName, info);
+ }
+ }
+
+ protected void addUpdateTab(TuttiApplicationConfig config) {
+ File current = config.getTuttiBasedir();
String url = config.getUpdateUrl();
- File current = config.getTuttiBasedir();
ApplicationUpdater up = new ApplicationUpdater();
@@ -250,19 +294,6 @@
}
});
about.getTabs().add(_("tutti.about.update.title"), updatePane);
-
- about.init();
}
- protected void addUpdate(Map<String, ApplicationInfo> source,
- Map<String, ApplicationInfo> target,
- TuttiApplicationUpdaterCallBack.UpdateType... types) {
- for (TuttiApplicationUpdaterCallBack.UpdateType type : types) {
- String appName = type.name().toLowerCase();
- ApplicationInfo info = source.get(appName);
- target.put(appName, info);
- }
- }
-
-
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java 2013-04-23 15:36:33 UTC (rev 871)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java 2013-04-23 16:23:05 UTC (rev 872)
@@ -24,11 +24,14 @@
* #L%
*/
+import fr.ifremer.tutti.TuttiBusinessException;
import fr.ifremer.tutti.persistence.ProgressionModel;
import fr.ifremer.tutti.ui.swing.RunTutti;
import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig;
+import fr.ifremer.tutti.ui.swing.util.TuttiErrorHelper;
+import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction;
import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper;
import org.apache.commons.logging.Log;
@@ -38,6 +41,7 @@
import java.io.File;
import static org.nuiton.i18n.I18n._;
+import static org.nuiton.i18n.I18n.n_;
/**
* To update jre / i18n or tutti using the {@link ApplicationUpdater} mecanism.
@@ -69,6 +73,25 @@
protected boolean reload;
@Override
+ protected boolean prepareAction() throws Exception {
+ TuttiUIContext context = getContext();
+ TuttiApplicationConfig config = context.getConfig();
+ String url = config.getUpdateUrl();
+
+ try {
+ TuttiUIUtil.tryToConnectToUpdateUrl(
+ url,
+ n_("tutti.error.update.could.not.reach.url")
+ );
+ } catch (TuttiBusinessException e) {
+ new TuttiErrorHelper(getContext()).showErrorDialog(e.getMessage());
+ return false;
+ }
+
+ return super.prepareAction();
+ }
+
+ @Override
protected void releaseAction() {
super.releaseAction();
types = ALL_APPLICATION_TYPES;
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java 2013-04-23 15:36:33 UTC (rev 871)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java 2013-04-23 16:23:05 UTC (rev 872)
@@ -24,11 +24,14 @@
* #L%
*/
+import fr.ifremer.tutti.TuttiBusinessException;
import fr.ifremer.tutti.persistence.ProgressionModel;
import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack;
import fr.ifremer.tutti.ui.swing.TuttiUIContext;
import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig;
import fr.ifremer.tutti.ui.swing.content.db.OpenDbAction;
+import fr.ifremer.tutti.ui.swing.util.TuttiErrorHelper;
+import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -37,6 +40,7 @@
import java.io.File;
import static org.nuiton.i18n.I18n._;
+import static org.nuiton.i18n.I18n.n_;
/**
* To update - install database.
@@ -56,6 +60,25 @@
}
@Override
+ protected boolean prepareAction() throws Exception {
+ TuttiUIContext context = getContext();
+ TuttiApplicationConfig config = context.getConfig();
+ String url = config.getUpdateUrl();
+
+ try {
+ TuttiUIUtil.tryToConnectToUpdateUrl(
+ url,
+ n_("tutti.error.update.could.not.reach.url")
+ );
+ } catch (TuttiBusinessException e) {
+ new TuttiErrorHelper(getContext()).showErrorDialog(e.getMessage());
+ return false;
+ }
+
+ return super.prepareAction();
+ }
+
+ @Override
protected void doAction() {
TuttiUIContext context = getContext();
TuttiApplicationConfig config = context.getConfig();
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java 2013-04-23 15:36:33 UTC (rev 871)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java 2013-04-23 16:23:05 UTC (rev 872)
@@ -25,6 +25,7 @@
*/
import com.google.common.base.Preconditions;
+import fr.ifremer.tutti.TuttiBusinessException;
import fr.ifremer.tutti.TuttiTechnicalException;
import jaxx.runtime.FileChooserUtil;
import jaxx.runtime.JAXXBinding;
@@ -45,10 +46,11 @@
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeListenerProxy;
import java.io.File;
+import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
-import java.net.URLEncoder;
+import java.net.URLConnection;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
@@ -350,4 +352,17 @@
}
}
+ public static void tryToConnectToUpdateUrl(String url, String i18nKey) {
+ try {
+ URLConnection urlConnection = new URL(url).openConnection();
+ urlConnection.setConnectTimeout(5000);
+ urlConnection.connect();
+ } catch (IOException e) {
+ if (log.isErrorEnabled()) {
+ log.error("Could not connect to " + url, e);
+ }
+ // could not connect to
+ throw new TuttiBusinessException(_(i18nKey, url));
+ }
+ }
}
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-23 15:36:33 UTC (rev 871)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-23 16:23:05 UTC (rev 872)
@@ -811,9 +811,11 @@
tutti.editSpeciesFrequencies.table.header.number=
tutti.editSpeciesFrequencies.table.header.weight=
tutti.editSpeciesFrequencies.title=
+tutti.error.about.could.not.reach.url=
tutti.error.errorpane.htmlmessage=
tutti.error.ui.business.error=
tutti.error.ui.other.error=
+tutti.error.update.could.not.reach.url=
tutti.exportCruise.action.success=
tutti.exportCruiseForSumatra.action.chooseFile=
tutti.exportCruiseForSumatra.action.success=
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-23 15:36:33 UTC (rev 871)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-23 16:23:05 UTC (rev 872)
@@ -798,9 +798,11 @@
tutti.editSpeciesFrequencies.table.header.number=Nombre
tutti.editSpeciesFrequencies.table.header.weight=Poids observé (kg)
tutti.editSpeciesFrequencies.title=Mensuration
+tutti.error.about.could.not.reach.url=Récupération des versions de mises à jour impossible (l'url %s n'est pas joignable)
tutti.error.errorpane.htmlmessage=<html><body><b>Une erreur s'est produite</b>\:<br/>%s</body></html>
tutti.error.ui.business.error=Erreur
tutti.error.ui.other.error=Erreur
+tutti.error.update.could.not.reach.url=Mise à jour impossible (l'url %s n'est pas joignable)
tutti.exportCruise.action.success=La campagne <strong>%s</strong> a été exportée dans le fichier <strong>%s</strong>.
tutti.exportCruiseForSumatra.action.chooseFile=Choisir le fichier d'export
tutti.exportCruiseForSumatra.action.success=Les captures ont correctement été exporté dans le fichier %s
1
0
r871 - trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/config
by tchemit@users.forge.codelutin.com 23 Apr '13
by tchemit@users.forge.codelutin.com 23 Apr '13
23 Apr '13
Author: tchemit
Date: 2013-04-23 17:36:33 +0200 (Tue, 23 Apr 2013)
New Revision: 871
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/871
Log:
fixes #2352: [TECH] Probl?\195?\168me avec le fichier conf.properties lors du d?\195?\169placement du r?\195?\169pertoire
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceConfig.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceConfig.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceConfig.java 2013-04-23 09:43:37 UTC (rev 870)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceConfig.java 2013-04-23 15:36:33 UTC (rev 871)
@@ -183,7 +183,9 @@
public void generateExternalDbFiles(boolean force) {
try {
- generateDbConfiguration(force);
+ // always generate db configuration file
+ // see http://forge.codelutin.com/issues/2352
+ generateDbConfiguration(true);
} catch (IOException e) {
throw new TuttiTechnicalException("Could not generate db configuration file");
1
0
r870 - in trunk: . tutti-persistence tutti-service tutti-ui-swing
by maven-release@users.forge.codelutin.com 23 Apr '13
by maven-release@users.forge.codelutin.com 23 Apr '13
23 Apr '13
Author: maven-release
Date: 2013-04-23 11:43:37 +0200 (Tue, 23 Apr 2013)
New Revision: 870
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/870
Log:
[maven-release-plugin] prepare for next development iteration
Modified:
trunk/pom.xml
trunk/tutti-persistence/pom.xml
trunk/tutti-service/pom.xml
trunk/tutti-ui-swing/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2013-04-23 09:43:29 UTC (rev 869)
+++ trunk/pom.xml 2013-04-23 09:43:37 UTC (rev 870)
@@ -33,7 +33,7 @@
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0</version>
+ <version>2.0.1-SNAPSHOT</version>
<modules>
<module>tutti-persistence</module>
@@ -89,12 +89,12 @@
</developers>
<scm>
- <url>http://svn.forge.codelutin.com/svn/tutti/tags/tutti-2.0</url>
+ <url>http://svn.forge.codelutin.com/svn/tutti/trunk</url>
<connection>
- scm:svn:http://svn.forge.codelutin.com/svn/tutti/tags/tutti-2.0
+ scm:svn:http://svn.forge.codelutin.com/svn/tutti/trunk
</connection>
<developerConnection>
- scm:svn:http://svn.forge.codelutin.com/svn/tutti/tags/tutti-2.0
+ scm:svn:http://svn.forge.codelutin.com/svn/tutti/trunk
</developerConnection>
</scm>
Modified: trunk/tutti-persistence/pom.xml
===================================================================
--- trunk/tutti-persistence/pom.xml 2013-04-23 09:43:29 UTC (rev 869)
+++ trunk/tutti-persistence/pom.xml 2013-04-23 09:43:37 UTC (rev 870)
@@ -28,7 +28,7 @@
<parent>
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0</version>
+ <version>2.0.1-SNAPSHOT</version>
</parent>
<groupId>fr.ifremer.tutti</groupId>
Modified: trunk/tutti-service/pom.xml
===================================================================
--- trunk/tutti-service/pom.xml 2013-04-23 09:43:29 UTC (rev 869)
+++ trunk/tutti-service/pom.xml 2013-04-23 09:43:37 UTC (rev 870)
@@ -28,7 +28,7 @@
<parent>
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0</version>
+ <version>2.0.1-SNAPSHOT</version>
</parent>
<groupId>fr.ifremer.tutti</groupId>
Modified: trunk/tutti-ui-swing/pom.xml
===================================================================
--- trunk/tutti-ui-swing/pom.xml 2013-04-23 09:43:29 UTC (rev 869)
+++ trunk/tutti-ui-swing/pom.xml 2013-04-23 09:43:37 UTC (rev 870)
@@ -28,7 +28,7 @@
<parent>
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0</version>
+ <version>2.0.1-SNAPSHOT</version>
</parent>
<groupId>fr.ifremer.tutti</groupId>
1
0
Author: maven-release
Date: 2013-04-23 11:43:29 +0200 (Tue, 23 Apr 2013)
New Revision: 869
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/869
Log:
[maven-release-plugin] copy for tag tutti-2.0
Added:
tags/tutti-2.0/
1
0
r868 - in trunk: . tutti-persistence tutti-service tutti-ui-swing
by maven-release@users.forge.codelutin.com 23 Apr '13
by maven-release@users.forge.codelutin.com 23 Apr '13
23 Apr '13
Author: maven-release
Date: 2013-04-23 11:43:21 +0200 (Tue, 23 Apr 2013)
New Revision: 868
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/868
Log:
[maven-release-plugin] prepare release tutti-2.0
Modified:
trunk/pom.xml
trunk/tutti-persistence/pom.xml
trunk/tutti-service/pom.xml
trunk/tutti-ui-swing/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2013-04-23 09:39:47 UTC (rev 867)
+++ trunk/pom.xml 2013-04-23 09:43:21 UTC (rev 868)
@@ -33,7 +33,7 @@
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0-SNAPSHOT</version>
+ <version>2.0</version>
<modules>
<module>tutti-persistence</module>
@@ -89,12 +89,12 @@
</developers>
<scm>
- <url>http://svn.forge.codelutin.com/svn/tutti/trunk</url>
+ <url>http://svn.forge.codelutin.com/svn/tutti/tags/tutti-2.0</url>
<connection>
- scm:svn:http://svn.forge.codelutin.com/svn/tutti/trunk
+ scm:svn:http://svn.forge.codelutin.com/svn/tutti/tags/tutti-2.0
</connection>
<developerConnection>
- scm:svn:http://svn.forge.codelutin.com/svn/tutti/trunk
+ scm:svn:http://svn.forge.codelutin.com/svn/tutti/tags/tutti-2.0
</developerConnection>
</scm>
Modified: trunk/tutti-persistence/pom.xml
===================================================================
--- trunk/tutti-persistence/pom.xml 2013-04-23 09:39:47 UTC (rev 867)
+++ trunk/tutti-persistence/pom.xml 2013-04-23 09:43:21 UTC (rev 868)
@@ -28,7 +28,7 @@
<parent>
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0-SNAPSHOT</version>
+ <version>2.0</version>
</parent>
<groupId>fr.ifremer.tutti</groupId>
Modified: trunk/tutti-service/pom.xml
===================================================================
--- trunk/tutti-service/pom.xml 2013-04-23 09:39:47 UTC (rev 867)
+++ trunk/tutti-service/pom.xml 2013-04-23 09:43:21 UTC (rev 868)
@@ -28,7 +28,7 @@
<parent>
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0-SNAPSHOT</version>
+ <version>2.0</version>
</parent>
<groupId>fr.ifremer.tutti</groupId>
Modified: trunk/tutti-ui-swing/pom.xml
===================================================================
--- trunk/tutti-ui-swing/pom.xml 2013-04-23 09:39:47 UTC (rev 867)
+++ trunk/tutti-ui-swing/pom.xml 2013-04-23 09:43:21 UTC (rev 868)
@@ -28,7 +28,7 @@
<parent>
<groupId>fr.ifremer</groupId>
<artifactId>tutti</artifactId>
- <version>2.0-SNAPSHOT</version>
+ <version>2.0</version>
</parent>
<groupId>fr.ifremer.tutti</groupId>
1
0
Author: tchemit
Date: 2013-04-23 11:39:47 +0200 (Tue, 23 Apr 2013)
New Revision: 867
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/867
Log:
update documentation
Modified:
trunk/src/site/rst/features.rst
trunk/src/site/rst/mapping.rst
Modified: trunk/src/site/rst/features.rst
===================================================================
--- trunk/src/site/rst/features.rst 2013-04-23 09:22:23 UTC (rev 866)
+++ trunk/src/site/rst/features.rst 2013-04-23 09:39:47 UTC (rev 867)
@@ -43,9 +43,52 @@
- Installer une base à partir d'une url distante via le mécanisme de mise à jour
intégré.
-- Mise à jour automatique via le mécanisme de mise à jour intégré.
-- Exporter la base de travail (sous forme d'archive zip).
+- Mise à jour automatique via le mécanisme de mise à jour intégré (mis à jour des référentiels).
+- Exporter les données de Tutti (base de travail / protocols / pièces-jointes) (sous forme d'archive zip).
+- Exporter les données de Tutti puis les supprimer , permet alors de pouvoir installer une nouvelle base ou importer des données de Tutti.
+- Import les données de Tuttii : permet d'importer les données d'une autre instance de Tutti précedemment exportées.
+Le format de l'archive d'un export est le suivant :
+
+::
+
+ tutti-2.0-SNAPSHOT-2013-04-23/
+ |-- db
+ | |-- allegro.backup
+ | |-- allegro.data
+ | |-- allegro.log
+ | |-- allegro.properties
+ | |-- allegro.script
+ | `-- version.appup
+ |-- meas_files
+ | |-- CATCH_BATCH
+ | | |-- OBJ100000
+ | | | |-- CATCH_BATCH-OBJ100000-100005.tnk
+ | | | `-- CATCH_BATCH-OBJ100000-100006.car
+ | | `-- OBJ100003
+ | |-- OPERATION
+ | | `-- OBJ100000
+ | | |-- OPERATION-OBJ100000-100000.dat
+ | | `-- OPERATION-OBJ100000-100007.dat
+ | `-- SAMPLE
+ | |-- OBJ100000
+ | | `-- SAMPLE-OBJ100000-100002.asc
+ | |-- OBJ100015
+ | | `-- SAMPLE-OBJ100015-100001.dat
+ | |-- OBJ100018
+ | | `-- SAMPLE-OBJ100018-100002.dat
+ | |-- OBJ100022
+ | | `-- SAMPLE-OBJ100022-100003.dat
+ | `-- OBJ100040
+ | `-- SAMPLE-OBJ100040-100004.dat
+ `-- protocol
+ |-- 194016f4-3bea-40a2-aea2-792401b9f3c9.tuttiProtocol
+ `-- 54f6cb48-2463-4212-9e9b-5849db109acc.tuttiProtocol
+
+Pour le moment si vous voulez importer une base sans les autres données
+(pièces-jointes / protocole), il vous suffit alors simplement de créer une
+archive zip qui respecte ce format.
+
Pour utiliser ces fonctionnalités, rendez-vous sur l'écran **Gestionnaire de base**
(Menu fichier -> Gestionnaire de base).
Modified: trunk/src/site/rst/mapping.rst
===================================================================
--- trunk/src/site/rst/mapping.rst 2013-04-23 09:22:23 UTC (rev 866)
+++ trunk/src/site/rst/mapping.rst 2013-04-23 09:39:47 UTC (rev 867)
@@ -304,7 +304,6 @@
MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
MeasurementFile.name : nom
MeasurementFile.comments : commentaire
- **WARNING** : modification de modèle à faire pour pouvoir avoir MEASUREMENT_FILE.PMFM_FK=null
Capture > Espèces
~~~~~~~~~~~~~~~~~
@@ -329,7 +328,6 @@
MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
MeasurementFile.name : nom
MeasurementFile.comments : commentaire
- **WARNING** : modification de modèle à faire pour pouvoir avoir MEASUREMENT_FILE.PMFM_FK=null
Tableau
Chaque ligne du tableau est stockée sous la forme d'un lot (Batch) positionné
@@ -376,7 +374,6 @@
MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif ?)
MeasurementFile.name : nom
MeasurementFile.comments : commentaire
- **WARNING** : modification de modèle à faire pour pouvoir avoir MEASUREMENT_FILE.PMFM_FK=null
Mensuration > Type de mesure
Dupliqué pour chaque lot de mensuration créé (un lot pour chaque taille saisie)
@@ -422,7 +419,6 @@
MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
MeasurementFile.name : nom
MeasurementFile.comments : commentaire
- **WARNING** : modification de modèle à faire pour pouvoir avoir MEASUREMENT_FILE.PMFM_FK=null
Tableau
Chaque ligne du tableau est stockée sous la forme d'un lot (Batch) positionné
@@ -469,7 +465,6 @@
MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
MeasurementFile.name : nom
MeasurementFile.comments : commentaire
- **WARNING** : modification de modèle à faire pour pouvoir avoir MEASUREMENT_FILE.PMFM_FK=null
Mensuration > Type de mesure
Dupliqué pour chaque lot de mensuration créé (un lot pour chaque taille saisie)
@@ -492,5 +487,128 @@
Mensuration > Tableau > Poids observé
Batch.quantificationMeasurement.numericalValue (QUANTIFICATION_MEASUREMENT.NUMERICAL_VALUE avec IS_REFERENT=1)
+Capture > Macro déchets
+~~~~~~~~~~~~~~~~~~~~~~~
+Macro-dechets > Poids total
+ Lot "Capture > Hors Vrac > Macro déchets"
+ Batch.quantificationMeasurement.numericalValue (QUANTIFICATION_MEASUREMENT.NUMERICAL_VALUE avec IS_REFERENT=1 et PMFM_FK=<PmfmId.WEIGHT_OBSERVED>)
+
+Pièces Jointes
+ Chaque pièce jointes est stockée dans MeasurementFile
+ (MEASUREMENT_FILE avec PMFM_FK=null, OBJECT_TYPE_FK='CATCH_BATCH' et OBJECT_ID=<ID du lot HORS VRAC > Macro déchets>)
+ MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
+ MeasurementFile.name : nom
+ MeasurementFile.comments : commentaire
+
+Tableau
+ Chaque ligne du tableau est stockée sous la forme d'un lot (Batch) positionné
+ soit sous le lot "Capture > Vrac > Benthos"
+ soit sous "Capture > Hors Vrac > Benthos"
+
+Tableau > Catégorie
+ Batch.sortingMeasurement.qualitativeValue (SORTING_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.MARINE_LITTER_TYPE>)
+
+Tableau > Catégorie de taille
+ Batch.sortingMeasurement.qualitativeValue (SORTING_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.MARINE_LITTER_SIZE_CATEGORY>)
+
+Tableau > Nombre
+ Batch.quantificationMeasurement.qualitativeValue (QUANTIFICATION_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.SIZE_CATEGORY>)
+
+Tableau > Poids
+ Batch.individualCount
+
+Tableau > Commentaire
+ Batch.comments
+
+Tableau > Pièces Jointes
+ Chaque pièce jointes est stockée dans MeasurementFile
+ (MEASUREMENT_FILE avec PMFM_FK=null, OBJECT_TYPE_FK='SAMPLE' et OBJECT_ID=<ID du lot de la ligne du tableau>)
+ MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
+ MeasurementFile.name : nom
+ MeasurementFile.comments : commentaire
+
+Capture > Captures accidentelles
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Utilisation table *Sample* et *SampleMeasurement*
+
+Tableau
+ Chaque ligne du tableau est stockée sous la forme d'un prélèvement (Sample).
+
+Tableau > Espèce
+ Sample.referenceTaxon
+
+Tableau > Sexe
+ Sample.sampleMeasurements.qualitativeValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.SEX>)
+
+Tableau > Poids observé (kg)
+ Sample.sampleMeasurements.numericalValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.WEIGHT_OBSERVED>)
+
+Tableau > Taille
+ Sample.sampleMeasurements.numericalValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.>)
+
+Tableau > Classe de taille
+ Sample.sampleMeasurements.qualitativeValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.>)
+
+Tableau > Mort ou vivant
+ Sample.sampleMeasurements.qualitativeValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.>)
+
+Tableau > Autres caractéristiques
+ Tableau avec une entrée dans Sample.sampleMeasurements pour le pmfm choisi
+
+Tableau > Commentaire
+ Batch.comments
+
+Tableau > Pièces Jointes
+ Chaque pièce jointes est stockée dans MeasurementFile
+ (MEASUREMENT_FILE avec PMFM_FK=null, OBJECT_TYPE_FK='SAMPLE' et OBJECT_ID=<ID du lot de la ligne du tableau>)
+ MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
+ MeasurementFile.name : nom
+ MeasurementFile.comments : commentaire
+
+Capture > Données individuelles
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Utilisation table *Sample*
+
+Utilisation table *Sample*
+
+Tableau
+ Chaque ligne du tableau est stockée sous la forme d'un prélèvement (Sample).
+
+Tableau > Espèce
+ Sample.referenceTaxon
+
+Tableau > Poids (g)
+ Sample.sampleMeasurements.numericalValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.WEIGHT_OBSERVED>)
+
+Tableau > Taille
+ Sample.sampleMeasurements.numericalValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.SEX>)
+
+Tableau > Classe de taille
+ Sample.sampleMeasurements.qualitativeValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=(celui choisi))
+
+Tableau > Mort ou vivant
+ Sample.sampleMeasurements.qualitativeValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.DEAD_OR_ALIVE>)
+
+Tableau > Autres caractéristiques
+ Tableau avec une entrée dans Sample.sampleMeasurements pour le pmfm choisi
+
+Tableau > Code prélèvement pièce calcifiée
+ Sample.sampleMeasurements.alphanumericalValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.OTOLITHE_ID>)
+
+Tableau > Code prélèvement autre
+ Sample.sampleMeasurements.alphanumericalValue (SAMPLE_MEASUREMENT.QUALITATIVE_VALUE_FK avec PMFM_FK=<PmfmId.SAMPLE_ID>)
+
+Tableau > Commentaire
+ Batch.comments
+
+Tableau > Pièces Jointes
+ Chaque pièce jointes est stockée dans MeasurementFile
+ (MEASUREMENT_FILE avec PMFM_FK=null, OBJECT_TYPE_FK='SAMPLE' et OBJECT_ID=<ID du lot de la ligne du tableau>)
+ MeasurementFile.path : chemin du fichier (copier dans un répertoire, puis stocké en relatif)
+ MeasurementFile.name : nom
+ MeasurementFile.comments : commentaire
+
.. _détail des requêtes: referential.html
\ No newline at end of file
1
0
r866 - trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service
by kmorin@users.forge.codelutin.com 23 Apr '13
by kmorin@users.forge.codelutin.com 23 Apr '13
23 Apr '13
Author: kmorin
Date: 2013-04-23 11:22:23 +0200 (Tue, 23 Apr 2013)
New Revision: 866
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/866
Log:
fixme http://forge.codelutin.com/issues/2350
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-04-23 08:42:40 UTC (rev 865)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-04-23 09:22:23 UTC (rev 866)
@@ -48,6 +48,7 @@
import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation;
import fr.ifremer.tutti.persistence.entities.referential.TuttiReferentialEntity;
import fr.ifremer.tutti.persistence.entities.referential.Vessel;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
@@ -383,7 +384,10 @@
Cache referentSpeciesByIdCache = cacheService.getCache("referentSpeciesById");
for (TaxonRefVO source : sources) {
Species target = loadSpecies(source);
- target.setRefTaxCode(target.getExternalCode());
+
+ // FIXME kmorin 20130423 http://forge.codelutin.com/issues/2350
+ target.setRefTaxCode(StringUtils.trim(target.getExternalCode()));
+
if (target.isReferenceTaxon()) {
// Add to cache :
@@ -410,8 +414,10 @@
Cache referentSpeciesByIdCache = cacheService.getCache("referentSpeciesById");
for (TaxonRefVO source : sources) {
Species target = loadSpecies(source);
- target.setRefTaxCode(target.getExternalCode());
+ // FIXME kmorin 20130423 http://forge.codelutin.com/issues/2350
+ target.setRefTaxCode(StringUtils.trim(target.getExternalCode()));
+
// Add to cache :
referentSpeciesByIdCache.put(target.getReferenceTaxonId(), target);
1
0