/** * 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.cxf.ws.eventing.shared.utils; import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.cxf.ws.eventing.ExpirationType; public final class DurationAndDateUtil { private static DatatypeFactory factory; static { try { factory = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException ex) { throw new RuntimeException( "Cannot instantiate a DatatypeFactory required for unmarshalling " + "to XMLGregorianCalendar and Duration", ex); } } private DurationAndDateUtil() { } public static Duration parseDuration(String input) throws IllegalArgumentException { return factory.newDuration(input); } public static XMLGregorianCalendar parseXMLGregorianCalendar(String input) throws IllegalArgumentException { return factory.newXMLGregorianCalendar(input); } public static boolean isXMLGregorianCalendar(String input) { try { factory.newXMLGregorianCalendar(input); return true; } catch (IllegalArgumentException ex) { return false; } } public static boolean isDuration(String input) { try { factory.newDuration(input); return true; } catch (IllegalArgumentException ex) { return false; } } public static Object parseDurationOrTimestamp(String input) throws IllegalArgumentException { Object ret; try { ret = factory.newDuration(input); } catch (Exception e) { ret = factory.newXMLGregorianCalendar(input); } return ret; } public static String convertToXMLString(Object input) { if (input instanceof XMLGregorianCalendar) { return ((XMLGregorianCalendar)input).toXMLFormat(); } if (input instanceof Duration) { return ((Duration)input).toString(); } throw new IllegalArgumentException( "convertToXMLString requires either an instance of XMLGregorianCalendar or Duration"); } public static ExpirationType toExpirationTypeContainingGregorianCalendar(XMLGregorianCalendar date) { ExpirationType et = new ExpirationType(); et.setValue(date.toXMLFormat()); return et; } public static ExpirationType toExpirationTypeContainingDuration(XMLGregorianCalendar date) { ExpirationType et = new ExpirationType(); XMLGregorianCalendar now = factory.newXMLGregorianCalendar(new GregorianCalendar()); XMLGregorianCalendar then = factory.newXMLGregorianCalendar(date.toGregorianCalendar()); long durationMillis = then.toGregorianCalendar().getTimeInMillis() - now.toGregorianCalendar().getTimeInMillis(); Duration duration = factory.newDuration(durationMillis); et.setValue(duration.toString()); return et; } public static boolean isPT0S(Duration duration) { return duration.toString().equals("PT0S"); } }