Author: davidb
Date: Wed Aug  9 14:56:48 2017
New Revision: 1804537

URL: http://svn.apache.org/viewvc?rev=1804537&view=rev
Log:
Fix conversions between long and Calendar

Modified:
    
felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java
    
felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java

Modified: 
felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java?rev=1804537&r1=1804536&r2=1804537&view=diff
==============================================================================
--- 
felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java
 (original)
+++ 
felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConverterImpl.java
 Wed Aug  9 14:56:48 2017
@@ -21,6 +21,7 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.TimeZone;
 import java.util.UUID;
 import java.util.regex.Pattern;
 
@@ -32,7 +33,10 @@ import org.osgi.util.converter.TypeRule;
 import org.osgi.util.function.Function;
 
 public class ConverterImpl implements InternalConverter {
-    private final SimpleDateFormat ISO8601_DATE_FORMAT = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
+    private static final SimpleDateFormat ISO8601_DATE_FORMAT = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
+    static {
+        ISO8601_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+    }
 
     @Override
     public InternalConverting convert(Object obj) {
@@ -45,7 +49,7 @@ public class ConverterImpl implements In
     }
 
     public void addStandardRules(ConverterBuilder cb) {
-//        cb.rule(new Rule<Calendar, String>(f -> 
f.getTime().toInstant().toString()) {});
+        // Not written using lambda's because this code needs to run with Java 
7
         cb.rule(new Rule<Calendar, String>(new Function<Calendar, String>() {
             @Override
             public String apply(Calendar f) {
@@ -53,11 +57,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<String, Calendar>(f -> {
-//            Calendar cc = Calendar.getInstance();
-//            cc.setTime(Date.from(Instant.parse(f)));
-//            return cc;
-//        }) {});
         cb.rule(new Rule<String, Calendar>(new Function<String, Calendar>() {
             @Override
             public Calendar apply(String f) {
@@ -71,7 +70,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Calendar,Long>(f -> f.getTime().getTime()) {});
         cb.rule(new Rule<Calendar, Long>(new Function<Calendar, Long>() {
             @Override
             public Long apply(Calendar f) {
@@ -79,16 +77,15 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Long,Calendar>(f -> new 
Calendar.Builder().setInstant(f).build()) {});
         cb.rule(new Rule<Long, Calendar>(new Function<Long, Calendar>() {
             @Override
             public Calendar apply(Long f) {
-//                new Calendar.Builder().setInstant(f).build()
-                return null;
+                Calendar c = Calendar.getInstance();
+                c.setTimeInMillis(f);
+                return c;
             }
         }) {});
 
-//        cb.rule(new Rule<Character,Boolean>(c -> c.charValue() != 0) {});
         cb.rule(new Rule<Character, Boolean>(new Function<Character, 
Boolean>() {
             @Override
             public Boolean apply(Character c) {
@@ -96,7 +93,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Boolean,Character>(b -> b.booleanValue() ? (char) 1 
: (char) 0) {});
         cb.rule(new Rule<Boolean, Character>(new Function<Boolean, 
Character>() {
             @Override
             public Character apply(Boolean b) {
@@ -104,7 +100,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Character,Integer>(c -> (int) c.charValue()) {});
         cb.rule(new Rule<Character, Integer>(new Function<Character, 
Integer>() {
             @Override
             public Integer apply(Character c) {
@@ -112,7 +107,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Character,Long>(c -> (long) c.charValue()) {});
         cb.rule(new Rule<Character, Long>(new Function<Character, Long>() {
             @Override
             public Long apply(Character c) {
@@ -120,7 +114,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<String,Character>(f -> f.length() > 0 ? f.charAt(0) 
: 0) {});
         cb.rule(new Rule<String, Character>(new Function<String, Character>() {
             @Override
             public Character apply(String f) {
@@ -128,7 +121,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<String,Class<?>>(this::loadClassUnchecked) {});
         cb.rule(new Rule<String, Class<?>>(new Function<String, Class<?>>() {
             @Override
             public Class<?> apply(String cn) {
@@ -136,14 +128,13 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Date,Long>(Date::getTime) {});
         cb.rule(new Rule<Date, Long>(new Function<Date, Long>() {
             @Override
             public Long apply(Date d) {
                 return d.getTime();
             }
         }) {});
-//        cb.rule(new Rule<Long,Date>(f -> new Date(f)) {});
+
         cb.rule(new Rule<Long, Date>(new Function<Long, Date>() {
             @Override
             public Date apply(Long f) {
@@ -151,7 +142,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Date,String>(f -> f.toInstant().toString()) {});
         cb.rule(new Rule<Date, String>(new Function<Date, String>() {
             @Override
             public String apply(Date d) {
@@ -159,7 +149,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<String,Date>(f -> Date.from(Instant.parse(f))) {});
         cb.rule(new Rule<String, Date>(new Function<String, Date>() {
             @Override
             public Date apply(String f) {
@@ -171,7 +160,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<String, Pattern>(Pattern::compile) {});
         cb.rule(new Rule<String, Pattern>(new Function<String, Pattern>() {
             @Override
             public Pattern apply(String ps) {
@@ -179,7 +167,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<String, UUID>(UUID::fromString) {});
         cb.rule(new Rule<String, UUID>(new Function<String, UUID>() {
             @Override
             public UUID apply(String uuid) {
@@ -188,7 +175,6 @@ public class ConverterImpl implements In
         }) {});
 
         // Special conversions between character arrays and String
-//        cb.rule(new Rule<char[], String>(this::charArrayToString) {});
         cb.rule(new Rule<char[], String>(new Function<char[], String>() {
             @Override
             public String apply(char[] ca) {
@@ -196,7 +182,6 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<Character[], String>(this::characterArrayToString) 
{});
         cb.rule(new Rule<Character[], String>(new Function<Character[], 
String>() {
             @Override
             public String apply(Character[] ca) {
@@ -204,14 +189,13 @@ public class ConverterImpl implements In
             }
         }) {});
 
-//        cb.rule(new Rule<String, char[]>(this::stringToCharArray) {});
         cb.rule(new Rule<String, char[]>(new Function<String, char[]>() {
             @Override
             public char[] apply(String s) {
                 return stringToCharArray(s);
             }
         }) {});
-//        cb.rule(new Rule<String, Character[]>(this::stringToCharacterArray) 
{});
+
         cb.rule(new Rule<String, Character[]>(new Function<String, 
Character[]>() {
             @Override
             public Character[] apply(String s) {
@@ -219,18 +203,11 @@ public class ConverterImpl implements In
             }
         }) {});
 
-        // TODO
-//      cb.rule(new Rule<String, LocalDateTime>(LocalDateTime::parse) {});
         reflectiveAddRule(cb, "java.time.LocalDateTime", "parse");
-//      cb.rule(new Rule<String, LocalDate>(LocalDate::parse) {});
         reflectiveAddRule(cb, "java.time.LocalDate", "parse");
-//      cb.rule(new Rule<String, LocalTime>(LocalTime::parse) {});
         reflectiveAddRule(cb, "java.time.LocalTime", "parse");
-//      cb.rule(new Rule<String, OffsetDateTime>(OffsetDateTime::parse) {});
         reflectiveAddRule(cb, "java.time.OffsetDateTime", "parse");
-//      cb.rule(new Rule<String, OffsetTime>(OffsetTime::parse) {});
         reflectiveAddRule(cb, "java.time.OffsetTime", "parse");
-//      cb.rule(new Rule<String, ZonedDateTime>(ZonedDateTime::parse) {});
         reflectiveAddRule(cb, "java.time.ZonedDateTime", "parse");
     }
 

Modified: 
felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java?rev=1804537&r1=1804536&r2=1804537&view=diff
==============================================================================
--- 
felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java
 (original)
+++ 
felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java
 Wed Aug  9 14:56:48 2017
@@ -512,15 +512,28 @@ public class ConverterTest {
         Converter c = converter;
 
         String s = c.convert(d).toString();
-        assertEquals("1971-02-13T12:37:41+01:00", s);
+        assertEquals("1971-02-13T11:37:41Z", s);
         assertEquals(d, c.convert(s).to(Date.class));
 
         String s2 = c.convert(cal).toString();
-        assertEquals("1971-02-13T12:37:41+01:00", s2);
+        assertEquals("1971-02-13T11:37:41Z", s2);
         Calendar cal2 = c.convert(s2).to(Calendar.class);
         assertEquals(cal.getTime(), cal2.getTime());
     }
 
+    @Test
+    public void testCalendarLong() {
+        Calendar cal = new GregorianCalendar(1971, 1, 13, 12, 37, 41);
+        TimeZone tz =TimeZone.getTimeZone("UTC");
+        cal.setTimeZone(tz);
+
+        long l = converter.convert(cal).to(Long.class);
+        assertEquals(l, cal.getTimeInMillis());
+
+        Calendar cal2 = converter.convert(l).to(Calendar.class);
+        assertEquals(cal.getTime(), cal2.getTime());
+    }
+
     @Test
     public void testDefaultValue() {
         long l = converter.convert(null).defaultValue("12").to(Long.class);


Reply via email to