Package org.apache.ode.utils.xsd

Source Code of org.apache.ode.utils.xsd.Duration

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ode.utils.xsd;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Support for xml schema duration.
*
* Does NOT support negative duration, only positive!!
*/
public class Duration {
  static final Pattern PATTERN =
      Pattern.compile("P(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?((\\d+\\.?\\d*|\\.\\d+)S)?)?");
 
  static final int YEAR_MG = 1;
  static final int MONTH_MG = 2;
  static final int DAY_MG = 3;
  static final int HOUR_MG = 5;
  static final int MIN_MG = 6;
  static final int SEC_MG = 8;
 
  private int _years;
  private int _months;
  private int _days;
  private int _hours;
  private int _minutes;
  private BigDecimal _seconds;
 
  /**
   *
   */
  public Duration(String duration) {
    Matcher m = PATTERN.matcher(duration);
    if(m.matches()){
      _years = parseInt(m.group(YEAR_MG));
      _months = parseInt(m.group(MONTH_MG));
      _days = parseInt(m.group(DAY_MG));
      _hours = parseInt(m.group(HOUR_MG));
      _minutes = parseInt(m.group(MIN_MG));
      _seconds = m.group(SEC_MG) == null
        ? null : new BigDecimal(m.group(SEC_MG));   
    }
    else{
      throw new IllegalArgumentException("Bad duration: " + duration);
    }
  }
 
  /**
   * Adds current duration to a calendar object.
   * @param calendar
   */
  public void addTo(Calendar calendar){
 
    calendar.add( Calendar.YEAR, _years );
    calendar.add( Calendar.MONTH, _months );
    calendar.add( Calendar.DAY_OF_MONTH, _days );
    calendar.add( Calendar.HOUR, _hours );
    calendar.add( Calendar.MINUTE, _minutes );
    calendar.add( Calendar.SECOND,  (_seconds == null)
        ? 0 : _seconds.intValue());
   
    if(_seconds!=null) {
      BigDecimal fraction = _seconds.subtract(_seconds.setScale(0,BigDecimal.ROUND_DOWN));
      int millisec = fraction.movePointRight(3).intValue();
      calendar.add( Calendar.MILLISECOND, millisec );
    }
  }
 
  private static int parseInt(String value){
    if(value == null)
      return 0;
    else{
      return Integer.parseInt(value.substring(0, value.length()-1));
    }
  }
}
TOP

Related Classes of org.apache.ode.utils.xsd.Duration

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.