Subversion Repositories XServices

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

/*
 *   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.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import javax.jws.WebService;

import net.brutex.xservices.types.DateFormatType;
import net.brutex.xservices.types.DateTimeUnits;
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.";
        @Override
        public GregorianCalendar getDate(String timezone) throws XServicesFault {               
                if (! isValidTimezone(timezone) ) {
                        String valid_ids = "";
                        String[] tid = TimeZone.getAvailableIDs();
                        for (String s : tid) {
                                valid_ids += s + "\n";
                        }
                        throw new XServicesFault("Please supply a valid timezone id or none. Valid timezones are:\n" + valid_ids,
                                        new Exception( ));
                }
                        if (timezone == null || timezone.length()<1 ) timezone = "GMT0";
                        GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone(timezone));
                        return c;
        }

        @Override
        public BigInteger getTimestamp() {
                Date d = new Date();
                long l = d.getTime();
                BigInteger timestamp = new BigInteger(Long.toString(l));
                return timestamp;
        }

        @Override
        public GregorianCalendar getInTimezone(GregorianCalendar cal,
                        String timezone) throws XServicesFault {
                if(! isValidTimezone(timezone)) throw new XServicesFault(ERR_INVALIDTIMEZONE);
                GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone(timezone));
                c.setTimeInMillis(cal.getTimeInMillis());
                return c;
        }
        
        @Override
        public String formatDate(GregorianCalendar cal, DateFormatType format) throws XServicesFault {
                return formatDateAdvanced(cal, format.format());
        }
        
        @Override
        public String formatDateAdvanced(GregorianCalendar cal, String format)
                        throws XServicesFault {
                String result= null;
                try {
                        SimpleDateFormat f = new SimpleDateFormat(format);
                        result = f.format(cal.getTime());
                } catch (IllegalArgumentException e) {
                        throw new XServicesFault(ERR_INVALIDFORMAT + e.getMessage());
                }
                return result;
        }
        
        @Override
        public GregorianCalendar parseDate(String s, DateFormatType format, String timezone) throws XServicesFault {
                return parseDateAdvanced(s, format.format(), timezone);
        }

        @Override
        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;
        }
        
        @Override
        public BigInteger dateTimeDiff(GregorianCalendar fromCal,
                        GregorianCalendar toCal) throws XServicesFault {
                long diff = toCal.getTimeInMillis() - fromCal.getTimeInMillis();
                BigInteger d = new BigInteger(String.valueOf(diff), 10);
                return d;
        }
        
        @Override
        public BigInteger dateTimeDiff2(GregorianCalendar fromCal,
                        GregorianCalendar 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"));
                }
                return d;
        }
        
        private boolean isValidTimezone(String id) {
                boolean yes = false;
                for( String s: TimeZone.getAvailableIDs()) {
                        if(s.equals(id)) {
                                yes = true;
                                break;
                        }
                }
                return yes;
        }

}