View Javadoc
1   /**
2    * Copyright 2014 Internet2
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  /*
17   * Copyright (C) 2005 Joe Walnes.
18   * Copyright (C) 2006, 2007 XStream Committers.
19   * All rights reserved.
20   *
21   * The software in this package is published under the terms of the BSD
22   * style license a copy of which has been included with this distribution in
23   * the LICENSE.txt file.
24   * 
25   * Created on 03. October 2005 by Joerg Schaible
26   */
27  package edu.internet2.middleware.grouperClientExt.com.thoughtworks.xstream.converters.extended;
28  
29  import java.util.Calendar;
30  import java.util.GregorianCalendar;
31  import java.util.Locale;
32  import java.util.TimeZone;
33  
34  import org.joda.time.DateTime;
35  import org.joda.time.DateTimeZone;
36  import org.joda.time.format.DateTimeFormatter;
37  import org.joda.time.format.ISODateTimeFormat;
38  
39  import edu.internet2.middleware.grouperClientExt.com.thoughtworks.xstream.converters.ConversionException;
40  import edu.internet2.middleware.grouperClientExt.com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
41  
42  
43  /**
44   * A GregorianCalendarConverter conforming to the ISO8601 standard.
45   * http://www.iso.ch/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=26780
46   * 
47   * @author Mauro Talevi
48   * @author Jörg Schaible
49   * @since 1.1.3
50   */
51  public class ISO8601GregorianCalendarConverter extends AbstractSingleValueConverter {
52      private static final DateTimeFormatter[] formattersUTC = new DateTimeFormatter[]{
53              ISODateTimeFormat.dateTime(), 
54              ISODateTimeFormat.dateTimeNoMillis(),
55              ISODateTimeFormat.basicDateTime(), 
56              ISODateTimeFormat.basicOrdinalDateTime(),
57              ISODateTimeFormat.basicOrdinalDateTimeNoMillis(), 
58              ISODateTimeFormat.basicTime(),
59              ISODateTimeFormat.basicTimeNoMillis(), 
60              ISODateTimeFormat.basicTTime(),
61              ISODateTimeFormat.basicTTimeNoMillis(), 
62              ISODateTimeFormat.basicWeekDateTime(),
63              ISODateTimeFormat.basicWeekDateTimeNoMillis(), 
64              ISODateTimeFormat.ordinalDateTime(),
65              ISODateTimeFormat.ordinalDateTimeNoMillis(), 
66              ISODateTimeFormat.time(),
67              ISODateTimeFormat.timeNoMillis(), 
68              ISODateTimeFormat.tTime(),
69              ISODateTimeFormat.tTimeNoMillis(), 
70              ISODateTimeFormat.weekDateTime(),
71              ISODateTimeFormat.weekDateTimeNoMillis(),};
72      private static final DateTimeFormatter[] formattersNoUTC = new DateTimeFormatter[]{
73              ISODateTimeFormat.basicDate(), 
74              ISODateTimeFormat.basicOrdinalDate(),
75              ISODateTimeFormat.basicWeekDate(), 
76              ISODateTimeFormat.date(),
77              ISODateTimeFormat.dateHour(), 
78              ISODateTimeFormat.dateHourMinute(),
79              ISODateTimeFormat.dateHourMinuteSecond(),
80              ISODateTimeFormat.dateHourMinuteSecondFraction(),
81              ISODateTimeFormat.dateHourMinuteSecondMillis(), 
82              ISODateTimeFormat.hour(),
83              ISODateTimeFormat.hourMinute(), 
84              ISODateTimeFormat.hourMinuteSecond(),
85              ISODateTimeFormat.hourMinuteSecondFraction(),
86              ISODateTimeFormat.hourMinuteSecondMillis(), 
87              ISODateTimeFormat.ordinalDate(),
88              ISODateTimeFormat.weekDate(), 
89              ISODateTimeFormat.year(), 
90              ISODateTimeFormat.yearMonth(),
91              ISODateTimeFormat.yearMonthDay(), 
92              ISODateTimeFormat.weekyear(),
93              ISODateTimeFormat.weekyearWeek(), 
94              ISODateTimeFormat.weekyearWeekDay(),};
95  
96      public boolean canConvert(Class type) {
97          return type.equals(GregorianCalendar.class);
98      }
99  
100     public Object fromString(String str) {
101         for (int i = 0; i < formattersUTC.length; i++) {
102             DateTimeFormatter formatter = formattersUTC[i];
103             try {
104                 DateTime dt = formatter.parseDateTime(str);
105                 Calendar calendar = dt.toCalendar(Locale.getDefault());
106                 calendar.setTimeZone(TimeZone.getDefault());
107                 return calendar;
108             } catch (IllegalArgumentException e) {
109                 // try with next formatter
110             }
111         }
112         String timeZoneID = TimeZone.getDefault().getID();
113         for (int i = 0; i < formattersNoUTC.length; i++) {
114             try {
115                 DateTimeFormatter formatter = formattersNoUTC[i].withZone(DateTimeZone.forID(timeZoneID));
116                 DateTime dt = formatter.parseDateTime(str);
117                 Calendar calendar = dt.toCalendar(Locale.getDefault());
118                 calendar.setTimeZone(TimeZone.getDefault());
119                 return calendar;
120             } catch (IllegalArgumentException e) {
121                 // try with next formatter
122             }
123         }
124         throw new ConversionException("Cannot parse date " + str);
125     }
126 
127     public String toString(Object obj) {
128         DateTime dt = new DateTime(obj);
129         return dt.toString(formattersUTC[0]);
130     }
131 }