Author: chatellier Date: 2011-03-18 11:26:06 +0000 (Fri, 18 Mar 2011) New Revision: 788 Log: Fix double with exponent and fixed decimal count check Modified: trunk/changelog.txt trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserDoubleValidator.java trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-fatal-validation.xml trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-warning-validation.xml trunk/coser-business/src/test/java/fr/ifremer/coser/services/ControlServiceTest.java Modified: trunk/changelog.txt =================================================================== --- trunk/changelog.txt 2011-03-18 11:25:37 UTC (rev 787) +++ trunk/changelog.txt 2011-03-18 11:26:06 UTC (rev 788) @@ -4,9 +4,9 @@ 1.0.3 ----- + * Fix double with exponent and fixed decimal count check * Fix selection comment reload * Remove replay selection menu - * Allow "e" in double check for lat, long and swept surface * Set english website help link to correct locale * Fix filter ui layout * Add control about surface attributes to be positive only Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java 2011-03-18 11:25:37 UTC (rev 787) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java 2011-03-18 11:26:06 UTC (rev 788) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2010 - 2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -25,10 +25,15 @@ package fr.ifremer.coser.validators; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang.StringUtils; + import com.opensymphony.xwork2.validator.ValidationException; /** - * Validateur de double de coser. + * Validateur de double de coser en tant que string. * * @author chatellier * @version $Revision$ @@ -38,8 +43,20 @@ */ public class CoserCheckDoubleValidator extends AbstractFieldValidator { + /** + * Pattern pour un double + * - group0 => all double + * - group1 => .xxxx + * - group2 => xxxx (after .) + * - group3 => exposant with e + * - group4 => exposant without e + */ + protected static final Pattern DOUBLE_PATTERN = Pattern.compile("^[0-9]+(\\.([0-9]+))?(e(\\-?[0-9]+))?$"); + protected String notAvailable; + protected Integer minDecimals; + public String getNotAvailable() { return notAvailable; } @@ -48,6 +65,14 @@ this.notAvailable = notAvailable; } + public Integer getMinDecimals() { + return minDecimals; + } + + public void setMinDecimals(Integer minDecimals) { + this.minDecimals = minDecimals; + } + public void validate(Object object) throws ValidationException { Object obj = getFieldValue(getFieldName(), object); String value = (String) obj; @@ -62,7 +87,26 @@ if (notAvailable != null && notAvailable.equals(value)) { return; } + + if (minDecimals != null) { + Matcher matcher = DOUBLE_PATTERN.matcher(value); + if (matcher.find()) { + int decimaleSize = StringUtils.length(matcher.group(2)); + int exposant = 0; + if (matcher.group(4) != null) { + exposant = Integer.parseInt(matcher.group(4)); + } + // 5.44e-2 => 2 - (-2) => 4 < minDecimale + if (decimaleSize - exposant < minDecimals) { + addFieldError(getFieldName(), object); + } + } + else { + addFieldError(getFieldName(), object); + } + } + try { Double.parseDouble(value); } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserDoubleValidator.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserDoubleValidator.java 2011-03-18 11:25:37 UTC (rev 787) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserDoubleValidator.java 2011-03-18 11:26:06 UTC (rev 788) @@ -28,7 +28,7 @@ import com.opensymphony.xwork2.validator.ValidationException; /** - * TODO add comment here. + * Coser double validator. * * @author chatellier * @version $Revision$ Modified: trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-fatal-validation.xml =================================================================== --- trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-fatal-validation.xml 2011-03-18 11:25:37 UTC (rev 787) +++ trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-fatal-validation.xml 2011-03-18 11:26:06 UTC (rev 788) @@ -27,8 +27,8 @@ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="sweptSurface"> - <field-validator type="regex"> - <param name="expression">(\-?[0-9]+\.[0-9]{3,})|([0-9]+(\.[0-9]+)?e\-?[0-9]+?)</param> + <field-validator type="checkDouble"> + <param name="minDecimals">3</param> <message>sweptSurface must contain at least 3 decimals</message> </field-validator> </field> Modified: trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-warning-validation.xml =================================================================== --- trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-warning-validation.xml 2011-03-18 11:25:37 UTC (rev 787) +++ trunk/coser-business/src/main/resources/validators/fr/ifremer/coser/data/Haul-warning-validation.xml 2011-03-18 11:26:06 UTC (rev 788) @@ -27,14 +27,14 @@ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="lat"> - <field-validator type="regex"> - <param name="expression">(\-?[0-9]+\.[0-9]{4,})|([0-9]+(\.[0-9]+)?e\-?[0-9]+?)</param> + <field-validator type="checkDouble"> + <param name="minDecimals">4</param> <message>lat must contain at least 4 decimals</message> </field-validator> </field> <field name="long"> - <field-validator type="regex"> - <param name="expression">(\-?[0-9]+\.[0-9]{4,})|([0-9]+(\.[0-9]+)?e\-?[0-9]+?)</param> + <field-validator type="checkDouble"> + <param name="minDecimals">4</param> <message>long must contain at least 4 decimals</message> </field-validator> </field> Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ControlServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ControlServiceTest.java 2011-03-18 11:25:37 UTC (rev 787) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ControlServiceTest.java 2011-03-18 11:26:06 UTC (rev 788) @@ -102,20 +102,31 @@ } /** - * Test que certains double ont 5 decimales de définie. + * Test que certains double ont 3 ou 5 decimales de définie. */ @Test public void test5DecimalValidation() { Haul haulBean = new Haul(); + + // "Survey","Year","Haul","Month","Stratum","SweptSurface","Lat","Long","Depth" + + // erreur , pas assez de décimale haulBean.setData(new String[]{"1", "COSER_TEST","2010","TRAIT3","10","STR3","0.06","43.89","1.73","115.00"}); List<ControlError> errors = controlService.validate(haulBean, Category.HAUL); Assert.assertEquals(3, errors.size()); + // pas d'erreur, assez de décimales haulBean.setData(new String[]{"1","COSER_TEST","2010","TRAIT3","10","STR3","0.06000","43.89000","1.73234","115.00"}); errors = controlService.validate(haulBean, Category.HAUL); Assert.assertTrue(errors.isEmpty()); + + // erreur, exposant incorrect + haulBean.setData(new String[]{"1","COSER_TEST","2010","TRAIT3","10","STR3","6e-2","4.3e1","1.14564e3","115.00"}); + errors = controlService.validate(haulBean, Category.HAUL); + Assert.assertEquals(3, errors.size()); - haulBean.setData(new String[]{"1","COSER_TEST","2010","TRAIT3","10","STR3","6e-4","4.3e1","1.14564e3","115.00"}); + // pas d'erreur, exposant correct + haulBean.setData(new String[]{"1","COSER_TEST","2010","TRAIT3","10","STR3","6e-4","4.3e-3","1.14564e0","115.00"}); errors = controlService.validate(haulBean, Category.HAUL); Assert.assertTrue(errors.isEmpty()); }