/**
  * Obtain an ISO 8601:2004 string representation of the duration given.
  *
  * @param duration
  * @return the duration string (eg. P1Y3M, PT6H30M, ...)
  */
 public static String formatISO8601Duration(final Duration duration) {
   StringBuilder result = new StringBuilder("P");
   if (duration.getYears() > 0) {
     result.append(duration.getYears()).append('Y');
   }
   if (duration.getMonths() > 0) {
     result.append(duration.getMonths()).append('M');
   }
   if (duration.getHours() > 0 || duration.getMinutes() > 0 || duration.getSeconds() > 0) {
     result.append('T');
     if (duration.getHours() > 0) {
       result.append(duration.getHours()).append('H');
     }
     if (duration.getMinutes() > 0) {
       result.append(duration.getMinutes()).append('M');
     }
     if (duration.getSeconds() > 0) {
       result.append(duration.getSeconds()).append('S');
     }
   }
   return result.toString();
 }
 public long convertToMillis(Duration duration) {
   long millis = duration.getMillis();
   millis += duration.getSeconds() * secondInMillis;
   millis += duration.getMinutes() * minuteInMillis;
   millis += duration.getHours() * hourInMillis;
   if (duration.isBusinessTime()) {
     millis += duration.getDays() * businessDayInMillis;
     millis += duration.getWeeks() * businessWeekInMillis;
     millis += duration.getMonths() * businessMonthInMillis;
     millis += duration.getYears() * businessYearInMillis;
   } else {
     millis += duration.getDays() * dayInMillis;
     millis += duration.getWeeks() * weekInMillis;
     millis += duration.getMonths() * monthInMillis;
     millis += duration.getYears() * yearInMillis;
   }
   return millis;
 }
Exemple #3
0
  /**
   * Adds a Duration to this Date/Time type as defined in <a
   * href="http://www.w3.org/TR/xmlschema-2/#adding-durations-to-dateTimes">Adding Duration to
   * dateTimes (W3C XML Schema, part 2 appendix E).</a> This version is using the algorithm defined
   * in the document from W3C, next version may optimize it.
   *
   * @param duration the duration to add
   */
  public void addDuration(Duration duration) {
    int temp = 0;
    int carry = 0;
    int sign = (duration.isNegative()) ? -1 : 1;
    // don't use getter methods but use direct field access for dateTime
    // in order to have the behaviour defined in the Recommendation document
    // Months
    try {
      temp = _month + sign * duration.getMonth();
      carry = fQuotient(temp - 1, 12);
      temp = modulo(temp - 1, 12) + 1;
      this.setMonth((short) temp);
    } catch (OperationNotSupportedException e) {
      // if there is no Month field in the date/time datatypes
      // we do nothing else we throw a runTime exception
      if (!((this instanceof Time) || (this instanceof GYear) || (this instanceof GDay))) throw e;
    }
    // Years
    try {
      temp = _century * 100 + _year + sign * duration.getYear() + carry;
      short century = (short) (temp / 100);
      temp = temp % 100;
      this.setCentury(century);
      this.setYear((short) temp);
    } catch (OperationNotSupportedException e) {
      // if there is no Year field in the date/time datatypes
      // we do nothing else we throw a runTime exception
      if (!((this instanceof Time) || (this instanceof GMonthDay))) throw e;
    }
    // Seconds
    try {
      temp = _second + sign * duration.getSeconds();
      carry = fQuotient(temp, 60);
      temp = modulo(temp, 60);
      this.setSecond((short) temp, this.getMilli());
    } catch (OperationNotSupportedException e) {
      // if there is no Second field in the date/time datatypes
      // we do nothing else we throw a runTime exception
      if (this instanceof Time) throw e;
    }
    // Minutes
    try {
      temp = _minute + sign * duration.getMinute() + carry;
      carry = fQuotient(temp, 60);
      temp = modulo(temp, 60);
      this.setMinute((short) temp);
    } catch (OperationNotSupportedException e) {
      // if there is no Minute field in the date/time datatypes
      // we do nothing else we throw a runTime exception
      if (this instanceof Time) throw e;
    }
    // Hours
    try {
      temp = _hour + sign * duration.getHour() + carry;
      carry = fQuotient(temp, 24);
      temp = modulo(temp, 24);
      this.setHour((short) temp);
    } catch (OperationNotSupportedException e) {
      // if there is no Hour field in the date/time datatypes
      // we do nothing else we throw a runTime exception
      if (this instanceof Time) throw e;
    }
    // Days
    try {
      int maxDay = maxDayInMonthFor(_century, _year, _month);
      int tempDay = (_day > maxDay) ? maxDay : _day;
      // how to handle day < 1????this makes sense only if we create a new
      // dateTime type (rare situation)
      tempDay = tempDay + sign * duration.getDay() + carry;
      while (true) {
        if (tempDay < 1) {
          tempDay = (short) (tempDay + maxDayInMonthFor(_century, _year, _month - 1));
          this.setDay((short) tempDay);
          carry = -1;
        } else if (tempDay > maxDay) {
          tempDay = (short) (tempDay - (short) maxDay);
          carry = 1;
        } else break;
        try {
          temp = _month + carry;
          this.setMonth((short) (modulo(temp - 1, 12) + 1));
          temp = fQuotient(temp - 1, 12);
          temp = this.getCentury() * 100 + this.getYear() + temp;
          short century = (short) (temp / 100);
          temp = temp % 100;
          this.setCentury(century);
          this.setYear((short) temp);
        } catch (OperationNotSupportedException e) {
          // --if there is no Year field in the date/time datatypes
          // --we do nothing else we throw a runTime exception
          if (!((this instanceof Time) || (this instanceof GMonthDay))) throw e;
        }
      }
      this.setDay((short) tempDay);

    } catch (OperationNotSupportedException e) {
      // if there is no Month field in the date/time datatypes
      // we do nothing else we throw a runTime exception
      if (!((this instanceof Time) || (this instanceof GYearMonth) || (this instanceof GMonth)))
        throw e;
    }
  } // addDuration
 private static int toSeconds(Duration timeout) {
   return timeout != null ? (int) timeout.getSeconds() : 0;
 }
Exemple #5
0
  private static void sendXQueryResponse(HttpServletResponse res, Object o) throws IOException {
    // Make sure to leave the status code alone.  It defaults to 200, but sometimes
    // callers of this method will have set it to a custom code.
    res.setContentType("x-marklogic/xquery; charset=UTF-8");
    // res.setContentType("text/plain");
    Writer writer = res.getWriter(); // care to handle errors later?

    if (o == null) {
      writer.write("()");
    } else if (o instanceof byte[]) {
      writer.write("binary {'");
      writer.write(hexEncode((byte[]) o));
      writer.write("'}");
    } else if (o instanceof Object[]) {
      Object[] arr = (Object[]) o;
      writer.write("(");
      for (int i = 0; i < arr.length; i++) {
        sendXQueryResponse(res, arr[i]);
        if (i + 1 < arr.length) writer.write(", ");
      }
      writer.write(")");
    } else if (o instanceof String) {
      writer.write("'");
      writer.write(escapeSingleQuotes(o.toString()));
      writer.write("'");
    } else if (o instanceof Integer) {
      writer.write("xs:int(");
      writer.write(o.toString());
      writer.write(")");
    } else if (o instanceof Long) {
      writer.write("xs:integer(");
      writer.write(o.toString());
      writer.write(")");
    } else if (o instanceof Float) {
      Float flt = (Float) o;
      writer.write("xs:float(");
      if (flt.equals(Float.POSITIVE_INFINITY)) {
        writer.write("'INF'");
      } else if (flt.equals(Float.NEGATIVE_INFINITY)) {
        writer.write("'-INF'");
      } else if (flt.equals(Float.NaN)) {
        writer.write("fn:number(())"); // poor man's way to write NaN
      } else {
        writer.write(o.toString());
      }
      writer.write(")");
    } else if (o instanceof Double) {
      Double dbl = (Double) o;
      writer.write("xs:double(");
      if (dbl.equals(Double.POSITIVE_INFINITY)) {
        writer.write("'INF'");
      } else if (dbl.equals(Double.NEGATIVE_INFINITY)) {
        writer.write("'-INF'");
      } else if (dbl.equals(Double.NaN)) {
        writer.write("fn:number(())"); // poor man's way to write NaN
      } else {
        writer.write(o.toString());
      }
      writer.write(")");
    } else if (o instanceof Boolean) {
      writer.write("xs:boolean('");
      writer.write(o.toString());
      writer.write("')");
    } else if (o instanceof BigDecimal) {
      writer.write("xs:decimal(");
      writer.write(o.toString());
      writer.write(")");
    } else if (o instanceof Date) {
      // We want something like: 2006-04-30T01:28:30.499-07:00
      // We format to get:       2006-04-30T01:28:30.499-0700
      // Then we add in the colon
      writer.write("xs:dateTime('");
      String d = dateFormat.format((Date) o);
      writer.write(d.substring(0, d.length() - 2));
      writer.write(":");
      writer.write(d.substring(d.length() - 2));
      writer.write("')");
    } else if (o instanceof XMLGregorianCalendar) {
      XMLGregorianCalendar greg = (XMLGregorianCalendar) o;
      QName type = greg.getXMLSchemaType();
      if (type.equals(DatatypeConstants.DATETIME)) {
        writer.write("xs:dateTime('");
      } else if (type.equals(DatatypeConstants.DATE)) {
        writer.write("xs:date('");
      } else if (type.equals(DatatypeConstants.TIME)) {
        writer.write("xs:time('");
      } else if (type.equals(DatatypeConstants.GYEARMONTH)) {
        writer.write("xs:gYearMonth('");
      } else if (type.equals(DatatypeConstants.GMONTHDAY)) {
        writer.write("xs:gMonthDay('");
      } else if (type.equals(DatatypeConstants.GYEAR)) {
        writer.write("xs:gYear('");
      } else if (type.equals(DatatypeConstants.GMONTH)) {
        writer.write("xs:gMonth('");
      } else if (type.equals(DatatypeConstants.GDAY)) {
        writer.write("xs:gDay('");
      }
      writer.write(greg.toXMLFormat());
      writer.write("')");
    } else if (o instanceof Duration) {
      Duration dur = (Duration) o;
      /*
      // The following fails on Xerces
      QName type = dur.getXMLSchemaType();
      if (type.equals(DatatypeConstants.DURATION)) {
        writer.write("xs:duration('");
      }
      else if (type.equals(DatatypeConstants.DURATION_DAYTIME)) {
        writer.write("xdt:dayTimeDuration('");
      }
      else if (type.equals(DatatypeConstants.DURATION_YEARMONTH)) {
        writer.write("xdt:yearMonthDuration('");
      }
      */
      // If no years or months, must be DURATION_DAYTIME
      if (dur.getYears() == 0 && dur.getMonths() == 0) {
        writer.write("xdt:dayTimeDuration('");
      }
      // If has years or months but nothing else, must be DURATION_YEARMONTH
      else if (dur.getDays() == 0
          && dur.getHours() == 0
          && dur.getMinutes() == 0
          && dur.getSeconds() == 0) {
        writer.write("xdt:yearMonthDuration('");
      } else {
        writer.write("xs:duration('");
      }
      writer.write(dur.toString());
      writer.write("')");
    } else if (o instanceof org.jdom.Element) {
      org.jdom.Element elt = (org.jdom.Element) o;
      writer.write("xdmp:unquote('");
      // Because "&lt;" in XQuery is the same as "<" I need to double escape any ampersands
      writer.write(
          new org.jdom.output.XMLOutputter()
              .outputString(elt)
              .replaceAll("&", "&amp;")
              .replaceAll("'", "''"));
      writer.write("')/*"); // make sure to return the root elt
    } else if (o instanceof org.jdom.Document) {
      org.jdom.Document doc = (org.jdom.Document) o;
      writer.write("xdmp:unquote('");
      writer.write(
          new org.jdom.output.XMLOutputter()
              .outputString(doc)
              .replaceAll("&", "&amp;")
              .replaceAll("'", "''"));
      writer.write("')");
    } else if (o instanceof org.jdom.Text) {
      org.jdom.Text text = (org.jdom.Text) o;
      writer.write("text {'");
      writer.write(escapeSingleQuotes(text.getText()));
      writer.write("'}");
    } else if (o instanceof org.jdom.Attribute) {
      // <fake xmlns:pref="http://uri.com" pref:attrname="attrvalue"/>/@*:attrname
      // <fake xmlns="http://uri.com" attrname="attrvalue"/>/@*:attrname
      org.jdom.Attribute attr = (org.jdom.Attribute) o;
      writer.write("<fake xmlns");
      if ("".equals(attr.getNamespacePrefix())) {
        writer.write("=\"");
      } else {
        writer.write(":" + attr.getNamespacePrefix() + "=\"");
      }
      writer.write(attr.getNamespaceURI());
      writer.write("\" ");
      writer.write(attr.getQualifiedName());
      writer.write("=\"");
      writer.write(escapeSingleQuotes(attr.getValue()));
      writer.write("\"/>/@*:");
      writer.write(attr.getName());
    } else if (o instanceof org.jdom.Comment) {
      org.jdom.Comment com = (org.jdom.Comment) o;
      writer.write("comment {'");
      writer.write(escapeSingleQuotes(com.getText()));
      writer.write("'}");
    } else if (o instanceof org.jdom.ProcessingInstruction) {
      org.jdom.ProcessingInstruction pi = (org.jdom.ProcessingInstruction) o;
      writer.write("processing-instruction ");
      writer.write(pi.getTarget());
      writer.write(" {'");
      writer.write(escapeSingleQuotes(pi.getData()));
      writer.write("'}");
    } else if (o instanceof QName) {
      QName q = (QName) o;
      writer.write("fn:expanded-QName('");
      writer.write(escapeSingleQuotes(q.getNamespaceURI()));
      writer.write("','");
      writer.write(q.getLocalPart());
      writer.write("')");
    } else {
      writer.write(
          "error('XQuery tried to retrieve unsupported type: " + o.getClass().getName() + "')");
    }

    writer.flush();
  }