-//##header\r
-/*\r
- *******************************************************************************\r
- * Copyright (C) 2007-2009, International Business Machines Corporation and *\r
- * others. All Rights Reserved. *\r
- *******************************************************************************\r
- */\r
-package com.ibm.icu.impl.duration;\r
-\r
-import java.text.FieldPosition;\r
-import java.util.Date;\r
-\r
-import com.ibm.icu.text.DurationFormat;\r
-import com.ibm.icu.util.ULocale;\r
-\r
-/**\r
- * @author srl\r
- */\r
-public class BasicDurationFormat extends DurationFormat {\r
- \r
- /**\r
- * \r
- */\r
- private static final long serialVersionUID = -3146984141909457700L;\r
- \r
- transient DurationFormatter formatter;\r
- transient PeriodFormatter pformatter;\r
- transient PeriodFormatterService pfs = null;\r
-\r
- public static DurationFormat getInstance(ULocale locale) {\r
- return new BasicDurationFormat(locale);\r
- }\r
-\r
-//#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)\r
-//#else\r
- private static boolean checkXMLDuration = true; \r
-//#endif\r
-\r
- public StringBuffer format(Object object, StringBuffer toAppend, FieldPosition pos) {\r
- if(object instanceof Long) {\r
- String res = formatDurationFromNow(((Long)object).longValue());\r
- return toAppend.append(res);\r
- } else if(object instanceof Date) {\r
- String res = formatDurationFromNowTo(((Date)object));\r
- return toAppend.append(res);\r
- }\r
-//#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)\r
-//#else\r
- if(checkXMLDuration) try {\r
- if(object instanceof javax.xml.datatype.Duration) {\r
- String res = formatDuration(object);\r
- return toAppend.append(res);\r
- }\r
- } catch ( NoClassDefFoundError ncdfe ) {\r
- System.err.println("Skipping XML capability");\r
- checkXMLDuration = false; // don't try again\r
- }\r
-//#endif\r
- throw new IllegalArgumentException("Cannot format given Object as a Duration");\r
-\r
- }\r
- \r
- public BasicDurationFormat() {\r
- pfs = BasicPeriodFormatterService.getInstance();\r
- formatter = pfs.newDurationFormatterFactory().getFormatter();\r
- pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).getFormatter();\r
- }\r
- /**\r
- * \r
- */\r
- public BasicDurationFormat(ULocale locale) {\r
- super(locale);\r
- pfs = BasicPeriodFormatterService.getInstance();\r
- formatter = pfs.newDurationFormatterFactory().setLocale(locale.getName()).getFormatter();\r
- pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).setLocale(locale.getName()).getFormatter();\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see com.ibm.icu.text.DurationFormat#formatDurationFrom(long, long)\r
- */\r
- public String formatDurationFrom(long duration, long referenceDate) {\r
- return formatter.formatDurationFrom(duration, referenceDate);\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see com.ibm.icu.text.DurationFormat#formatDurationFromNow(long)\r
- */\r
- public String formatDurationFromNow(long duration) {\r
- return formatter.formatDurationFromNow(duration);\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see com.ibm.icu.text.DurationFormat#formatDurationFromNowTo(java.util.Date)\r
- */\r
- public String formatDurationFromNowTo(Date targetDate) {\r
- return formatter.formatDurationFromNowTo(targetDate);\r
- }\r
-\r
-//#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)\r
-//#else\r
- /** \r
- * JDK 1.5+ only\r
- * @param o\r
- * @return\r
- * @see http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/datatype/Duration.html\r
- */\r
- public String formatDuration(Object obj) {\r
- javax.xml.datatype.DatatypeConstants.Field inFields[] = { \r
- javax.xml.datatype.DatatypeConstants.YEARS,\r
- javax.xml.datatype.DatatypeConstants.MONTHS,\r
- javax.xml.datatype.DatatypeConstants.DAYS,\r
- javax.xml.datatype.DatatypeConstants.HOURS,\r
- javax.xml.datatype.DatatypeConstants.MINUTES,\r
- javax.xml.datatype.DatatypeConstants.SECONDS,\r
- };\r
- TimeUnit outFields[] = { \r
- TimeUnit.YEAR,\r
- TimeUnit.MONTH,\r
- TimeUnit.DAY,\r
- TimeUnit.HOUR,\r
- TimeUnit.MINUTE,\r
- TimeUnit.SECOND,\r
- };\r
-\r
- javax.xml.datatype.Duration inDuration = (javax.xml.datatype.Duration)obj;\r
- Period p = null;\r
- javax.xml.datatype.Duration duration = inDuration;\r
- boolean inPast = false;\r
- if(inDuration.getSign()<0) {\r
- duration = inDuration.negate();\r
- inPast = true;\r
- }\r
- // convert a Duration to a Period\r
- boolean sawNonZero = false; // did we have a set, non-zero field?\r
- for(int i=0;i<inFields.length;i++) {\r
- if(duration.isSet(inFields[i])) {\r
- Number n = duration.getField(inFields[i]);\r
- if(n.intValue() == 0 && !sawNonZero) {\r
- continue; // ignore zero fields larger than the largest nonzero field\r
- } else {\r
- sawNonZero = true;\r
- }\r
- float floatVal = n.floatValue();\r
- // is there a 'secondary' unit to set?\r
- TimeUnit alternateUnit = null;\r
- float alternateVal = 0;\r
- \r
- // see if there is a fractional part\r
- if(outFields[i]==TimeUnit.SECOND) {\r
- double fullSeconds = floatVal;\r
- double intSeconds = Math.floor(floatVal);\r
- double millis = (fullSeconds-intSeconds)*1000.0;\r
- if(millis > 0.0) {\r
- alternateUnit = TimeUnit.MILLISECOND;\r
- alternateVal=(float)millis;\r
- floatVal=(float)intSeconds;\r
- }\r
- }\r
- \r
- if(p == null) {\r
- p = Period.at(floatVal, outFields[i]);\r
- } else {\r
- p = p.and(floatVal, outFields[i]);\r
- }\r
- \r
- if(alternateUnit != null) {\r
- p = p.and(alternateVal, alternateUnit); // add in MILLISECONDs\r
- }\r
- }\r
- }\r
- \r
- if(p == null) {\r
- // no fields set = 0 seconds\r
- return formatDurationFromNow(0);\r
- } else {\r
- if(inPast) {// was negated, above.\r
- p = p.inPast();\r
- } else {\r
- p = p.inFuture();\r
- }\r
- }\r
- \r
- // now, format it.\r
- return pformatter.format(p);\r
- }\r
-//#endif\r
-}\r
+//##header J2SE15
+/*
+ *******************************************************************************
+ * Copyright (C) 2007-2009, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ */
+package com.ibm.icu.impl.duration;
+
+import java.text.FieldPosition;
+import java.util.Date;
+
+import com.ibm.icu.text.DurationFormat;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * @author srl
+ */
+public class BasicDurationFormat extends DurationFormat {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -3146984141909457700L;
+
+ transient DurationFormatter formatter;
+ transient PeriodFormatter pformatter;
+ transient PeriodFormatterService pfs = null;
+
+ public static DurationFormat getInstance(ULocale locale) {
+ return new BasicDurationFormat(locale);
+ }
+
+//#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)
+//#else
+ private static boolean checkXMLDuration = true;
+//#endif
+
+ public StringBuffer format(Object object, StringBuffer toAppend, FieldPosition pos) {
+ if(object instanceof Long) {
+ String res = formatDurationFromNow(((Long)object).longValue());
+ return toAppend.append(res);
+ } else if(object instanceof Date) {
+ String res = formatDurationFromNowTo(((Date)object));
+ return toAppend.append(res);
+ }
+//#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)
+//#else
+ if(checkXMLDuration) try {
+ if(object instanceof javax.xml.datatype.Duration) {
+ String res = formatDuration(object);
+ return toAppend.append(res);
+ }
+ } catch ( NoClassDefFoundError ncdfe ) {
+ System.err.println("Skipping XML capability");
+ checkXMLDuration = false; // don't try again
+ }
+//#endif
+ throw new IllegalArgumentException("Cannot format given Object as a Duration");
+
+ }
+
+ public BasicDurationFormat() {
+ pfs = BasicPeriodFormatterService.getInstance();
+ formatter = pfs.newDurationFormatterFactory().getFormatter();
+ pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).getFormatter();
+ }
+ /**
+ *
+ */
+ public BasicDurationFormat(ULocale locale) {
+ super(locale);
+ pfs = BasicPeriodFormatterService.getInstance();
+ formatter = pfs.newDurationFormatterFactory().setLocale(locale.getName()).getFormatter();
+ pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).setLocale(locale.getName()).getFormatter();
+ }
+
+ /* (non-Javadoc)
+ * @see com.ibm.icu.text.DurationFormat#formatDurationFrom(long, long)
+ */
+ public String formatDurationFrom(long duration, long referenceDate) {
+ return formatter.formatDurationFrom(duration, referenceDate);
+ }
+
+ /* (non-Javadoc)
+ * @see com.ibm.icu.text.DurationFormat#formatDurationFromNow(long)
+ */
+ public String formatDurationFromNow(long duration) {
+ return formatter.formatDurationFromNow(duration);
+ }
+
+ /* (non-Javadoc)
+ * @see com.ibm.icu.text.DurationFormat#formatDurationFromNowTo(java.util.Date)
+ */
+ public String formatDurationFromNowTo(Date targetDate) {
+ return formatter.formatDurationFromNowTo(targetDate);
+ }
+
+//#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)
+//#else
+ /**
+ * JDK 1.5+ only
+ * @param o
+ * @return
+ * @see http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/datatype/Duration.html
+ */
+ public String formatDuration(Object obj) {
+ javax.xml.datatype.DatatypeConstants.Field inFields[] = {
+ javax.xml.datatype.DatatypeConstants.YEARS,
+ javax.xml.datatype.DatatypeConstants.MONTHS,
+ javax.xml.datatype.DatatypeConstants.DAYS,
+ javax.xml.datatype.DatatypeConstants.HOURS,
+ javax.xml.datatype.DatatypeConstants.MINUTES,
+ javax.xml.datatype.DatatypeConstants.SECONDS,
+ };
+ TimeUnit outFields[] = {
+ TimeUnit.YEAR,
+ TimeUnit.MONTH,
+ TimeUnit.DAY,
+ TimeUnit.HOUR,
+ TimeUnit.MINUTE,
+ TimeUnit.SECOND,
+ };
+
+ javax.xml.datatype.Duration inDuration = (javax.xml.datatype.Duration)obj;
+ Period p = null;
+ javax.xml.datatype.Duration duration = inDuration;
+ boolean inPast = false;
+ if(inDuration.getSign()<0) {
+ duration = inDuration.negate();
+ inPast = true;
+ }
+ // convert a Duration to a Period
+ boolean sawNonZero = false; // did we have a set, non-zero field?
+ for(int i=0;i<inFields.length;i++) {
+ if(duration.isSet(inFields[i])) {
+ Number n = duration.getField(inFields[i]);
+ if(n.intValue() == 0 && !sawNonZero) {
+ continue; // ignore zero fields larger than the largest nonzero field
+ } else {
+ sawNonZero = true;
+ }
+ float floatVal = n.floatValue();
+ // is there a 'secondary' unit to set?
+ TimeUnit alternateUnit = null;
+ float alternateVal = 0;
+
+ // see if there is a fractional part
+ if(outFields[i]==TimeUnit.SECOND) {
+ double fullSeconds = floatVal;
+ double intSeconds = Math.floor(floatVal);
+ double millis = (fullSeconds-intSeconds)*1000.0;
+ if(millis > 0.0) {
+ alternateUnit = TimeUnit.MILLISECOND;
+ alternateVal=(float)millis;
+ floatVal=(float)intSeconds;
+ }
+ }
+
+ if(p == null) {
+ p = Period.at(floatVal, outFields[i]);
+ } else {
+ p = p.and(floatVal, outFields[i]);
+ }
+
+ if(alternateUnit != null) {
+ p = p.and(alternateVal, alternateUnit); // add in MILLISECONDs
+ }
+ }
+ }
+
+ if(p == null) {
+ // no fields set = 0 seconds
+ return formatDurationFromNow(0);
+ } else {
+ if(inPast) {// was negated, above.
+ p = p.inPast();
+ } else {
+ p = p.inFuture();
+ }
+ }
+
+ // now, format it.
+ return pformatter.format(p);
+ }
+//#endif
+}