You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2014/08/31 08:24:24 UTC
svn commit: r1621562 -
/directory/shared/trunk/util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java
Author: elecharny
Date: Sun Aug 31 06:24:24 2014
New Revision: 1621562
URL: http://svn.apache.org/r1621562
Log:
o Speeding up the GeneralizedTime methods by a factor 5 by removing the use of NumberFormat.
Modified:
directory/shared/trunk/util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java
Modified: directory/shared/trunk/util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java?rev=1621562&r1=1621561&r2=1621562&view=diff
==============================================================================
--- directory/shared/trunk/util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java (original)
+++ directory/shared/trunk/util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java Sun Aug 31 06:24:24 2014
@@ -20,8 +20,6 @@
package org.apache.directory.api.util;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
@@ -352,6 +350,7 @@ public class GeneralizedTime implements
}
// this calculates and verifies the calendar
+ /* Not sure we should do that...
try
{
calendar.getTimeInMillis();
@@ -360,6 +359,7 @@ public class GeneralizedTime implements
{
throw new ParseException( I18n.err( I18n.ERR_04366 ), 0 );
}
+ */
calendar.setLenient( true );
}
@@ -677,101 +677,233 @@ public class GeneralizedTime implements
TimeZoneFormat timeZoneFormat )
{
Calendar clonedCalendar = ( Calendar ) this.calendar.clone();
+
if ( timeZoneFormat == TimeZoneFormat.Z )
{
clonedCalendar.setTimeZone( GMT );
}
+
+ // Create the result. It can contain a maximum of 23 chars
+ char[] result = new char[23];
+
+ // The starting point
+ int pos = 0;
+
+ // Inject the year
+ int year = clonedCalendar.get( Calendar.YEAR );
+
+ result[pos++] = (char)( (year/1000) + '0' );
+ year %= 1000;
+
+ result[pos++] = (char)( (year/100) + '0' );
+ year %= 100;
+
+ result[pos++] = (char)( (year/10) + '0' );
+
+ result[pos++] = (char)( (year%10) + '0' );
+
+ // Inject the month
+ int month = clonedCalendar.get( Calendar.MONTH ) + 1;
+
+ result[pos++] = (char)( (month/10) + '0' );
+
+ result[pos++] = (char)( (month%10) + '0' );
+
+ // Inject the day
+ int day = clonedCalendar.get( Calendar.DAY_OF_MONTH );
+
+ result[pos++] = (char)( (day/10) + '0' );
+
+ result[pos++] = (char)( (day%10) + '0' );
+
+ // Inject the hour
+ int hour = clonedCalendar.get( Calendar.HOUR_OF_DAY );
+
+ result[pos++] = (char)( (hour/10) + '0' );
- NumberFormat twoDigits = new DecimalFormat( "00" );
- NumberFormat fourDigits = new DecimalFormat( "00" );
- StringBuffer fractionFormat = new StringBuffer( "" );
- for ( int i = 0; i < fractionLength && i < 3; i++ )
- {
- fractionFormat.append( "0" );
- }
-
- StringBuilder sb = new StringBuilder();
- sb.append( fourDigits.format( clonedCalendar.get( Calendar.YEAR ) ) );
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.MONTH ) + 1 ) );
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.DAY_OF_MONTH ) ) );
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.HOUR_OF_DAY ) ) );
+ result[pos++] = (char)( (hour%10) + '0' );
switch ( format )
{
case YEAR_MONTH_DAY_HOUR_MIN_SEC:
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.MINUTE ) ) );
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.SECOND ) ) );
+ // Inject the minutes
+ int minute = clonedCalendar.get( Calendar.MINUTE );
+
+ result[pos++] = (char)( (minute/10) + '0' );
+
+ result[pos++] = (char)( (minute%10) + '0' );
+
+ // Inject the seconds
+ int second = clonedCalendar.get( Calendar.SECOND );
+
+ result[pos++] = (char)( (second/10) + '0' );
+
+ result[pos++] = (char)( (second%10) + '0' );
+
break;
case YEAR_MONTH_DAY_HOUR_MIN_SEC_FRACTION:
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.MINUTE ) ) );
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.SECOND ) ) );
+ // Inject the minutes
+ minute = clonedCalendar.get( Calendar.MINUTE );
+
+ result[pos++] = (char)( (minute/10) + '0' );
+
+ result[pos++] = (char)( (minute%10) + '0' );
+
+ // Inject the seconds
+ second = clonedCalendar.get( Calendar.SECOND );
+
+ result[pos++] = (char)( (second/10) + '0' );
+
+ result[pos++] = (char)( (second%10) + '0' );
+
+ // Inject the fraction
+ if ( fractionDelimiter == FractionDelimiter.COMMA )
+ {
+ result[pos++] = ',';
+ }
+ else
+ {
+ result[pos++] = '.';
+ }
+
+ // Inject the fraction
+ int millisecond = clonedCalendar.get( Calendar.MILLISECOND );
+
+ result[pos++] = (char)( (millisecond/100) + '0' );
+ millisecond %= 100;
+
+ result[pos++] = (char)( (millisecond/10) + '0' );
+
+ //if ( millisecond > 0 )
+ result[pos++] = (char)( (millisecond%10) + '0' );
- NumberFormat fractionDigits = new DecimalFormat( fractionFormat.toString() );
- sb.append( fractionDelimiter == FractionDelimiter.COMMA ? ',' : '.' );
- sb.append( fractionDigits.format( clonedCalendar.get( Calendar.MILLISECOND ) ) );
break;
case YEAR_MONTH_DAY_HOUR_MIN:
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.MINUTE ) ) );
+ // Inject the minutes
+ minute = clonedCalendar.get( Calendar.MINUTE );
+
+ result[pos++] = (char)( (minute/10) + '0' );
+
+ result[pos++] = (char)( (minute%10) + '0' );
break;
case YEAR_MONTH_DAY_HOUR_MIN_FRACTION:
- sb.append( twoDigits.format( clonedCalendar.get( Calendar.MINUTE ) ) );
+ // Inject the minutes
+ minute = clonedCalendar.get( Calendar.MINUTE );
+
+ result[pos++] = (char)( (minute/10) + '0' );
- // sec + millis => fraction of minute
- double millisec = 1000 * clonedCalendar.get( Calendar.SECOND )
+ result[pos++] = (char)( (minute%10) + '0' );
+
+ // sec + millis => fraction of a minute
+ int fraction = 1000 * clonedCalendar.get( Calendar.SECOND )
+ clonedCalendar.get( Calendar.MILLISECOND );
- double fraction = millisec / ( 1000 * 60 );
- fractionDigits = new DecimalFormat( "0." + fractionFormat );
- sb.append( fractionDelimiter == FractionDelimiter.COMMA ? ',' : '.' );
- sb.append( fractionDigits.format( fraction ).substring( 2 ) );
+ fraction /= 60;
+
+ if ( fraction > 0 )
+ {
+ if ( fractionDelimiter == FractionDelimiter.COMMA )
+ {
+ result[pos++] = ',';
+ }
+ else
+ {
+ result[pos++] = '.';
+ }
+
+ // At this point, the fraction should be in [999, 1]
+ result[pos++] = (char)( (fraction/100) + '0' );
+ fraction %= 100;
+
+ if ( fraction > 0 )
+ {
+ result[pos++] = (char)( (fraction/10) + '0' );
+
+ if ( fraction > 0 )
+ {
+ result[pos++] = (char)( (fraction%10) + '0' );
+ }
+ }
+ }
+
break;
case YEAR_MONTH_DAY_HOUR_FRACTION:
- // min + sec + millis => fraction of minute
- millisec = 1000 * 60 * clonedCalendar.get( Calendar.MINUTE ) + 1000
+ // min + sec + millis => fraction of an hour
+ fraction = 1000 * 60 * clonedCalendar.get( Calendar.MINUTE ) + 1000
* clonedCalendar.get( Calendar.SECOND )
+ clonedCalendar.get( Calendar.MILLISECOND );
- fraction = millisec / ( 1000 * 60 * 60 );
- fractionDigits = new DecimalFormat( "0." + fractionFormat );
- sb.append( fractionDelimiter == FractionDelimiter.COMMA ? ',' : '.' );
- sb.append( fractionDigits.format( fraction ).substring( 2 ) );
+ fraction /= 60 * 60;
+ // At this point, the fraction should be in [999, 1]
+ if ( fraction > 0 )
+ {
+ if ( fractionDelimiter == FractionDelimiter.COMMA )
+ {
+ result[pos++] = ',';
+ }
+ else
+ {
+ result[pos++] = '.';
+ }
+
+ result[pos++] = (char)( (fraction/100) + '0' );
+ fraction %= 100;
+
+ if ( fraction > 0 )
+ {
+ result[pos++] = (char)( (fraction/10) + '0' );
+
+ if ( fraction > 0 )
+ {
+ result[pos++] = (char)( (fraction%10) + '0' );
+ }
+ }
+ }
+
break;
}
- if ( timeZoneFormat == TimeZoneFormat.Z && clonedCalendar.getTimeZone().hasSameRules( GMT ) )
+ if ( ( timeZoneFormat == TimeZoneFormat.Z ) && clonedCalendar.getTimeZone().hasSameRules( GMT ) )
{
- sb.append( 'Z' );
+ result[pos++] = 'Z';
}
else
{
+ // g-differential
TimeZone timeZone = clonedCalendar.getTimeZone();
int rawOffset = timeZone.getRawOffset();
- sb.append( rawOffset < 0 ? '-' : '+' );
+
+ if ( rawOffset < 0 )
+ {
+ result[pos++] = '-';
+ }
+ else
+ {
+ result[pos++] = '+';
+ }
rawOffset = Math.abs( rawOffset );
- int hour = rawOffset / ( 60 * 60 * 1000 );
+ hour = rawOffset / ( 60 * 60 * 1000 );
int minute = ( rawOffset - ( hour * 60 * 60 * 1000 ) ) / ( 1000 * 60 );
- if ( hour < 10 )
- {
- sb.append( '0' );
- }
- sb.append( hour );
+ // The offset hour
+ result[pos++] = (char)( (hour/10) + '0' );
+
+ result[pos++] = (char)( (hour%10) + '0' );
- if ( timeZoneFormat == TimeZoneFormat.DIFF_HOUR_MINUTE || timeZoneFormat == TimeZoneFormat.Z )
+ if ( ( timeZoneFormat == TimeZoneFormat.DIFF_HOUR_MINUTE ) || ( timeZoneFormat == TimeZoneFormat.Z ) )
{
- if ( minute < 10 )
- {
- sb.append( '0' );
- }
- sb.append( minute );
+ // The offset minute
+ result[pos++] = (char)( (minute/10) + '0' );
+
+ result[pos++] = (char)( (minute%10) + '0' );
}
}
- return sb.toString();
+ return new String( result, 0, pos );
}