org.exolab.castor.types.Year Maven / Gradle / Ivy
Show all versions of castor-xml Show documentation
/*
* Redistribution and use of this software and associated documentation ("Software"), with or
* without modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain copyright statements and notices. Redistributions
* must also contain a copy of this document.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* 3. The name "Exolab" must not be used to endorse or promote products derived from this Software
* without prior written permission of Intalio, Inc. For written permission, please contact
* [email protected].
*
* 4. Products derived from this Software may not be called "Exolab" nor may "Exolab" appear in
* their names without prior written permission of Intalio, Inc. Exolab is a registered trademark of
* Intalio, Inc.
*
* 5. Due credit should be given to the Exolab Project (http://www.exolab.org/).
*
* THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTALIO, INC. OR ITS
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Copyright 2000 (C) Intalio, Inc. All Rights Reserved.
*
* $Id$ Date Author Changes 11/01/2000 Arnaud Blandin Created
*/
package org.exolab.castor.types;
import java.text.ParseException;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
import java.text.SimpleDateFormat;
/**
*
* Describe an XML schema Year.
*
* The date type is derived from time period by setting up the facet :
*
* - duration to "P1Y"
*
*
* Note: This datatype is not included in any recommendation. It was introduced in
* http://www.w3.org/TR/2000/WD-xmlschema-2-20000407/ and was last in
* http://www.w3.org/TR/2000/CR-xmlschema-2-20001024/ and was removed by
* http://www.w3.org/TR/2001/PR-xmlschema-2-20010316/. It was not in the final approved
* recommendation: http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/
*
* @author Arnaud Blandin
* @version $Revision$
* @deprecated since Castor 1.0.6 since this type is not in any recommendation.
*/
public class Year extends TimePeriod {
/** SerialVersionUID */
private static final long serialVersionUID = 8485456751196062574L;
/** Set to true and recompile to include debugging code in class. */
private static final boolean DEBUG = false;
/** The month format used by the toDate() method */
private static final String YEAR_FORMAT = "yyyy";
public Year() {
super("P1Y");
// we need to set the time zone to the computer local time zone
// if we want to use the toDate() method.
int temp = TimeZone.getDefault().getRawOffset();
if (temp < 0) {
temp = -temp;
try {
this.setZoneNegative();
} catch (UnsupportedOperationException e) {
}
}
short zhour = (short) (temp / (60 * 60 * 1000));
temp = temp % (60 * 60 * 1000);
short zmin = (short) (temp / (60 * 1000));
try {
this.setZone(zhour, zmin);
} catch (UnsupportedOperationException e) {
}
}
/* Disallow the access to set month method */
public void setMonth(short month) throws UnsupportedOperationException {
String err = "In a Year : the month field must not be changed";
throw new UnsupportedOperationException(err);
}
/* Disallow the access to set day method */
public void setDay(short day) throws UnsupportedOperationException {
String err = "In a Year : the day field must not be changed";
throw new UnsupportedOperationException(err);
}
/* Disallow the access to set time methods */
public void setHour(short hour) throws UnsupportedOperationException {
String err = "In a Year : the hour field must not be changed";
throw new UnsupportedOperationException(err);
}
public void setMinute(short minute) throws UnsupportedOperationException {
String err = "In a Year : the minute field must not be changed";
throw new UnsupportedOperationException(err);
}
public void setSecond(short second, short millsecond) throws UnsupportedOperationException {
String err = "In a Year : the second fields must not be changed";
throw new UnsupportedOperationException(err);
}
public void setZone(short hour, short minute) throws UnsupportedOperationException {
String err = "In a Year : the time zone fields must not be changed";
throw new UnsupportedOperationException(err);
}
public void setZoneNegative() throws UnsupportedOperationException {
String err = "In a Year : the time zone fields must not be changed";
throw new UnsupportedOperationException(err);
}
/**
* convert this Year to a string The format is defined by W3C XML Schema draft and ISO8601 i.e
* (+|-)CCYY
*
* @return a string representing this Month
*/
public String toString() {
StringBuilder result = new StringBuilder();
result.append(this.getCentury());
if (result.length() == 1)
result.insert(0, 0);
if ((this.getYear() / 10) == 0)
result.append(0);
result.append(this.getYear());
if (isNegative())
result.insert(0, '-');
return result.toString();
}// toString
/**
* parse a String and convert it into a java.lang.Object
*
* @param str the string to parse
* @return the java.lang.Object represented by the string
* @throws ParseException a parse exception is thrown if the string to parse does not follow the
* rigth format (see the description of this class)
*/
public static Object parse(String str) throws ParseException {
return parseYear(str);
}
/**
* parse a String and convert it into a Year
*
* @param str the string to parse
* @return the Year represented by the string
* @throws ParseException a parse exception is thrown if the string to parse does not follow the
* rigth format (see the description of this class)
*/
public static Year parseYear(String str) throws ParseException {
Year result = new Year();
if (str.startsWith("-")) {
result.setNegative();
str = str.substring(1);
}
if (DEBUG) {
System.out.println("In parsing method of Year");
System.out.println("String to parse : " + str);
System.out.println("Negative ? " + result.isNegative());
}
if (str.length() != 4)
throw new ParseException(str + ": Bad XML Schema Year type format (CCYY)", 0);
if (DEBUG) {
System.out.println("Processing century: " + str.substring(0, 2));
}
result.setCentury(Short.parseShort(str.substring(0, 2)));
if (DEBUG) {
System.out.println("Processing year: " + str.substring(2, 4));
}
try {
result.setYear(Short.parseShort(str.substring(2, 4)));
} catch (UnsupportedOperationException e) {
}
return result;
}// parse
public java.util.Date toDate() throws ParseException {
java.util.Date date = null;
SimpleDateFormat df = new SimpleDateFormat(YEAR_FORMAT);
SimpleTimeZone timeZone = new SimpleTimeZone(0, "UTC");
// Set the time zone
if (!isUTC()) {
int offset = 0;
offset = ((this.getZoneMinute() + this.getZoneHour() * 60) * 60 * 1000);
offset = isZoneNegative() ? -offset : offset;
timeZone.setRawOffset(offset);
timeZone.setID(TimeZone.getAvailableIDs(offset)[0]);
}
df.setTimeZone(timeZone);
date = df.parse(this.toString());
return date;
}// toDate()
} // --Year