You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/10/28 14:13:53 UTC

syncope git commit: [SYNCOPE-717] Fixing locale issue with conversion pattern on core, replacing SpinnerFieldPanel with new AjaxDoubleFieldPanel on console

Repository: syncope
Updated Branches:
  refs/heads/1_2_X 893d88901 -> 5954e2e7d


[SYNCOPE-717] Fixing locale issue with conversion pattern on core, replacing SpinnerFieldPanel with new AjaxDoubleFieldPanel on console


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/5954e2e7
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/5954e2e7
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/5954e2e7

Branch: refs/heads/1_2_X
Commit: 5954e2e7d44878c0f87d594140f6cc42146ad5c3
Parents: 893d889
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Oct 28 14:13:40 2015 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Oct 28 14:13:40 2015 +0100

----------------------------------------------------------------------
 .../console/pages/panels/AttributesPanel.java   |   7 +-
 .../markup/html/form/AjaxDoubleFieldPanel.java  | 196 +++++++++++++++++++
 .../wicket/markup/html/form/FieldPanel.java     |   2 +-
 .../console/SyncopeApplication.properties       |   1 +
 .../console/SyncopeApplication_it.properties    |   1 +
 .../console/SyncopeApplication_pt_BR.properties |   1 +
 .../markup/html/form/AjaxDoubleFieldPanel.html  |  23 +++
 .../apache/syncope/core/util/DataFormat.java    |   6 +-
 .../syncope/core/rest/RoleTestITCase.java       |  43 ++++
 pom.xml                                         |   1 +
 10 files changed, 275 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java
----------------------------------------------------------------------
diff --git a/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java b/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java
index da97a45..8e44f85 100644
--- a/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java
+++ b/console/src/main/java/org/apache/syncope/console/pages/panels/AttributesPanel.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.console.pages.panels;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
@@ -28,7 +27,6 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -52,6 +50,7 @@ import org.apache.syncope.console.rest.ConfigurationRestClient;
 import org.apache.syncope.console.rest.RoleRestClient;
 import org.apache.syncope.console.rest.SchemaRestClient;
 import org.apache.syncope.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.console.wicket.markup.html.form.AjaxDoubleFieldPanel;
 import org.apache.syncope.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.console.wicket.markup.html.form.BinaryFieldPanel;
@@ -318,8 +317,8 @@ public class AttributesPanel extends Panel {
                 break;
 
             case Double:
-                panel = new SpinnerFieldPanel<Double>("panel", schemaTO.getName(),
-                        Double.class, new Model<Double>(), null, null);
+                panel = new AjaxDoubleFieldPanel("panel", schemaTO.getName(), schemaTO.getConversionPattern(),
+                        new Model<Double>());
 
                 if (required) {
                     panel.addRequiredLabel();

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.java
----------------------------------------------------------------------
diff --git a/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.java b/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.java
new file mode 100644
index 0000000..a5f8129
--- /dev/null
+++ b/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.java
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.console.wicket.markup.html.form;
+
+import java.io.Serializable;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.ParseException;
+import java.util.List;
+import java.util.Locale;
+import java.util.regex.Pattern;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.console.SyncopeSession;
+import org.apache.syncope.console.commons.Constants;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+public class AjaxDoubleFieldPanel extends FieldPanel<Double> {
+
+    private static final long serialVersionUID = 935151916638207380L;
+
+    private static final Pattern ENGLISH_DOUBLE_PATTERN = Pattern.compile("\\d+\\.\\d+");
+
+    private static final Pattern OTHER_DOUBLE_PATTERN = Pattern.compile("\\d+,\\d+");
+
+    private final String name;
+
+    private final Pattern pattern;
+
+    private final DecimalFormat englishDf;
+
+    private final DecimalFormat localeDf;
+
+    public AjaxDoubleFieldPanel(
+            final String id, final String name, final String conversionPattern, final IModel<Double> model) {
+
+        super(id, model);
+
+        this.name = name;
+
+        this.pattern = SyncopeSession.get().getLocale().equals(Locale.ENGLISH)
+                ? ENGLISH_DOUBLE_PATTERN
+                : OTHER_DOUBLE_PATTERN;
+
+        englishDf = new DecimalFormat();
+        englishDf.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
+        if (StringUtils.isNotBlank(conversionPattern)) {
+            englishDf.applyPattern(conversionPattern);
+        }
+        localeDf = new DecimalFormat();
+        localeDf.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(SyncopeSession.get().getLocale()));
+        if (StringUtils.isNotBlank(conversionPattern)) {
+            localeDf.applyPattern(conversionPattern);
+        }
+
+        field = new TextField<Double>("doubleField", model) {
+
+            private static final long serialVersionUID = -378877047108711669L;
+
+            @Override
+            protected void convertInput() {
+                if (StringUtils.isNotBlank(getInput())) {
+                    if (pattern.matcher(getInput()).matches()) {
+                        Double value;
+                        try {
+                            value = localeDf.parse(getInput()).doubleValue();
+                            setConvertedInput(value);
+                        } catch (ParseException e) {
+                            error(name + ": " + getString("textField.DoubleValidator"));
+                        }
+                    } else {
+                        error(name + ": " + getString("textField.DoubleValidator"));
+                    }
+                }
+            }
+        };
+        add(field.setLabel(new Model<String>(name)).setOutputMarkupId(true));
+
+        if (!isReadOnly()) {
+            field.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                private static final long serialVersionUID = -1107858522700306810L;
+
+                @Override
+                protected void onUpdate(final AjaxRequestTarget target) {
+                    // nothing to do
+                }
+            });
+        }
+    }
+
+    @Override
+    public FieldPanel<Double> addRequiredLabel() {
+        if (!isRequired()) {
+            setRequired(true);
+        }
+
+        this.isRequiredLabelAdded = true;
+
+        return this;
+    }
+
+    @Override
+    public FieldPanel<Double> setNewModel(final List<Serializable> list) {
+        setNewModel(new Model<Double>() {
+
+            private static final long serialVersionUID = 527651414610325237L;
+
+            @Override
+            public Double getObject() {
+                Double value = null;
+
+                if (list != null && !list.isEmpty()) {
+                    try {
+                        value = englishDf.parse(list.get(0).toString()).doubleValue();
+                    } catch (ParseException e) {
+                        error(name + ": " + getString("textField.DoubleValidator"));
+                    }
+                }
+
+                return value;
+            }
+
+            @Override
+            public void setObject(final Double object) {
+                list.clear();
+                if (object != null) {
+                    list.add(englishDf.format(object));
+                }
+            }
+        });
+
+        return this;
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public FieldPanel<Double> setNewModel(final ListItem item) {
+        IModel<Double> model = new Model<Double>() {
+
+            private static final long serialVersionUID = 6799404673615637845L;
+
+            @Override
+            public Double getObject() {
+                Double value = null;
+
+                final Object obj = item.getModelObject();
+
+                if (obj != null && !obj.toString().isEmpty()) {
+                    if (obj instanceof String) {
+                        try {
+                            value = englishDf.parse(obj.toString()).doubleValue();
+                        } catch (ParseException e) {
+                            error(name + ": " + getString("textField.DoubleValidator"));
+                        }
+                    } else if (obj instanceof Double) {
+                        // Don't parse anything
+                        value = (Double) obj;
+                    }
+                }
+
+                return value;
+            }
+
+            @Override
+            @SuppressWarnings("unchecked")
+            public void setObject(final Double object) {
+                item.setModelObject(englishDf.format(object));
+            }
+        };
+
+        field.setModel(model);
+        return this;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/FieldPanel.java
----------------------------------------------------------------------
diff --git a/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/FieldPanel.java b/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/FieldPanel.java
index 967f369..ae02f87 100644
--- a/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/FieldPanel.java
+++ b/console/src/main/java/org/apache/syncope/console/wicket/markup/html/form/FieldPanel.java
@@ -126,7 +126,7 @@ public abstract class FieldPanel<T> extends AbstractFieldPanel<T> implements Clo
     }
 
     public T getModelObject() {
-        return (T) field.getModelObject();
+        return field.getModelObject();
     }
 
     public FieldPanel<T> setNewModel(final IModel<T> model) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties
----------------------------------------------------------------------
diff --git a/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties b/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties
index 223b27a..c733b09 100644
--- a/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties
+++ b/console/src/main/resources/org/apache/syncope/console/SyncopeApplication.properties
@@ -52,3 +52,4 @@ jexl_ex1=surname + ',' + firstname
 jexl_ex2='new.' + surname
 jexl_syntax_url=Full JEXL reference
 create=Create
+textField.DoubleValidator=Double value not valid

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties
----------------------------------------------------------------------
diff --git a/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties b/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties
index 3a54be5..9f3d00c 100644
--- a/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties
+++ b/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_it.properties
@@ -51,3 +51,4 @@ jexl_ex1=surname + ',' + firstname
 jexl_ex2='new.' + surname
 jexl_syntax_url=Sintassi JEXL completa
 create=Crea
+textField.DoubleValidator=Valore double non valido

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties
----------------------------------------------------------------------
diff --git a/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties b/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties
index dd9ecd7..653983d 100644
--- a/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties
+++ b/console/src/main/resources/org/apache/syncope/console/SyncopeApplication_pt_BR.properties
@@ -51,3 +51,4 @@ jexl_ex1=sobrenome + ',' + nome
 jexl_ex2='novo.' + sobrenome
 jexl_syntax_url=Refer\u00eancia JEXL completa
 create=Criar
+textField.DoubleValidator=Double valor n\u00e3o \u00e9 v\u00e1lido

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.html
----------------------------------------------------------------------
diff --git a/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.html b/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.html
new file mode 100644
index 0000000..050ff2d
--- /dev/null
+++ b/console/src/main/resources/org/apache/syncope/console/wicket/markup/html/form/AjaxDoubleFieldPanel.html
@@ -0,0 +1,23 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:extend>
+    <input type="text" class="ui-widget-content ui-corner-all long_dynamicsize" wicket:id="doubleField"/>
+  </wicket:extend>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/core/src/main/java/org/apache/syncope/core/util/DataFormat.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/syncope/core/util/DataFormat.java b/core/src/main/java/org/apache/syncope/core/util/DataFormat.java
index 58b719a..4296422 100644
--- a/core/src/main/java/org/apache/syncope/core/util/DataFormat.java
+++ b/core/src/main/java/org/apache/syncope/core/util/DataFormat.java
@@ -19,9 +19,11 @@
 package org.apache.syncope.core.util;
 
 import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
 import org.apache.commons.lang3.time.DateUtils;
 import org.apache.syncope.common.SyncopeConstants;
 
@@ -44,7 +46,9 @@ public final class DataFormat {
 
         @Override
         protected DecimalFormat initialValue() {
-            return new DecimalFormat();
+            DecimalFormat df = new DecimalFormat();
+            df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
+            return df;
         }
     };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/core/src/test/java/org/apache/syncope/core/rest/RoleTestITCase.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/syncope/core/rest/RoleTestITCase.java b/core/src/test/java/org/apache/syncope/core/rest/RoleTestITCase.java
index 5f0feb0..ce553cc 100644
--- a/core/src/test/java/org/apache/syncope/core/rest/RoleTestITCase.java
+++ b/core/src/test/java/org/apache/syncope/core/rest/RoleTestITCase.java
@@ -51,6 +51,7 @@ import org.apache.syncope.common.to.RoleTO;
 import org.apache.syncope.common.to.SchemaTO;
 import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.common.types.AttributableType;
+import org.apache.syncope.common.types.AttributeSchemaType;
 import org.apache.syncope.common.types.ClientExceptionType;
 import org.apache.syncope.common.types.IntMappingType;
 import org.apache.syncope.common.types.MappingPurpose;
@@ -886,4 +887,46 @@ public class RoleTestITCase extends AbstractTest {
             resourceService.delete("new-ldap");
         }
     }
+
+    @Test
+    public void issueSYNCOPE717() {
+        String doubleSchemaName = "double" + getUUIDString();
+
+        // 1. create double schema without conversion pattern
+        SchemaTO schema = new SchemaTO();
+        schema.setName(doubleSchemaName);
+        schema.setType(AttributeSchemaType.Double);
+
+        schema = createSchema(AttributableType.ROLE, SchemaType.NORMAL, schema);
+        assertNotNull(schema);
+        assertNull(schema.getConversionPattern());
+
+        // 2. create role, provide valid input value
+        RoleTO roleTO = buildBasicRoleTO("syncope717");
+        roleTO.getRAttrTemplates().add(doubleSchemaName);
+        roleTO.getAttrs().add(attributeTO(doubleSchemaName, "11.23"));
+
+        roleTO = createRole(roleTO);
+        assertNotNull(roleTO);
+        assertEquals("11.23", roleTO.getAttrMap().get(doubleSchemaName).getValues().get(0));
+
+        // 3. update schema, set conversion pattern
+        schema.setConversionPattern("0.000");
+        schemaService.update(AttributableType.ROLE, SchemaType.NORMAL, schema.getName(), schema);
+
+        // 4. re-read role, verify that pattern was applied
+        roleTO = roleService.read(roleTO.getId());
+        assertNotNull(roleTO);
+        assertEquals("11.230", roleTO.getAttrMap().get(doubleSchemaName).getValues().get(0));
+
+        // 5. modify role with new double value
+        RoleMod roleMod = new RoleMod();
+        roleMod.setId(roleTO.getId());
+        roleMod.getAttrsToRemove().add(doubleSchemaName);
+        roleMod.getAttrsToUpdate().add(attributeMod(doubleSchemaName, "11.257"));
+
+        roleTO = updateRole(roleMod);
+        assertNotNull(roleTO);
+        assertEquals("11.257", roleTO.getAttrMap().get(doubleSchemaName).getValues().get(0));
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/5954e2e7/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 3b74d7d..65dd922 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1026,6 +1026,7 @@ under the License.
           <configuration>
             <source>${targetJdk}</source>
             <target>${targetJdk}</target>
+            <useIncrementalCompilation>false</useIncrementalCompilation>
             <showWarnings>true</showWarnings>
             <showDeprecation>true</showDeprecation>
             <!--<compilerArgument>-Xlint:unchecked</compilerArgument>-->