You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2014/08/14 10:40:35 UTC

[1/3] git commit: Defines new interface to implement specialized internal converters

Repository: struts
Updated Branches:
  refs/heads/feature/locale-aware-converters [created] fe329f502


Defines new interface to implement specialized internal converters


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

Branch: refs/heads/feature/locale-aware-converters
Commit: dfb5203ea7010516ae7aa02889936392a982ab3a
Parents: d749bb8
Author: Lukasz Lenart <lu...@apache.org>
Authored: Thu Aug 14 10:39:13 2014 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Thu Aug 14 10:39:13 2014 +0200

----------------------------------------------------------------------
 .../xwork2/conversion/InternalConverter.java    | 12 +++++++
 .../xwork2/conversion/InternalConverters.java   | 37 ++++++++++++++++++++
 2 files changed, 49 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/dfb5203e/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverter.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverter.java b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverter.java
new file mode 100644
index 0000000..50cf52b
--- /dev/null
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverter.java
@@ -0,0 +1,12 @@
+package com.opensymphony.xwork2.conversion;
+
+/**
+ * Represents specialized converters which can convert value to given type T
+ */
+public interface InternalConverter<T> {
+
+    boolean canConvert(Object value);
+
+    T convert(Object value);
+
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/dfb5203e/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverters.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverters.java b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverters.java
new file mode 100644
index 0000000..849e8af
--- /dev/null
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/InternalConverters.java
@@ -0,0 +1,37 @@
+package com.opensymphony.xwork2.conversion;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Holds reference to all internal converters to simplify lookup and registration
+ */
+public class InternalConverters<T> {
+
+    private final InternalConverter<T> NO_OP_CONVERTER = new InternalConverter<T>() {
+
+        public boolean canConvert(Object value) {
+            return false;
+        }
+
+        public T convert(Object value) {
+            return null;
+        }
+    };
+
+    private List<InternalConverter<T>> converters = new ArrayList<InternalConverter<T>>();
+
+    public boolean register(InternalConverter<T> converter) {
+        return converters.add(converter);
+    }
+
+    public InternalConverter<T> lookup(Object value) {
+        for (InternalConverter<T> converter : converters) {
+            if (converter.canConvert(value)) {
+                return converter;
+            }
+        }
+        return NO_OP_CONVERTER;
+    }
+
+}


[3/3] git commit: Uses the new internal converters and adds new test case

Posted by lu...@apache.org.
Uses the new internal converters and adds new test case


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

Branch: refs/heads/feature/locale-aware-converters
Commit: fe329f50242b17f109d3e80c4213f012ce2d950a
Parents: b195fb3
Author: Lukasz Lenart <lu...@apache.org>
Authored: Thu Aug 14 10:39:52 2014 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Thu Aug 14 10:39:52 2014 +0200

----------------------------------------------------------------------
 .../xwork2/conversion/impl/StringConverter.java | 25 +++++++++++++-
 .../conversion/impl/StringConverterTest.java    | 36 ++++++++++++++++++++
 2 files changed, 60 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/fe329f50/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/StringConverter.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/StringConverter.java b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/StringConverter.java
index e9c1417..bed8169 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/StringConverter.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/impl/StringConverter.java
@@ -1,5 +1,10 @@
 package com.opensymphony.xwork2.conversion.impl;
 
+import com.opensymphony.xwork2.LocaleProvider;
+import com.opensymphony.xwork2.conversion.InternalConverter;
+import com.opensymphony.xwork2.conversion.InternalConverters;
+import com.opensymphony.xwork2.conversion.string.StringDoubleConverter;
+import com.opensymphony.xwork2.inject.Inject;
 import org.apache.commons.lang3.StringUtils;
 
 import java.lang.reflect.Member;
@@ -12,9 +17,18 @@ import java.util.Map;
 
 public class StringConverter extends DefaultTypeConverter {
 
+
+    private InternalConverters<String> converters = new InternalConverters<String>();
+
     @Override
     public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType) {
-        String result = null;
+        String result;
+
+        InternalConverter<String> converter = converters.lookup(value);
+        result = converter.convert(value);
+        if (result != null) {
+            return result;
+        }
 
         if (value instanceof int[]) {
             int[] x = (int[]) value;
@@ -70,4 +84,13 @@ public class StringConverter extends DefaultTypeConverter {
         }
         return result;
     }
+
+    @Inject
+    public void setLocaleProvider(LocaleProvider provider) {
+        super.setLocaleProvider(provider);
+
+        converters = new InternalConverters<String>();
+        converters.register(new StringDoubleConverter(provider));
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/fe329f50/xwork-core/src/test/java/com/opensymphony/xwork2/conversion/impl/StringConverterTest.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/conversion/impl/StringConverterTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/conversion/impl/StringConverterTest.java
new file mode 100644
index 0000000..9060dbc
--- /dev/null
+++ b/xwork-core/src/test/java/com/opensymphony/xwork2/conversion/impl/StringConverterTest.java
@@ -0,0 +1,36 @@
+package com.opensymphony.xwork2.conversion.impl;
+
+import com.opensymphony.xwork2.LocaleProvider;
+import com.opensymphony.xwork2.XWorkTestCase;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+public class StringConverterTest extends XWorkTestCase {
+
+    private Map<String, Object> context = new HashMap<String, Object>();
+
+    public void testDoubleToString() throws Exception {
+        // given
+        Double d = 10.01;
+
+        StringConverter converter = new StringConverter();
+        converter.setLocaleProvider(buildProvider("DE"));
+
+        // when
+        Object actual = converter.convertValue(context, null, null, null, d, String.class);
+
+        // then
+        assertEquals("10,01", actual);
+    }
+
+    private LocaleProvider buildProvider(final String locale) {
+        return new LocaleProvider() {
+            public Locale getLocale() {
+                return new Locale(locale);
+            }
+        };
+    }
+
+}


[2/3] git commit: Adds new internal converter of Double to String

Posted by lu...@apache.org.
Adds new internal converter of Double to String


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

Branch: refs/heads/feature/locale-aware-converters
Commit: b195fb3af7d44409dccdb94e675c1a7ace99daab
Parents: dfb5203
Author: Lukasz Lenart <lu...@apache.org>
Authored: Thu Aug 14 10:39:35 2014 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Thu Aug 14 10:39:35 2014 +0200

----------------------------------------------------------------------
 .../string/StringDoubleConverter.java           | 26 ++++++++++++++++++++
 1 file changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/b195fb3a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/string/StringDoubleConverter.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/string/StringDoubleConverter.java b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/string/StringDoubleConverter.java
new file mode 100644
index 0000000..f32f518
--- /dev/null
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/conversion/string/StringDoubleConverter.java
@@ -0,0 +1,26 @@
+package com.opensymphony.xwork2.conversion.string;
+
+import com.opensymphony.xwork2.LocaleProvider;
+import com.opensymphony.xwork2.conversion.InternalConverter;
+
+import java.text.NumberFormat;
+
+public class StringDoubleConverter implements InternalConverter<String> {
+
+    private LocaleProvider provider;
+
+    public StringDoubleConverter(LocaleProvider provider) {
+        this.provider = provider;
+    }
+
+    public boolean canConvert(Object value) {
+        return value.getClass() == Double.class || value.getClass() == double.class;
+    }
+
+    public String convert(Object value) {
+        Double doubleValue = (Double) value;
+        NumberFormat format = NumberFormat.getInstance(provider.getLocale());
+        return format.format(doubleValue);
+    }
+
+}