in util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java [236:372]
public GeneralizedTime( String generalizedTime ) throws ParseException
{
if ( generalizedTime == null )
{
throw new ParseException( I18n.err( I18n.ERR_17043_GENERALIZED_TIME_NULL ), 0 );
}
this.upGeneralizedTime = generalizedTime;
calendar = new GregorianCalendar( GMT, Locale.ROOT );
calendar.setTimeInMillis( 0 );
calendar.setLenient( false );
parseYear();
parseMonth();
parseDay();
parseHour();
if ( upGeneralizedTime.length() < 11 )
{
throw new ParseException( I18n.err( I18n.ERR_17044_BAD_GENERALIZED_TIME ), 10 );
}
// pos 10:
// if digit => minute field
// if . or , => fraction of hour field
// if Z or + or - => timezone field
// else error
int pos = 10;
char c = upGeneralizedTime.charAt( pos );
if ( ( '0' <= c ) && ( c <= '9' ) )
{
parseMinute();
if ( upGeneralizedTime.length() < 13 )
{
throw new ParseException( I18n.err( I18n.ERR_17045_BAD_GENERALIZED_TIME ), 12 );
}
// pos 12:
// if digit => second field
// if . or , => fraction of minute field
// if Z or + or - => timezone field
// else error
pos = 12;
c = upGeneralizedTime.charAt( pos );
if ( ( '0' <= c ) && ( c <= '9' ) )
{
parseSecond();
if ( upGeneralizedTime.length() < 15 )
{
throw new ParseException( I18n.err( I18n.ERR_17046_BAD_GENERALIZED_TIME ), 14 );
}
// pos 14:
// if . or , => fraction of second field
// if Z or + or - => timezone field
// else error
pos = 14;
c = upGeneralizedTime.charAt( pos );
if ( ( c == '.' ) || ( c == ',' ) )
{
// read fraction of second
parseFractionOfSecond();
pos += 1 + upFractionLength;
parseTimezone( pos );
upFormat = Format.YEAR_MONTH_DAY_HOUR_MIN_SEC_FRACTION;
}
else if ( ( c == 'Z' ) || ( c == '+' ) || ( c == '-' ) )
{
// read timezone
parseTimezone( pos );
upFormat = Format.YEAR_MONTH_DAY_HOUR_MIN_SEC;
}
else
{
throw new ParseException( I18n.err( I18n.ERR_17047_TIME_TOO_SHORT ), 14 );
}
}
else if ( ( c == '.' ) || ( c == ',' ) )
{
// read fraction of minute
parseFractionOfMinute();
pos += 1 + upFractionLength;
parseTimezone( pos );
upFormat = Format.YEAR_MONTH_DAY_HOUR_MIN_FRACTION;
}
else if ( ( c == 'Z' ) || ( c == '+' ) || ( c == '-' ) )
{
// read timezone
parseTimezone( pos );
upFormat = Format.YEAR_MONTH_DAY_HOUR_MIN;
}
else
{
throw new ParseException( I18n.err( I18n.ERR_17048_TIME_TOO_SHORT ), 12 );
}
}
else if ( ( c == '.' ) || ( c == ',' ) )
{
// read fraction of hour
parseFractionOfHour();
pos += 1 + upFractionLength;
parseTimezone( pos );
upFormat = Format.YEAR_MONTH_DAY_HOUR_FRACTION;
}
else if ( ( c == 'Z' ) || ( c == '+' ) || ( c == '-' ) )
{
// read timezone
parseTimezone( pos );
upFormat = Format.YEAR_MONTH_DAY_HOUR;
}
else
{
throw new ParseException( I18n.err( I18n.ERR_17049_INVALID_GENERALIZED_TIME ), 10 );
}
// this calculates and verifies the calendar
/* Not sure we should do that... */
try
{
calendar.getTimeInMillis();
}
catch ( IllegalArgumentException iae )
{
throw new ParseException( I18n.err( I18n.ERR_17050_INVALID_DATE_TIME ), 0 );
}
calendar.setLenient( true );
}