1 /* DatatypeFactory.java --
2    Copyright (C) 2004, 2005  Free Software Foundation, Inc.
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 package javax.xml.datatype;
39 
40 import java.math.BigDecimal;
41 import java.math.BigInteger;
42 import java.util.GregorianCalendar;
43 
44 /**
45  * Factory class to create new datatype objects mapping XML to and from Java
46  * objects.
47  *
48  * @author (a href='mailto:dog@gnu.org'>Chris Burdess</a)
49  * @since 1.3
50  */
51 public abstract class DatatypeFactory
52 {
53 
54   /**
55    * JAXP 1.3 default property name.
56    */
57   public static final String DATATYPEFACTORY_PROPERTY = "javax.xml.datatype.DatatypeFactory";
58 
59   /**
60    * JAXP 1.3 default implementation class name.
61    */
62   public static final java.lang.String DATATYPEFACTORY_IMPLEMENTATION_CLASS = "gnu.xml.datatype.JAXPDatatypeFactory";
63 
DatatypeFactory()64   protected DatatypeFactory()
65   {
66   }
67 
68   /**
69    * Returns a new factory instance.
70    */
newInstance()71   public static DatatypeFactory newInstance()
72     throws DatatypeConfigurationException
73   {
74     try
75       {
76         Class t = Class.forName(DATATYPEFACTORY_IMPLEMENTATION_CLASS);
77         return (DatatypeFactory) t.newInstance();
78       }
79     catch (Exception e)
80       {
81         throw new DatatypeConfigurationException (e);
82       }
83   }
84 
85   /**
86    * Returns a new duration from its string representation.
87    * @param lexicalRepresentation the lexical representation of the
88    * duration, as specified in XML Schema 1.0 section 3.2.6.1.
89    */
newDuration(String lexicalRepresentation)90   public abstract Duration newDuration(String lexicalRepresentation);
91 
92   /**
93    * Returns a new duration.
94    * @param durationInMilliSeconds the duration in milliseconds
95    */
newDuration(long durationInMilliSeconds)96   public abstract Duration newDuration(long durationInMilliSeconds);
97 
98   /**
99    * Returns a new duration by specifying the individual components.
100    * @param isPositive whether the duration is positive
101    * @param years the number of years
102    * @param months the number of months
103    * @param days the number of days
104    * @param hours the number of hours
105    * @param minutes th number of minutes
106    * @param seconds the number of seconds
107    */
newDuration(boolean isPositive, BigInteger years, BigInteger months, BigInteger days, BigInteger hours, BigInteger minutes, BigDecimal seconds)108   public abstract Duration newDuration(boolean isPositive,
109                                        BigInteger years,
110                                        BigInteger months,
111                                        BigInteger days,
112                                        BigInteger hours,
113                                        BigInteger minutes,
114                                        BigDecimal seconds);
115 
116   /**
117    * Returns a new duration by specifying the individual components.
118    * @param isPositive whether the duration is positive
119    * @param years the number of years
120    * @param months the number of months
121    * @param days the number of days
122    * @param hours the number of hours
123    * @param minutes th number of minutes
124    * @param seconds the number of seconds
125    */
newDuration(boolean isPositive, int years, int months, int days, int hours, int minutes, int seconds)126   public Duration newDuration(boolean isPositive,
127                               int years,
128                               int months,
129                               int days,
130                               int hours,
131                               int minutes,
132                               int seconds)
133   {
134     return newDuration(isPositive,
135                        BigInteger.valueOf((long) years),
136                        BigInteger.valueOf((long) months),
137                        BigInteger.valueOf((long) days),
138                        BigInteger.valueOf((long) hours),
139                        BigInteger.valueOf((long) minutes),
140                        BigDecimal.valueOf((long) seconds));
141   }
142 
143   /**
144    * Returns a new dayTimeDuration from its string representation.
145    * @param lexicalRepresentation the lexical representation of the
146    * duration, as specified in XML Schema 1.0 section 3.2.6.1.
147    */
newDurationDayTime(String lexicalRepresentation)148   public Duration newDurationDayTime(String lexicalRepresentation)
149   {
150     return newDuration(lexicalRepresentation);
151   }
152 
153   /**
154    * Returns a new dayTimeDuration.
155    * @param durationInMilliseconds the duration in milliseconds
156    */
newDurationDayTime(long durationInMilliseconds)157   public Duration newDurationDayTime(long durationInMilliseconds)
158   {
159     // TODO xmlSchemaType
160     return newDuration(durationInMilliseconds);
161   }
162 
163   /**
164    * Returns a new dayTimeDuration by specifying the individual components.
165    * @param isPositive whether the duration is positive
166    * @param days the number of days
167    * @param hours the number of hours
168    * @param minutes th number of minutes
169    * @param seconds the number of seconds
170    */
newDurationDayTime(boolean isPositive, BigInteger days, BigInteger hours, BigInteger minutes, BigDecimal seconds)171   public Duration newDurationDayTime(boolean isPositive,
172                                      BigInteger days,
173                                      BigInteger hours,
174                                      BigInteger minutes,
175                                      BigDecimal seconds)
176   {
177     return newDuration(isPositive,
178                        null,
179                        null,
180                        days,
181                        hours,
182                        minutes,
183                        seconds);
184   }
185 
186   /**
187    * Returns a new dayTimeDuration by specifying the individual components.
188    * @param isPositive whether the duration is positive
189    * @param days the number of days
190    * @param hours the number of hours
191    * @param minutes th number of minutes
192    * @param seconds the number of seconds
193    */
newDurationDayTime(boolean isPositive, int days, int hours, int minutes, int seconds)194   public Duration newDurationDayTime(boolean isPositive,
195                                      int days,
196                                      int hours,
197                                      int minutes,
198                                      int seconds)
199   {
200     return newDuration(isPositive,
201                        null,
202                        null,
203                        BigInteger.valueOf((long) days),
204                        BigInteger.valueOf((long) hours),
205                        BigInteger.valueOf((long) minutes),
206                        BigDecimal.valueOf((long) seconds));
207   }
208 
209   /**
210    * Returns a new yearMonthDuration from its string representation.
211    * @param lexicalRepresentation the lexical representation of the
212    * duration, as specified in XML Schema 1.0 section 3.2.6.1.
213    */
newDurationYearMonth(String lexicalRepresentation)214   public Duration newDurationYearMonth(String lexicalRepresentation)
215   {
216     return newDuration(lexicalRepresentation);
217   }
218 
219   /**
220    * Returns a new yearMonthDuration.
221    * @param durationInMilliseconds the duration in milliseconds
222    */
newDurationYearMonth(long durationInMilliseconds)223   public Duration newDurationYearMonth(long durationInMilliseconds)
224   {
225     // TODO xmlSchemaType
226     return newDuration(durationInMilliseconds);
227   }
228 
229   /**
230    * Returns a new yearMonthDuration by specifying the individual components.
231    * @param isPositive whether the duration is positive
232    * @param years the number of years
233    * @param months the number of months
234    */
newDurationYearMonth(boolean isPositive, BigInteger years, BigInteger months)235   public Duration newDurationYearMonth(boolean isPositive,
236                                        BigInteger years,
237                                        BigInteger months)
238   {
239     return newDuration(isPositive,
240                        years,
241                        months,
242                        null,
243                        null,
244                        null,
245                        null);
246   }
247 
248   /**
249    * Returns a new yearMonthDuration by specifying the individual components.
250    * @param isPositive whether the duration is positive
251    * @param years the number of years
252    * @param months the number of months
253    */
newDurationYearMonth(boolean isPositive, int years, int months)254   public Duration newDurationYearMonth(boolean isPositive,
255                                        int years,
256                                        int months)
257   {
258     return newDuration(isPositive,
259                        BigInteger.valueOf((long) years),
260                        BigInteger.valueOf((long) months),
261                        null,
262                        null,
263                        null,
264                        null);
265   }
266 
267   /**
268    * Returns a new XMLGregorianCalendar with no fields initialized.
269    */
newXMLGregorianCalendar()270   public abstract XMLGregorianCalendar newXMLGregorianCalendar();
271 
272   /**
273    * Returns a new XMLGregorianCalendar from a string representation.
274    * @param lexicalRepresentation the lexical representation as specified in
275    * XML Schema 1.0 Part 2, section 3.2.[7-14].1.
276    */
newXMLGregorianCalendar(String lexicalRepresentation)277   public abstract XMLGregorianCalendar newXMLGregorianCalendar(String lexicalRepresentation);
278 
279   /**
280    * Returns a new XMLGregorianCalendar based on the specified Gregorian
281    * calendar.
282    */
newXMLGregorianCalendar(GregorianCalendar cal)283   public abstract XMLGregorianCalendar newXMLGregorianCalendar(GregorianCalendar cal);
284 
285   /**
286    * Returns a new XMLGregorianCalendar with the specified components.
287    */
newXMLGregorianCalendar(BigInteger year, int month, int day, int hour, int minute, int second, BigDecimal fractionalSecond, int timezone)288   public abstract XMLGregorianCalendar newXMLGregorianCalendar(BigInteger year,
289                                                                int month,
290                                                                int day,
291                                                                int hour,
292                                                                int minute,
293                                                                int second,
294                                                                BigDecimal fractionalSecond,
295                                                                int timezone);
296 
297   /**
298    * Returns a new XMLGregorianCalendar with the specified components.
299    */
newXMLGregorianCalendar(int year, int month, int day, int hour, int minute, int second, int millisecond, int timezone)300   public XMLGregorianCalendar newXMLGregorianCalendar(int year,
301                                                       int month,
302                                                       int day,
303                                                       int hour,
304                                                       int minute,
305                                                       int second,
306                                                       int millisecond,
307                                                       int timezone)
308   {
309     return newXMLGregorianCalendar(BigInteger.valueOf((long) year),
310                                    month,
311                                    day,
312                                    hour,
313                                    minute,
314                                    second,
315                                    new BigDecimal(((double) millisecond) / 1000.0),
316                                    timezone);
317   }
318 
319   /**
320    * Returns a new XMLGregorianCalendar with the specified components.
321    */
newXMLGregorianCalendarDate(int year, int month, int day, int timezone)322   public XMLGregorianCalendar newXMLGregorianCalendarDate(int year,
323                                                           int month,
324                                                           int day,
325                                                           int timezone)
326   {
327     return newXMLGregorianCalendar(BigInteger.valueOf((long) year),
328                                    month,
329                                    day,
330                                    DatatypeConstants.FIELD_UNDEFINED,
331                                    DatatypeConstants.FIELD_UNDEFINED,
332                                    DatatypeConstants.FIELD_UNDEFINED,
333                                    null,
334                                    timezone);
335   }
336 
337   /**
338    * Returns a new XMLGregorianCalendar with the specified components.
339    */
newXMLGregorianCalendarTime(int hours, int minutes, int seconds, int timezone)340   public XMLGregorianCalendar newXMLGregorianCalendarTime(int hours,
341                                                           int minutes,
342                                                           int seconds,
343                                                           int timezone)
344   {
345     return newXMLGregorianCalendar(null,
346                                    DatatypeConstants.FIELD_UNDEFINED,
347                                    DatatypeConstants.FIELD_UNDEFINED,
348                                    hours,
349                                    minutes,
350                                    seconds,
351                                    null,
352                                    timezone);
353   }
354 
355   /**
356    * Returns a new XMLGregorianCalendar with the specified components.
357    */
newXMLGregorianCalendarTime(int hours, int minutes, int seconds, BigDecimal fractionalSecond, int timezone)358   public XMLGregorianCalendar newXMLGregorianCalendarTime(int hours,
359                                                           int minutes,
360                                                           int seconds,
361                                                           BigDecimal fractionalSecond,
362                                                           int timezone)
363   {
364     return newXMLGregorianCalendar(null,
365                                    DatatypeConstants.FIELD_UNDEFINED,
366                                    DatatypeConstants.FIELD_UNDEFINED,
367                                    hours,
368                                    minutes,
369                                    seconds,
370                                    fractionalSecond,
371                                    timezone);
372   }
373 
374   /**
375    * Returns a new XMLGregorianCalendar with the specified components.
376    */
newXMLGregorianCalendarTime(int hours, int minutes, int seconds, int milliseconds, int timezone)377   public XMLGregorianCalendar newXMLGregorianCalendarTime(int hours,
378                                                           int minutes,
379                                                           int seconds,
380                                                           int milliseconds,
381                                                           int timezone)
382   {
383     return newXMLGregorianCalendar(null,
384                                    DatatypeConstants.FIELD_UNDEFINED,
385                                    DatatypeConstants.FIELD_UNDEFINED,
386                                    hours,
387                                    minutes,
388                                    seconds,
389                                    new BigDecimal(((double) milliseconds) / 1000.0),
390                                    timezone);
391   }
392 
393 }
394