/* * Copyright 2011 Brian Rosenberger (Brutex Network) * * Licensed 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 net.brutex.xservices.ws.impl; import java.math.BigInteger; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.TimeZone; import javax.jws.WebService; import net.brutex.xservices.types.DateFormatType; import net.brutex.xservices.types.DateInfoExtendedType; import net.brutex.xservices.types.DateInfoType; import net.brutex.xservices.types.DateTimeUnits; import net.brutex.xservices.types.TimeZoneType; import net.brutex.xservices.util.BrutexNamespaces; import net.brutex.xservices.ws.DateService; import net.brutex.xservices.ws.XServicesFault; /** * @author Brian Rosenberger * */ @WebService(targetNamespace = BrutexNamespaces.WS_XSERVICES, endpointInterface = "net.brutex.xservices.ws.DateService", serviceName = DateService.SERVICE_NAME) public class DateServiceImpl implements DateService { private static String ERR_INVALIDFORMAT = "Invalid format pattern."; private static String ERR_INVALIDTIMEZONE = "Invalid timezone."; public DateInfoType getDate() throws XServicesFault { GregorianCalendar c = new GregorianCalendar(); DateInfoType dateinfo = new DateInfoType(c, TimeZone.getDefault()); return dateinfo; } public DateInfoExtendedType getDateExtended() throws XServicesFault { GregorianCalendar c = new GregorianCalendar(); DateInfoExtendedType dateinfo = new DateInfoExtendedType(c, TimeZone.getDefault()); return dateinfo; } public BigInteger getTimestamp() { Date d = new Date(); long l = d.getTime(); return new BigInteger(Long.toString(l)); } public BigInteger getTimestamp2() { Date d = new Date(); long l = d.getTime() / 1000; return new BigInteger(Long.toString(l)); } public String getInTimezone(Date date, String timezone) throws XServicesFault { if (!isValidTimezone(timezone)) throw new XServicesFault(ERR_INVALIDTIMEZONE); TimeZone targetzone = TimeZone.getTimeZone(timezone); String targetstring = DateFormatType.ISO8601.format(date, null, targetzone); return targetstring; } public String formatDate(Date cal, DateFormatType format) throws XServicesFault { return format.format(cal, null, null); } public String formatDateAdvanced(Date cal, String format) throws XServicesFault { String result = null; SimpleDateFormat f = new SimpleDateFormat(format); result = f.format(cal); return result; } public Date parseDate(String s, DateFormatType format, String timezone) throws XServicesFault { if (timezone == null | timezone.equals("")) timezone = TimeZone.getDefault().getID(); if (!isValidTimezone(timezone)) throw new XServicesFault(ERR_INVALIDTIMEZONE); try { return format.parse(s, null, TimeZone.getTimeZone(timezone)); } catch (ParseException e) { throw new XServicesFault(e); } } public GregorianCalendar parseDateAdvanced(String s, String format, String timezone) throws XServicesFault { SimpleDateFormat f = null; Date date = null; if (timezone == null | timezone.equals("")) timezone = TimeZone.getDefault().getID(); if (!isValidTimezone(timezone)) throw new XServicesFault(ERR_INVALIDTIMEZONE); try { f = new SimpleDateFormat(format); date = f.parse(s); } catch (IllegalArgumentException e) { throw new XServicesFault(ERR_INVALIDFORMAT + e.getMessage()); } catch (ParseException e) { throw new XServicesFault("Cannot parse date: " + e.getMessage()); } GregorianCalendar cal = new GregorianCalendar(); cal.setTimeZone(TimeZone.getTimeZone(timezone)); cal.setTime(date); return cal; } public BigInteger dateTimeDiff(Date fromCal, Date toCal) throws XServicesFault { long diff = toCal.getTime() - fromCal.getTime(); BigInteger d = new BigInteger(String.valueOf(diff), 10); return d; } public BigInteger dateTimeDiff2(Date fromCal, Date toCal, DateTimeUnits unit) throws XServicesFault { BigInteger d = dateTimeDiff(fromCal, toCal); switch (unit) { case SECONDS: d = d.divide(new BigInteger("1000")); break; case MINUTES: d = d.divide(new BigInteger("60000")); break; case HOURS: d = d.divide(new BigInteger("3600000")); break; case DAYS: d = d.divide(new BigInteger("86400000")); break; case YEARS: d = d.divide(new BigInteger("31536000000")); break; } return d; } public GregorianCalendar dateAdd(GregorianCalendar cal, BigInteger value, DateTimeUnits unit) throws XServicesFault { switch (unit) { case SECONDS: cal.add(GregorianCalendar.SECOND, value.intValue()); break; case MINUTES: cal.add(GregorianCalendar.MINUTE, value.intValue()); break; case HOURS: cal.add(GregorianCalendar.HOUR_OF_DAY, value.intValue()); break; case DAYS: cal.add(GregorianCalendar.DAY_OF_MONTH, value.intValue()); break; case YEARS: cal.add(GregorianCalendar.YEAR, value.intValue()); break; default: cal.add(GregorianCalendar.MILLISECOND, value.intValue()); } return cal; } private boolean isValidTimezone(String id) { boolean yes = false; for (String s : TimeZone.getAvailableIDs()) { if (s.equals(id)) { yes = true; break; } } return yes; } public List getTimezones() { List output = new ArrayList(); for (String s : TimeZone.getAvailableIDs()) { output.add(new TimeZoneType(TimeZone.getTimeZone(s))); } return output; } }