/***************************************************************************
* Copyright (C) by Fabrizio Montesi *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Library General Public License as *
* published by the Free Software Foundation; either version 2 of the *
* License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* For details about the authors of this software, see the AUTHORS file. *
***************************************************************************/
package joliex.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import jolie.net.CommMessage;
import jolie.runtime.FaultException;
import jolie.runtime.JavaService;
import jolie.runtime.Value;
import jolie.runtime.ValueVector;
import jolie.runtime.embedding.RequestResponse;
public class TimeService extends JavaService
{
protected class TimeThread extends Thread
{
private final long waitTime;
private final String callbackOperation;
private final Value callbackValue;
private final TimeService parent;
public TimeThread( TimeService parent, long waitTime, String callbackOperation, Value callbackValue )
{
this.waitTime = waitTime;
this.callbackOperation =
( callbackOperation == null ) ? "timeout" : callbackOperation;
this.callbackValue =
( callbackValue == null ) ? Value.create() : callbackValue;
this.parent = parent;
}
@Override
public void run()
{
try {
Thread.sleep( waitTime );
parent.sendMessage( CommMessage.createRequest( callbackOperation, "/", callbackValue ) );
} catch( InterruptedException e ) {}
}
}
private TimeThread thread = null;
private final DateFormat dateFormat, dateTimeFormat;
public TimeService()
{
dateFormat = DateFormat.getDateInstance( DateFormat.SHORT );
dateTimeFormat = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.MEDIUM );
}
@Override
protected void finalize()
{
if ( thread != null ) {
thread.interrupt();
}
}
private void launchTimeThread( long waitTime, String callbackOperation, Value callbackValue )
{
waitTime = ( waitTime > 0 ) ? waitTime : 0L;
if ( thread != null ) {
thread.interrupt();
}
thread = new TimeThread( this, waitTime, callbackOperation, callbackValue );
thread.start();
}
public void setNextTimeout( Value request )
{
long waitTime = request.intValue();
String callbackOperation = null;
ValueVector vec;
Value callbackValue = null;
if ( (vec=request.children().get( "operation" )) != null ) {
callbackOperation = vec.first().strValue();
}
if ( (vec=request.children().get( "message" )) != null ) {
callbackValue = vec.first();
}
launchTimeThread( waitTime, callbackOperation, callbackValue );
}
public void setNextTimeoutByDateTime( Value request )
{
long waitTime = 0;
try {
synchronized( dateTimeFormat ) {
Date date = dateTimeFormat.parse( request.strValue() );
waitTime = date.getTime() - (new Date()).getTime();
}
} catch( ParseException e ) {}
String callbackOperation = null;
ValueVector vec;
Value callbackValue = null;
if ( (vec=request.children().get( "operation" )) != null ) {
callbackOperation = vec.first().strValue();
}
if ( (vec=request.children().get( "message" )) != null ) {
callbackValue = vec.first();
}
launchTimeThread( waitTime, callbackOperation, callbackValue );
}
public void setNextTimeoutByTime( Value request )
{
long waitTime = 0;
try {
synchronized( dateTimeFormat ) {
String today = dateFormat.format( new Date() );
Date date = dateTimeFormat.parse( today + " " + request.strValue() );
waitTime = date.getTime() - (new Date()).getTime();
}
} catch( ParseException pe ) {}
String callbackOperation = null;
ValueVector vec;
Value callbackValue = null;
if ( (vec=request.children().get( "operation" )) != null )
callbackOperation = vec.first().strValue();
if ( (vec=request.children().get( "message" )) != null )
callbackValue = vec.first();
launchTimeThread( waitTime, callbackOperation, callbackValue );
}
@RequestResponse
public void sleep( Integer millis )
{
try {
if ( millis > 0 ) {
Thread.sleep( millis );
}
} catch ( InterruptedException e ) {
}
}
public Long getCurrentTimeMillis()
{
return System.currentTimeMillis();
}
public String getCurrentDateTime( Value request )
{
String result = null;
try {
String format;
if ( request.getFirstChild( "format" ).strValue().isEmpty() ) {
format = "dd/MM/yyyy HH:mm:ss";
} else {
format = request.getFirstChild( "format" ).strValue();
}
SimpleDateFormat sdf = new SimpleDateFormat( format );
final Date now = new Date();
result = sdf.format( now );
} catch( Exception e ) {
e.printStackTrace(); // TODO FaultException
}
return result;
}
public Value getDateTime( Value request )
{
Value result = Value.create();
try {
String format;
if ( request.getFirstChild( "format" ).strValue().isEmpty() ) {
format = "dd/MM/yyyy HH:mm:ss";
} else {
format = request.getFirstChild( "format" ).strValue();
}
long tm = request.longValue();
SimpleDateFormat sdf = new SimpleDateFormat( format );
final Date timestamp = new Date( tm );
result.setValue(sdf.format( timestamp ));
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeInMillis( timestamp.getTime() );
result.getFirstChild( "day" ).setValue( cal.get( Calendar.DAY_OF_MONTH ) );
result.getFirstChild( "month" ).setValue( cal.get( Calendar.MONTH ) + 1 );
result.getFirstChild( "year" ).setValue( cal.get( Calendar.YEAR ) );
result.getFirstChild( "hour" ).setValue( cal.get( Calendar.HOUR ) );
result.getFirstChild( "minute" ).setValue( cal.get( Calendar.MINUTE ) );
result.getFirstChild( "second" ).setValue( cal.get( Calendar.SECOND ) );
} catch( Exception e ) {
e.printStackTrace(); // TODO FaultException
}
return result;
}
/**
* @author Claudio Guidi
*/
public Value getCurrentDateValues()
{
Value v = Value.create();
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeInMillis( new Date().getTime() );
v.getFirstChild( "day" ).setValue( cal.get( Calendar.DAY_OF_MONTH ) );
v.getFirstChild( "month" ).setValue( cal.get( Calendar.MONTH ) + 1 );
v.getFirstChild( "year" ).setValue( cal.get( Calendar.YEAR ) );
return v;
}
/**
* @author Claudio Guidi
*/
public Value getDateValues( Value request )
throws FaultException
{
Value v = Value.create();
try {
String format;
if ( request.getFirstChild( "format" ).strValue().isEmpty() ) {
format = "dd/MM/yyyy";
} else {
format = request.getFirstChild( "format" ).strValue();
}
SimpleDateFormat sdf = new SimpleDateFormat( format );
GregorianCalendar cal = new GregorianCalendar();
final Date dt = sdf.parse( request.strValue() );
cal.setTimeInMillis( dt.getTime() );
v.getFirstChild( "day" ).setValue( cal.get( Calendar.DAY_OF_MONTH ) );
v.getFirstChild( "month" ).setValue( cal.get( Calendar.MONTH ) + 1 );
v.getFirstChild( "year" ).setValue( cal.get( Calendar.YEAR ) );
} catch( ParseException pe ) {
throw new FaultException( "InvalidDate", pe );
}
return v;
}
/**
* @author Balint Maschio
*/
public Value getDateTimeValues( Value request )
throws FaultException
{
SimpleDateFormat sdf= null;
Value v = Value.create();
try {
System.out.println("getDateTimeValues");
String format;
if ( request.getFirstChild( "format" ).strValue().isEmpty() ) {
format = "dd/MM/yyyy hh:ss:mm";
} else {
format = request.getFirstChild( "format" ).strValue();
}
if ( request.getFirstChild( "language" ).strValue().isEmpty() ) {
sdf = new SimpleDateFormat( format,Locale.US);
} else {
String language = request.getFirstChild( "language" ).strValue();
if (language.equals("us")){
sdf = new SimpleDateFormat( format,Locale.ENGLISH);
} else if(language.equals("it")){
sdf = new SimpleDateFormat( format,Locale.ITALIAN);
}
}
GregorianCalendar cal = new GregorianCalendar();
final Date dt = sdf.parse( request.strValue() );
cal.setTimeInMillis( dt.getTime() );
v.getFirstChild( "day" ).setValue( cal.get( Calendar.DAY_OF_MONTH ) );
v.getFirstChild( "month" ).setValue( cal.get( Calendar.MONTH ) + 1 );
v.getFirstChild( "year" ).setValue( cal.get( Calendar.YEAR ) );
v.getFirstChild( "hour" ).setValue( cal.get( Calendar.HOUR ) );
v.getFirstChild( "minute" ).setValue( cal.get( Calendar.MINUTE ) );
v.getFirstChild( "second" ).setValue( cal.get( Calendar.SECOND ) );
System.out.println("getDateTimeValues");
} catch( ParseException pe ) {
throw new FaultException( "InvalidDate", pe );
}
return v;
}
/**
* @author Balint Maschio
* 10/2011 - Fabrizio Montesi: convert to using IllegalArgumentException
* instead of regular expressions.
*/
public Value getTimeValues( Value request )
throws FaultException
{
try {
Value v = Value.create();
DateFormat sdf = new SimpleDateFormat( "kk:mm:ss" );
Date date = sdf.parse( request.strValue() );
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis( date.getTime() );
v.getFirstChild( "hour" ).setValue( calendar.get( Calendar.HOUR_OF_DAY ) );
v.getFirstChild( "minute" ).setValue( calendar.get( Calendar.MINUTE ) );
v.getFirstChild( "second" ).setValue( calendar.get( Calendar.SECOND ) );
return v;
} catch( ParseException e ) {
throw new FaultException( "InvalidTime", e );
}
}
/**
* @author Claudio Guidi
* 10/2010 - Fabrizio Montesi: some optimizations.
*/
public Value getDateDiff( Value request )
throws FaultException
{
Value v = Value.create();
try {
String format;
if ( request.hasChildren( "format" ) ) {
format = request.getFirstChild( "format" ).strValue();
} else {
format = "dd/MM/yyyy";
}
SimpleDateFormat sdf = new SimpleDateFormat( format );
final Date dt1 = sdf.parse( request.getFirstChild( "date1" ).strValue() );
final Date dt2 = sdf.parse( request.getFirstChild( "date2" ).strValue() );
Long result = new Long( (dt1.getTime() - dt2.getTime()) / (1000 * 60 * 60 * 24) );
v.setValue( result.intValue() );
} catch( ParseException pe ) {
throw new FaultException( "InvalidDate", pe );
}
return v;
}
public Value getTimeDiff( Value request )
throws FaultException
{
Value v = Value.create();
try {
DateFormat sdf = new SimpleDateFormat( "kk:mm:ss" );
final Date dt1 = sdf.parse( request.getFirstChild( "time1" ).strValue() );
final Date dt2 = sdf.parse( request.getFirstChild( "time2" ).strValue() );
Long result = new Long( (dt1.getTime() - dt2.getTime()) );
v.setValue( result.intValue() );
} catch( ParseException pe ) {
throw new FaultException( "InvalidDate", pe );
}
return v;
}
public Value getTimeFromMilliSeconds( Value request )
throws FaultException
{
Value v = Value.create();
TimeZone timeZone = TimeZone.getTimeZone( "GMT" );
Calendar calendar = Calendar.getInstance( timeZone );
calendar.setTimeInMillis( request.longValue() );
v.getFirstChild( "hour" ).setValue( calendar.get( Calendar.HOUR_OF_DAY ) );
v.getFirstChild( "minute" ).setValue( calendar.get( Calendar.MINUTE ) );
v.getFirstChild( "second" ).setValue( calendar.get( Calendar.SECOND ) );
return v;
}
public Long getTimestampFromString( Value request )
throws FaultException
{
try {
String format;
if ( request.getFirstChild( "format" ).strValue().isEmpty() ) {
format = "dd/MM/yyyy kk:mm:ss";
} else {
format = request.getFirstChild( "format" ).strValue();
}
SimpleDateFormat sdf = new SimpleDateFormat( format );
final Date dt = sdf.parse( request.strValue() );
return dt.getTime();
} catch( ParseException pe ) {
throw new FaultException( "InvalidTimestamp", pe );
}
}
}