/* Copyright (c) 2007 Pentaho Corporation. All rights reserved.
* This software was developed by Pentaho Corporation and is provided under the terms
* of the GNU Lesser General Public License, Version 2.1. You may not use
* this file except in compliance with the license. If you need a copy of the license,
* please go to http://www.gnu.org/licenses/lgpl-2.1.txt. The Original Code is Pentaho
* Data Integration. The Initial Developer is Pentaho Corporation.
*
* Software distributed under the GNU Lesser Public License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
* the license for the specific language governing your rights and limitations.*/
/**********************************************************************
** **
** This Script has been modified for higher performance **
** and more functionality in December-2006, **
** by proconis GmbH / Germany **
** **
** http://www.proconis.de **
** info@proconis.de **
** **
**********************************************************************/
package com.akretion.kettle.steps.terminatooor;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import org.apache.commons.vfs.FileUtil;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileType;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.database.Database;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleFileException;
import org.pentaho.di.core.gui.SpoonFactory;
import org.pentaho.di.core.gui.SpoonInterface;
import org.pentaho.di.core.row.RowDataUtil;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.trans.step.StepInterface;
public class ScriptValuesAddedFunctions {
public static Object undefinedValue = null;
public static final long serialVersionUID = 1L;
public static final int STRING_FUNCTION = 0;
public static final int NUMERIC_FUNCTION = 1;
public static final int DATE_FUNCTION = 2;
public static final int LOGIC_FUNCTION = 3;
public static final int SPECIAL_FUNCTION = 4;
public static final int FILE_FUNCTION = 5;
public static String[] jsFunctionList = {
"appendToFile", "getTransformationName","writeToLog","getFiscalDate", "getProcessCount",
"ceil","floor", "abs", "getDayNumber", "isWorkingDay", "fireToDB", "getNextWorkingDay",
"quarter", "dateDiff", "dateAdd", "fillString","isCodepage", "ltrim", "rtrim", "lpad",
"rpad", "week", "month", "year", "str2RegExp","fileExists", "touch", "isRegExp", "date2str",
"str2date", "sendMail", "replace", "decode", "isNum","isDate", "lower", "upper", "str2num",
"num2str", "Alert", "setEnvironmentVar", "getEnvironmentVar", "LoadScriptFile", "LoadScriptFromTab",
"print", "println", "resolveIP", "trim", "substr", "getVariable", "setVariable" ,"LuhnCheck","getDigitsOnly",
"indexOf", "getOutputRowMeta", "getInputRowMeta", "createRowCopy", "putRow",
"deleteFile","createFolder","copyFile","getFileSize","isFile","isFolder","getShortFilename",
"getFileExtension","getParentFoldername","getLastModifiedTime", "trunc", "truncDate","moveFile",
};
// This is only used for reading, so no concurrency problems.
// todo: move in the real variables of the step.
// private static VariableSpace variables = Variables.getADefaultVariableSpace();
// Functions to Add
// date2num, num2date,
// fisc_date, isNull
//
public static String getDigitsOnly(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext)
{
if(ArgList.length==1)
{
return Const.getDigitsOnly((String) ArgList[0]);//TODO AKRETION ensure
}
else
{
throw new RuntimeException("The function call getDigitsOnly requires 1 argument.");
}
}
public static boolean LuhnCheck(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
boolean returnCode=false;
if(ArgList.length==1)
{
if (!isNull(ArgList) && !isUndefined(ArgList))
{
try{
int sum = 0;
int digit = 0;
int addend = 0;
boolean timesTwo = false;
String argstring = (String) ArgList[0];
for (int i = argstring.length () - 1; i >= 0; i--)
{
digit = Integer.parseInt (argstring.substring (i, i + 1));
if (timesTwo)
{
addend = digit * 2;
if (addend > 9)
{
addend -= 9;
}
}
else
{
addend = digit;
}
sum += addend;
timesTwo = !timesTwo;
}
int modulus = sum % 10;
if (modulus==0) returnCode=true;
}catch(Exception e){
//No Need to throw exception
// This means that input can not be parsed to Integer
}
}
}
else
{
throw new RuntimeException("The function call LuhnCheck requires 1 argument.");
}
return returnCode;
}
public static int indexOf(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
int returnIndex=-1;
if ( ArgList.length==2 || ArgList.length==3 )
{
if (!isNull(ArgList) && !isUndefined(ArgList))
{
String string = (String) ArgList[0];
String subString = (String) ArgList[1];
int fromIndex = 0;
if (ArgList.length==3) fromIndex = (int) Math.round((Double) ArgList[2]);
returnIndex = string.indexOf(subString, fromIndex);
}
}
else
{
throw new RuntimeException("The function call indexOf requires 2 or 3 arguments");
}
return returnIndex;
}
public static Object getTransformationName(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
Object objTranName = (String) actualObject.get("_TransformationName_");
return (String)objTranName;
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static void appendToFile(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(!isNull(ArgList) && !isUndefined(ArgList)){
try{
FileOutputStream file = new FileOutputStream((String) ArgList[0], true);
DataOutputStream out = new DataOutputStream(file);
out.writeBytes((String) ArgList[1]);
out.flush();
out.close();
}catch(Exception er){
throw new RuntimeException(er.toString());
}
}else{
throw new RuntimeException("The function call appendToFile requires arguments.");
}
}
public static Object getFiscalDate(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==2){
try{
if(isNull(ArgList)) return null;
else if(isUndefined(ArgList)) return undefinedValue;
java.util.Date dIn = (java.util.Date) ArgList[0];
Calendar startDate = Calendar.getInstance();
Calendar fisStartDate = Calendar.getInstance();
Calendar fisOffsetDate = Calendar.getInstance();
startDate.setTime(dIn);
Format dfFormatter = new SimpleDateFormat("dd.MM.yyyy");
String strOffsetDate = (String) ArgList[1] + String.valueOf(startDate.get(Calendar.YEAR));
java.util.Date dOffset = (java.util.Date)dfFormatter.parseObject(strOffsetDate);
fisOffsetDate.setTime(dOffset);
String strFisStartDate = "01.01." + String.valueOf(startDate.get(Calendar.YEAR)+1);
fisStartDate.setTime((java.util.Date)dfFormatter.parseObject(strFisStartDate));
int iDaysToAdd = (int)((startDate.getTimeInMillis() - fisOffsetDate.getTimeInMillis()) / 86400000);
fisStartDate.add(Calendar.DATE, iDaysToAdd);
return fisStartDate.getTime();
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call getFiscalDate requires 2 arguments.");
}
}
public static double getProcessCount(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try{
Object scmO = actualObject.get("_step_");
StepInterface scm = (StepInterface) scmO;
String strType = (String) ArgList[0];
if(strType.toLowerCase().equals("i")) return (double)scm.getLinesInput();
else if(strType.toLowerCase().equals("o")) return (double)scm.getLinesOutput();
else if(strType.toLowerCase().equals("r")) return (double)scm.getLinesRead();
else if(strType.toLowerCase().equals("u")) return (double)scm.getLinesUpdated();
else if(strType.toLowerCase().equals("w")) return (double)scm.getLinesWritten();
else if(strType.toLowerCase().equals("e")) return (double)scm.getLinesRejected();
else return 0;
}catch(Exception e){
//throw new RuntimeException(e.toString());
return 0;
}
}else{
throw new RuntimeException("The function call getProcessCount requires 1 argument.");
}
}
public static void writeToLog(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
switch(ArgList.length){
case 1:
try{
if(!isNull(ArgList) && !isUndefined(ArgList)){
Object scmO = actualObject.get("_step_");
ScriptValuesMod scm = (ScriptValuesMod) scmO;
String strMessage = (String) ArgList[0];
scm.logDebug(strMessage);
}
}catch(Exception e){
}
break;
case 2:
try{
if(!isNull(ArgList) && !isUndefined(ArgList)){
Object scmO = actualObject.get("_step_");
ScriptValuesMod scm = (ScriptValuesMod) scmO;
String strType = (String) ArgList[0];
String strMessage = (String) ArgList[1];
if(strType.toLowerCase().equals("b")) scm.logBasic(strMessage);
else if(strType.toLowerCase().equals("d")) scm.logDebug(strMessage);
else if(strType.toLowerCase().equals("l")) scm.logDetailed(strMessage);
else if(strType.toLowerCase().equals("e")) scm.logError(strMessage);
else if(strType.toLowerCase().equals("m")) scm.logMinimal(strMessage);
else if(strType.toLowerCase().equals("r")) scm.logRowlevel(strMessage);
}
}catch(Exception e){
}
break;
default:
throw new RuntimeException("The function call writeToLog requires 1 or 2 arguments.");
}
}
private static boolean isUndefined(Object ArgList){
return isUndefined(new Object[]{ArgList}, new int[]{0});
}
private static boolean isUndefined(Object[] ArgList, int[] iArrToCheck){
for(int i=0;i<iArrToCheck.length;i++){
if(ArgList[iArrToCheck[i]].equals(undefinedValue)) return true;
}
return false;
}
private static boolean isNull(Object ArgList){
return isNull(new Object[]{ArgList}, new int[]{0});
}
private static boolean isNull(Object[] ArgList){
for(int i=0;i<ArgList.length;i++){
if(ArgList[i] == null || ArgList[i].equals(null) ) return true;
}
return false;
}
private static boolean isNull(Object[] ArgList, int[] iArrToCheck){
for(int i=0;i<iArrToCheck.length;i++){
if(ArgList[iArrToCheck[i]] == null || ArgList[iArrToCheck[i]].equals(null) ) return true;
}
return false;
}
public static Object abs(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
else return new Double(Math.abs((Double) ArgList[0]));
}catch(Exception e){
return null;
}
}else{
throw new RuntimeException("The function call abs requires 1 argument.");
}
}
public static Object ceil(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
else return new Double(Math.ceil((Double) ArgList[0]));
}catch(Exception e){
return null;
}
}else{
throw new RuntimeException("The function call ceil requires 1 argument.");
}
}
public static Object floor(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
else return new Double(Math.floor((Double) ArgList[0]));
}catch(Exception e){
return null;
//throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call floor requires 1 argument.");
}
}
public static Object getDayNumber(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==2){
try{
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
else{
java.util.Date dIn = (java.util.Date) ArgList[0];
String strType = (String) ArgList[1];
Calendar startDate = Calendar.getInstance();
startDate.setTime(dIn);
if(strType.toLowerCase().equals("y")) return new Double(startDate.get(Calendar.DAY_OF_YEAR));
else if(strType.toLowerCase().equals("m")) return new Double(startDate.get(Calendar.DAY_OF_MONTH));
else if(strType.toLowerCase().equals("w")) return new Double(startDate.get(Calendar.DAY_OF_WEEK));
else if(strType.toLowerCase().equals("wm")) return new Double(startDate.get(Calendar.DAY_OF_WEEK_IN_MONTH));
return new Double(startDate.get(Calendar.DAY_OF_YEAR));
}
}catch(Exception e){
return null;
//throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call getDayNumber requires 2 arguments.");
}
}
public static Object isWorkingDay(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return undefinedValue;
else{
java.util.Date dIn = (java.util.Date) ArgList[0];
Calendar startDate = Calendar.getInstance();
startDate.setTime(dIn);
if(startDate.get(Calendar.DAY_OF_WEEK)!= Calendar.SATURDAY &&startDate.get(Calendar.DAY_OF_WEEK)!= Calendar.SUNDAY) return Boolean.TRUE;
return Boolean.FALSE;
}
}catch(Exception e){
return null;
}
}else{
throw new RuntimeException("The function call isWorkingDay requires 1 argument.");
}
}
public static Object fireToDB(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
Object oRC = new Object();
if(ArgList.length==2){
try{
Object scmO = actualObject.get("_step_");
ScriptValuesMod scm = (ScriptValuesMod) scmO;
String strDBName = (String) ArgList[0];
String strSQL = (String) ArgList[1];
DatabaseMeta ci = DatabaseMeta.findDatabase(scm.getTransMeta().getDatabases(), strDBName);
if(ci==null) throw new RuntimeException("Database connection not found: "+strDBName);
ci.shareVariablesWith(scm);
Database db=new Database(scm, ci);
db.setQueryLimit(0);
try{
if (scm.getTransMeta().isUsingUniqueConnections())
{
synchronized (scm.getTrans()) { db.connect(scm.getTrans().getThreadName(), scm.getPartitionID()); }
}
else
{
db.connect(scm.getPartitionID());
}
ResultSet rs = db.openQuery(strSQL);
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int columnCount = resultSetMetaData.getColumnCount();
if(rs!=null){
List<Object[]> list = new ArrayList<Object[]>();
while(rs.next()){
Object[] objRow = new Object[columnCount];
for(int i=0;i<columnCount;i++){
objRow[i] = rs.getObject(i+1);
}
list.add(objRow);
}
Object[][] resultArr = new Object[list.size()][];
list.toArray(resultArr);
db.disconnect();
return resultArr;
}
}catch(Exception er){
throw new RuntimeException(er.toString());
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call fireToDB requires 2 arguments.");
}
return oRC;
}
public static Object dateDiff(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==3){
try{
if(isNull(ArgList, new int[]{0,1,2})) return new Double(Double.NaN);
else if(isUndefined(ArgList, new int[]{0,1,2})) return undefinedValue;
else{
java.util.Date dIn1 = (java.util.Date) ArgList[0];
java.util.Date dIn2 = (java.util.Date) ArgList[1];
String strType = (String) ArgList[2];
int iRC=0;
Calendar startDate = Calendar.getInstance();
Calendar endDate = Calendar.getInstance();
startDate.setTime(dIn1);
endDate.setTime(dIn2);
/* Changed by: Ingo Klose, SHS VIVEON AG,
* Date: 27.04.2007
*
* Calculating time differences using getTimeInMillis() leads to false results
* when crossing Daylight Savingstime borders. In order to get correct results
* the time zone offsets have to be added.
*
* Fix: 1. calculate correct milli seconds for start and end date
* 2. replace endDate.getTimeInMillis() with endL
* and startDate.getTimeInMillis() with startL
*/
long endL = endDate.getTimeInMillis() + endDate.getTimeZone().getOffset( endDate.getTimeInMillis() );
long startL = startDate.getTimeInMillis() + startDate.getTimeZone().getOffset( startDate.getTimeInMillis() );
if(strType.toLowerCase().equals("y")){
return new Double(endDate.get(Calendar.YEAR) - startDate.get(Calendar.YEAR));
}else if(strType.toLowerCase().equals("m")){
int iMonthsToAdd = (int)(endDate.get(Calendar.YEAR) - startDate.get(Calendar.YEAR)) * 12;
return new Double((endDate.get(Calendar.MONTH) - startDate.get(Calendar.MONTH)) + iMonthsToAdd);
}else if(strType.toLowerCase().equals("d")){
return new Double(((endL - startL) / 86400000));
}else if(strType.toLowerCase().equals("wd")){
int iOffset = -1;
if(endDate.before(startDate)) iOffset = 1;
while ((iOffset==1 && endL<startL) || (iOffset==-1 && endL>startL)) {
int day = endDate.get(Calendar.DAY_OF_WEEK);
if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY)) iRC++;
endDate.add(Calendar.DATE, iOffset);
endL = endDate.getTimeInMillis() + endDate.getTimeZone().getOffset( endDate.getTimeInMillis() );
}
return new Double(iRC);
}else if(strType.toLowerCase().equals("w")){
int iDays = (int)((endL - startL) / 86400000);
return new Double(iDays/7);
}else if(strType.toLowerCase().equals("ss")){
return new Double(((endL - startL) / 1000));
}else if(strType.toLowerCase().equals("mi")){
return new Double(((endL - startL) / 60000));
}else if(strType.toLowerCase().equals("hh")){
return new Double(((endL - startL) / 3600000));
}else{
return new Double(((endL - startL) / 86400000));
}
/*
* End Bugfix
*/
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call dateDiff requires 3 arguments.");
}
}
public static Object getNextWorkingDay(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
//(Date dIn){
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return undefinedValue;
java.util.Date dIn = (java.util.Date) ArgList[0];
Calendar startDate = Calendar.getInstance();
startDate.setTime(dIn);
startDate.add(Calendar.DATE,1);
while(startDate.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY || startDate.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
startDate.add(Calendar.DATE,1);
}
return startDate.getTime();
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call getNextWorkingDay requires 1 argument.");
}
}
public static Object dateAdd(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==3){
try{
if(isNull(ArgList, new int[]{0,1,2})) return null;
else if(isUndefined(ArgList, new int[]{0,1,2})) return undefinedValue;
java.util.Date dIn = (java.util.Date) ArgList[0];
String strType = (String) ArgList[1];
int iValue = (int) (Integer) ArgList[2];
Calendar cal = Calendar.getInstance();
cal.setTime(dIn);
if(strType.toLowerCase().equals("y")) cal.add(Calendar.YEAR, iValue);
else if(strType.toLowerCase().equals("m")) cal.add(Calendar.MONTH, iValue);
else if(strType.toLowerCase().equals("d")) cal.add(Calendar.DATE, iValue);
else if(strType.toLowerCase().equals("w")) cal.add(Calendar.WEEK_OF_YEAR, iValue);
else if(strType.toLowerCase().equals("wd")){
int iOffset=0;
while(iOffset < iValue) {
int day = cal.get(Calendar.DAY_OF_WEEK);
cal.add(Calendar.DATE, 1);
if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY))iOffset++;
}
}else if(strType.toLowerCase().equals("hh")) cal.add(Calendar.HOUR, iValue);
else if(strType.toLowerCase().equals("mi")) cal.add(Calendar.MINUTE, iValue);
else if(strType.toLowerCase().equals("ss")) cal.add(Calendar.SECOND, iValue);
return cal.getTime();
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call dateAdd requires 3 arguments.");
}
}
public static String fillString(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==2){
try{
if(isNull(ArgList, new int[]{0,1})) return null;
else if(isUndefined(ArgList, new int[]{0,1})) return (String)undefinedValue;
String fillChar = (String) ArgList[0];
int count = (int) (Integer) ArgList[1];
if(fillChar.length()!=1){
throw new RuntimeException("Please provide a valid Char to the fillString");
}else{
char[] chars = new char[count];
while (count>0) chars[--count] = fillChar.charAt(0);
return new String(chars);
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call fillString requires 2 arguments.");
}
}
public static Object isCodepage(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
boolean bRC = false;
if(ArgList.length==2){
try{
if(isNull(ArgList, new int[]{0,1})) return null;
else if(isUndefined(ArgList, new int[]{0,1})) return undefinedValue;
String strValueToCheck = (String) ArgList[0];
String strCodePage = (String) ArgList[1];
byte bytearray [] = strValueToCheck.getBytes();
CharsetDecoder d = Charset.forName(strCodePage).newDecoder();
CharBuffer r = d.decode(ByteBuffer.wrap(bytearray));
r.toString();
bRC=true;
}catch(Exception e){
bRC=false;
}
}else{
throw new RuntimeException("The function call isCodepage requires 2 arguments.");
}
return Boolean.valueOf(bRC);
}
public static String ltrim(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1){
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
String strValueToTrim = (String) ArgList[0];
return strValueToTrim.replaceAll("^\\s+", "");
}
else
{
throw new RuntimeException("The function call ltrim requires 1 argument.");
}
}catch(Exception e){
throw new RuntimeException("The function call ltrim is not valid : " + e.getMessage());
}
}
public static String rtrim(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1){
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
String strValueToTrim = (String) ArgList[0];
return strValueToTrim.replaceAll("\\s+$", "");
}
else
{
throw new RuntimeException("The function call rtrim requires 1 argument.");
}
}catch(Exception e){
throw new RuntimeException("The function call rtrim is not valid : " + e.getMessage());
}
}
public static String lpad(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
//(String valueToPad, String filler, int size) {
try{
if(ArgList.length==3){
if(isNull(ArgList, new int[]{0,1,2})) return null;
else if(isUndefined(ArgList, new int[]{0,1,2})) return (String)undefinedValue;
String valueToPad = (String) ArgList[0];
String filler = (String) ArgList[1];
int size = (int) (Integer) ArgList[2];
while (valueToPad.length() < size){
valueToPad = filler + valueToPad;
}
return valueToPad;
}
}catch(Exception e){
throw new RuntimeException("The function call lpad requires 3 arguments.");
}
return null;
}
public static String rpad(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==3){
if(isNull(ArgList, new int[]{0,1,2})) return null;
else if(isUndefined(ArgList, new int[]{0,1,2})) return (String)undefinedValue;
String valueToPad = (String) ArgList[0];
String filler = (String) ArgList[1];
int size = (int) (Integer) ArgList[2];
while (valueToPad.length() < size) {
valueToPad = valueToPad+filler;
}
return valueToPad;
}
}catch(Exception e){
throw new RuntimeException("The function call rpad requires 3 arguments.");
}
return null;
}
public static Object year(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1){
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
Calendar cal=Calendar.getInstance();
cal.setTime(dArg1);
return new Double(cal.get(Calendar.YEAR));
}else{
throw new RuntimeException("The function call year requires 1 argument.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static Object month(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1){
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
Calendar cal=Calendar.getInstance();
cal.setTime(dArg1);
return new Double(cal.get(Calendar.MONTH));
}else{
throw new RuntimeException("The function call month requires 1 argument.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static Object quarter(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1){
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
Calendar cal=Calendar.getInstance();
cal.setTime(dArg1);
// Patch by Ingo Klose: calendar months start at 0 in java.
int iMonth = cal.get(Calendar.MONTH);
if(iMonth<=2) return new Double(1);
else if(iMonth<=5) return new Double(2);
else if(iMonth<=8) return new Double(3);
else return new Double(4);
}else{
throw new RuntimeException("The function call quarter requires 1 argument.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static Object week(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1){
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
Calendar cal=Calendar.getInstance();
cal.setTime(dArg1);
return new Double(cal.get(Calendar.WEEK_OF_YEAR));
}else{
throw new RuntimeException("The function call week requires 1 argument.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static Object str2RegExp(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String[] strArr=null;
if(ArgList.length==2){
try{
if(isNull(ArgList,new int[]{0,1})) return null;
else if(isUndefined(ArgList,new int[]{0,1})) return undefinedValue;
String strToMatch = (String) ArgList[0];
Pattern p = Pattern.compile((String) ArgList[1]);
Matcher m = p.matcher(strToMatch);
if(m.matches() && m.groupCount()>0){
strArr = new String[m.groupCount()];
for(int i=1;i<=m.groupCount();i++){
strArr[i-1] = m.group(i);
}
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}else{
throw new RuntimeException("The function call str2RegExp requires 2 arguments.");
}
return strArr;
}
public static void touch(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
File file = new File((String) ArgList[0]);
boolean success = file.createNewFile();
if (!success) {
file.setLastModified(System.currentTimeMillis());
}
}else{
throw new RuntimeException("The function call touch requires 1 valid argument.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static Object fileExists(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
if(ArgList[0].equals(null)) return null;
File file = new File((String) ArgList[0]);
return Boolean.valueOf(file.isFile());
}else{
throw new RuntimeException("The function call fileExists requires 1 valid argument.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static Object str2date(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
Object oRC=new Object();
String sArg1="";
String sArg2="";
String sArg3="";
String sArg4="";
switch(ArgList.length){
case 0:
throw new RuntimeException("Please provide a valid string to the function call str2date.");
case 1:
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return undefinedValue;
sArg1 = (String) ArgList[0];
Format dfFormatter = new SimpleDateFormat();
oRC = dfFormatter.parseObject(sArg1);
//if(Double.isNaN(sArg1)) throw new RuntimeException("The first Argument must be a Number.");
//DecimalFormat formatter = new DecimalFormat();
//sRC= formatter.format(sArg1);
}catch(Exception e){
throw new RuntimeException("Could not apply local format for "+sArg1+" : " + e.getMessage());
}
break;
case 2:
try{
if(isNull(ArgList,new int[]{0,1})) return null;
else if(isUndefined(ArgList,new int[]{0,1})) return undefinedValue;
sArg1 = (String) ArgList[0];
sArg2 = (String) ArgList[1];
Format dfFormatter = new SimpleDateFormat(sArg2);
oRC = dfFormatter.parseObject(sArg1);
}catch(Exception e){
throw new RuntimeException("Could not apply the given format "+sArg2+" on the string for "+sArg1+" : " + e.getMessage());
}
break;
case 3:
try{
if(isNull(ArgList,new int[]{0,1,2})) return null;
else if(isUndefined(ArgList,new int[]{0,1,2})) return undefinedValue;
sArg1 = (String) ArgList[0];
Format dfFormatter;
sArg2 = (String) ArgList[1];
sArg3 = (String) ArgList[2];
if(sArg3.length() == 2){
Locale dfLocale = new Locale(sArg3);
dfFormatter = new SimpleDateFormat(sArg2, dfLocale);
oRC = dfFormatter.parseObject(sArg1);
}else{
throw new RuntimeException("Locale "+sArg3+" is not 2 characters long.");
}
}catch(Exception e){
throw new RuntimeException("Could not apply the local format for locale "+sArg3+" with the given format "+sArg2+" on the string for "+sArg1+" : " + e.getMessage());
}
break;
case 4:
try{
if(isNull(ArgList,new int[]{0,1,2,3})) return null;
else if(isUndefined(ArgList,new int[]{0,1,2,3})) return undefinedValue;
sArg1 = (String) ArgList[0];
DateFormat dfFormatter;
sArg2 = (String) ArgList[1];
sArg3 = (String) ArgList[2];
sArg4 = (String) ArgList[3];
// If the timezone is not recognized, java will automatically
// take GMT.
TimeZone tz = TimeZone.getTimeZone(sArg4);
if(sArg3.length() == 2){
Locale dfLocale = new Locale(sArg3);
dfFormatter = new SimpleDateFormat(sArg2, dfLocale);
dfFormatter.setTimeZone(tz);
oRC = dfFormatter.parseObject(sArg1);
}else{
throw new RuntimeException("Locale "+sArg3+" is not 2 characters long.");
}
}catch(Exception e){
throw new RuntimeException("Could not apply the local format for locale "+sArg3+" with the given format "+sArg2+" on the string for "+sArg1+" : " + e.getMessage());
}
break;
default:
throw new RuntimeException("The function call str2date requires 1, 2, 3, or 4 arguments.");
}
return oRC;
}
public static Object date2str(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
Object oRC=new Object();
switch(ArgList.length){
case 0:
throw new RuntimeException("Please provide a valid date to the function call date2str.");
case 1:
try{
if(isNull(ArgList)) return null;
else if(isUndefined(ArgList)) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
if(dArg1.equals(null)) return null;
Format dfFormatter = new SimpleDateFormat();
oRC = dfFormatter.format(dArg1);
}catch(Exception e){
throw new RuntimeException("Could not convert to local format.");
}
break;
case 2:
try{
if(isNull(ArgList,new int[]{0,1})) return null;
else if(isUndefined(ArgList,new int[]{0,1})) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
String sArg2 = (String) ArgList[1];
Format dfFormatter = new SimpleDateFormat(sArg2);
oRC = dfFormatter.format(dArg1);
}catch(Exception e){
throw new RuntimeException("Could not convert to the given format.");
}
break;
case 3:
try{
if(isNull(ArgList,new int[]{0,1,2})) return null;
else if(isUndefined(ArgList,new int[]{0,1,2})) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
DateFormat dfFormatter;
String sArg2 = (String) ArgList[1];
String sArg3 = (String) ArgList[2];
if(sArg3.length() == 2){
Locale dfLocale = new Locale(sArg3.toLowerCase());
dfFormatter = new SimpleDateFormat(sArg2, dfLocale);
oRC = dfFormatter.format(dArg1);
}else{
throw new RuntimeException("Locale is not 2 characters long.");
}
}catch(Exception e){
throw new RuntimeException("Could not convert to the given local format.");
}
break;
case 4:
try{
if(isNull(ArgList,new int[]{0,1,2,3})) return null;
else if(isUndefined(ArgList,new int[]{0,1,2,3})) return undefinedValue;
java.util.Date dArg1 = (java.util.Date) ArgList[0];
DateFormat dfFormatter;
String sArg2 = (String) ArgList[1];
String sArg3 = (String) ArgList[2];
String sArg4 = (String) ArgList[3];
// If the timezone is not recognized, java will automatically
// take GMT.
TimeZone tz = TimeZone.getTimeZone(sArg4);
if(sArg3.length() == 2){
Locale dfLocale = new Locale(sArg3.toLowerCase());
dfFormatter = new SimpleDateFormat(sArg2, dfLocale);
dfFormatter.setTimeZone(tz);
oRC = dfFormatter.format(dArg1);
}else{
throw new RuntimeException("Locale is not 2 characters long.");
}
}catch(Exception e){
throw new RuntimeException("Could not convert to the given local format.");
}
break;
default:
throw new RuntimeException("The function call date2str requires 1, 2, 3, or 4 arguments.");
}
return oRC;
}
public static Object isRegExp(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length>=2){
if(isNull(ArgList,new int[]{0,1})) return null;
else if(isUndefined(ArgList,new int[]{0,1})) return undefinedValue;
String strToMatch = (String) ArgList[0];
for(int i=1;i<ArgList.length;i++){
Pattern p = Pattern.compile((String) ArgList[i]);
Matcher m = p.matcher(strToMatch);
if(m.matches()) return new Double(i);
}
}
return new Double(-1);
}
public static void sendMail(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
boolean debug = false;
// Arguments:
// String smtp, String from, String recipients[ ], String subject, String message
if(ArgList.length==5){
try{
//Set the host smtp address
Properties props = new Properties();
props.put("mail.smtp.host", ArgList[0]);
// create some properties and get the default Session
Session session = Session.getDefaultInstance(props, null);
session.setDebug(debug);
// create a message
Message msg = new MimeMessage(session);
// set the from and to address
InternetAddress addressFrom = new InternetAddress((String)ArgList[1]);
msg.setFrom(addressFrom);
// Get Recipients
String strArrRecipients[] = ((String)ArgList[2]).split(",");
InternetAddress[] addressTo = new InternetAddress[strArrRecipients.length];
for (int i = 0; i < strArrRecipients.length; i++){
addressTo[i] = new InternetAddress(strArrRecipients[i]);
}
msg.setRecipients(Message.RecipientType.TO, addressTo);
// Optional : You can also set your custom headers in the Email if you Want
msg.addHeader("MyHeaderName", "myHeaderValue");
// Setting the Subject and Content Type
msg.setSubject((String)ArgList[3]);
msg.setContent((String)ArgList[4], "text/plain");
Transport.send(msg);
}catch(Exception e){
throw new RuntimeException("sendMail: "+e.toString() );
}
}else{
throw new RuntimeException("The function call sendMail requires 5 arguments.");
}
}
public static String upper(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sRC="";
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
sRC = (String) ArgList[0];
sRC = sRC.toUpperCase();
}catch(Exception e){
throw new RuntimeException("The function call upper is not valid : " + e.getMessage());
}
}else{
throw new RuntimeException("The function call upper requires 1 argument.");
}
return sRC;
}
public static String lower(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sRC="";
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
sRC = (String) ArgList[0];
sRC = sRC.toLowerCase();
}catch(Exception e){
throw new RuntimeException("The function call lower is not valid : " + e.getMessage());
}
}else{
throw new RuntimeException("The function call lower requires 1 argument.");
}
return sRC;
}
// Converts the given Numeric to a JScript String
public static String num2str(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sRC="";
switch(ArgList.length){
case 0:
throw new RuntimeException("The function call num2str requires at least 1 argument.");
case 1:
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
double sArg1 = (Double) ArgList[0];
if(Double.isNaN(sArg1)) throw new RuntimeException("The first Argument must be a Number.");
DecimalFormat formatter = new DecimalFormat();
sRC= formatter.format(sArg1);
}catch(IllegalArgumentException e){
throw new RuntimeException("Could not apply the given format on the number : " + e.getMessage());
}
break;
case 2:
try{
if(isNull(ArgList,new int[]{0,1})) return null;
else if(isUndefined(ArgList,new int[]{0,1})) return (String)undefinedValue;
double sArg1 = (Double) ArgList[0];
if(Double.isNaN(sArg1)) throw new RuntimeException("The first Argument must be a Number.");
String sArg2 = (String) ArgList[1];
DecimalFormat formatter = new DecimalFormat(sArg2);
sRC= formatter.format(sArg1);
}catch(IllegalArgumentException e){
throw new RuntimeException("Could not apply the given format on the number : " + e.getMessage());
}
break;
case 3:
try{
if(isNull(ArgList,new int[]{0,1,2})) return null;
else if(isUndefined(ArgList,new int[]{0,1,2})) return (String)undefinedValue;
double sArg1 = (Double) ArgList[0];
if(Double.isNaN(sArg1)) throw new RuntimeException("The first Argument must be a Number.");
String sArg2 = (String) ArgList[1];
String sArg3 = (String) ArgList[2];
if(sArg3.length() == 2){
DecimalFormatSymbols dfs = new DecimalFormatSymbols(new Locale(sArg3.toLowerCase()));
DecimalFormat formatter = new DecimalFormat(sArg2, dfs);
sRC = formatter.format(sArg1);
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
break;
default:
throw new RuntimeException("The function call num2str requires 1, 2, or 3 arguments.");
}
return sRC;
}
// Converts the given String to a JScript Numeric
public static Object str2num(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
double dRC=0.00;
switch(ArgList.length){
case 0:
throw new RuntimeException("The function call str2num requires at least 1 argument.");
case 1:
try{
if(isNull(ArgList[0])) return new Double(Double.NaN);
else if(isUndefined(ArgList[0])) return undefinedValue;
if(ArgList[0].equals(null)) return null;
String sArg1 = (String) ArgList[0];
DecimalFormat formatter = new DecimalFormat();
dRC= (formatter.parse(Const.ltrim(sArg1))).doubleValue();
}catch(Exception e){
throw new RuntimeException("Could not convert the given String : " + e.getMessage());
}
break;
case 2:
try{
if(isNull(ArgList, new int[]{0,1}))return new Double(Double.NaN);
else if(isUndefined(ArgList,new int[]{0,1})) return undefinedValue;
String sArg1 = (String) ArgList[0];
String sArg2 = (String) ArgList[1];
if(sArg1.equals("null") || sArg2.equals("null")) return null;
DecimalFormat formatter = new DecimalFormat(sArg2);
dRC= (formatter.parse(sArg1)).doubleValue();
return new Double(dRC);
}catch(Exception e){
throw new RuntimeException("Could not convert the String with the given format :" + e.getMessage());
}
//break;
case 3:
try{
if(isNull(ArgList,new int[]{0,1,2}))return new Double(Double.NaN);
else if(isUndefined(ArgList,new int[]{0,1,2})) return undefinedValue;
String sArg1 = (String) ArgList[0];
String sArg2 = (String) ArgList[1];
String sArg3 = (String) ArgList[2];
if(sArg3.length() == 2){
DecimalFormatSymbols dfs = new DecimalFormatSymbols(new Locale(sArg3.toLowerCase()));
DecimalFormat formatter = new DecimalFormat(sArg2, dfs);
dRC= (formatter.parse(sArg1)).doubleValue();
return new Double(dRC);
}
}catch(Exception e){
throw new RuntimeException(e.getMessage());
}
break;
default:
throw new RuntimeException("The function call str2num requires 1, 2, or 3 arguments.");
}
return new Double(dRC);
}
public static Object isNum(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return undefinedValue;
double sArg1 = (Double) ArgList[0];
if(Double.isNaN(sArg1)) return Boolean.FALSE;
else return Boolean.TRUE;
}catch(Exception e){
return Boolean.FALSE;
}
}else{
throw new RuntimeException("The function call isNum requires 1 argument.");
}
}
public static Object isDate(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return undefinedValue;
/* java.util.Date d = (java.util.Date)*/
return Boolean.TRUE;
}catch(Exception e){
return Boolean.FALSE;
}
}else{
throw new RuntimeException("The function call isDate requires 1 argument.");
}
}
public static Object decode(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length>=2){
if(isNull(ArgList,new int[]{0,1})) return null;
else if(isUndefined(ArgList,new int[]{0,1})) return undefinedValue;
Object objToCompare = ArgList[0];
for(int i=1;i<ArgList.length-1;i=i+2) if(ArgList[i].equals(objToCompare)) return ArgList[i+1];
if(ArgList.length%2==0)return ArgList[ArgList.length-1];
else return objToCompare;
}else{
throw new RuntimeException("The function call decode requires more than 1 argument.");
}
}catch(Exception e){
throw new RuntimeException("The function call decode is not valid : " + e.getMessage());
}
}
public static String replace(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length>=2 && (ArgList.length-1)%2==0){
if(isNull(ArgList,new int[]{0,1})) return null;
else if(isUndefined(ArgList,new int[]{0,1})) return (String)undefinedValue;
String objForReplace = (String) ArgList[0];
for(int i=1;i<ArgList.length-1;i=i+2) objForReplace=objForReplace.replaceAll((String) ArgList[i], (String) ArgList[i+1]);
return objForReplace;
}else{
throw new RuntimeException("The function call replace is not valid (wrong number of arguments)");
}
}catch(Exception e){
throw new RuntimeException("Function call replace is not valid : " + e.getMessage());
}
}
// Implementation of the JS AlertBox
public static String Alert(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
SpoonInterface spoon = SpoonFactory.getInstance();
if( ArgList.length==1 && spoon != null )
{
String strMessage = (String) ArgList[0];
spoon.messageBox(strMessage, "Alert", false, Const.INFO);
}
return "";
}
// Setting EnvironmentVar
public static void setEnvironmentVar(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sArg1 = "";
String sArg2 = "";
if(ArgList.length==2){
try{
sArg1 = (String) ArgList[0];
sArg2 = (String) ArgList[1];
System.setProperty(sArg1, sArg2);
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
else
{
throw new RuntimeException("The function call setEnvironmentVar requires 2 arguments.");
}
}
// Returning EnvironmentVar
public static String getEnvironmentVar(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sRC="";
if(ArgList.length==1){
try{
String sArg1 = (String) ArgList[0];
sRC=System.getProperty(sArg1, "");
}catch(Exception e){
sRC="";
}
}
else
{
throw new RuntimeException("The function call getEnvironmentVar requires 1 argument.");
}
return sRC;
}
public static String trim(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sRC="";
if(ArgList.length==1)
{
try{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
sRC = (String) ArgList[0];
sRC = Const.trim(sRC);
}catch(Exception e){
throw new RuntimeException("The function call trim is not valid : " + e.getMessage());
}
}
else
{
throw new RuntimeException("The function call trim requires 1 argument.");
}
return sRC;
}
public static String substr(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sRC="";
if ( ArgList.length == 2 )
{
try
{
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
sRC = (String) ArgList[0];
int from = (int)Math.round((Double) ArgList[1]);
sRC = sRC.substring(from);
}
catch(Exception e)
{
throw new RuntimeException("The function call substr is not valid : " + e.getMessage());
}
}
else if ( ArgList.length == 3)
{
try
{
int to;
int strLen;
if(isNull(ArgList[0])) return null;
else if(isUndefined(ArgList[0])) return (String)undefinedValue;
sRC = (String) ArgList[0];
int from = (int)Math.round((Double) ArgList[1]);
int len = (int)Math.round((Double)ArgList[2]);
if ( from < 0 )
{
throw new RuntimeException("start smaller than 0");
}
if ( len < 0 ) len = 0; // Make it compatible with Javascript substr
to = from + len;
strLen = sRC.length();
if ( to > strLen )
to = strLen;
sRC = sRC.substring(from, to);
}
catch(Exception e)
{
throw new RuntimeException("The function call substr is not valid : " + e.getMessage());
}
}
else
{
throw new RuntimeException("The function call substr requires 2 or 3 arguments.");
}
return sRC;
}
// Resolve an IP address
public static String resolveIP(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
String sRC="";
if(ArgList.length==2)
{
try{
InetAddress addr = InetAddress.getByName((String) ArgList[0]);
if(((String) ArgList[1]).equals("IP")) sRC = addr.getHostName();
else sRC = addr.getHostAddress();
if(sRC.equals((String) ArgList[0])) sRC="-";
}catch(Exception e){
sRC="-";
}
}
else {
throw new RuntimeException("The function call resolveIP requires 2 arguments.");
}
return sRC;
}
// Loading additional JS Files inside the JavaScriptCode
public static void LoadScriptFile(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
for (int i = 0; i < ArgList.length; i++) { // don't worry about "undefined" arguments
checkAndLoadJSFile(actualContext,actualObject,(String) ArgList[i]);
}
}
// Adding the ScriptsItemTab to the actual running Context
public static void LoadScriptFromTab(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
try{
for (int i = 0; i < ArgList.length; i++) { // don't worry about "undefined" arguments
String strToLoad = (String) ArgList[i];
String strScript = actualObject.get(strToLoad).toString();
actualContext.eval(strScript, actualObject);
}
}catch(Exception e){
//System.out.println(e.toString());
}
}
// Print
public static void print (ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
for (int i = 0; i < ArgList.length; i++) { // don't worry about "undefined" arguments
java.lang.System.out.print((String) ArgList[i]);
}
}
// Prints Line to the actual System.out
public static void println (ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
print(actualContext,actualObject,ArgList,FunctionContext);
java.lang.System.out.println();
}
// Returns the actual ClassName
public String getClassName () {
return "SciptValuesAddedFunctions";
};
// Evaluates the given ScriptFile
private static void checkAndLoadJSFile(ScriptEngine actualContext, Bindings eval_scope, String fileName) {
Reader inStream = null;
try {
inStream = new InputStreamReader(KettleVFS.getInputStream(fileName));
actualContext.eval(inStream, eval_scope);
} /*
//TODO AKRETION: see if we can find better catches compatibles with JSR223
catch (FileNotFoundException Signal) {
new RuntimeException("Unable to open file \"" + fileName + "\" (reason: \"" + Signal.getMessage() + "\")");
} catch (WrappedException Signal) {
new RuntimeException("WrappedException while evaluating file \"" + fileName + "\" (reason: \"" + Signal.getMessage() + "\")");
} catch (EvaluatorException Signal) {
new RuntimeException("EvaluatorException while evaluating file \"" + fileName + "\" (reason: \"" + Signal.getMessage() + "\")");
} catch (JavaScriptException Signal) {
new RuntimeException("JavaScriptException while evaluating file \"" + fileName + "\" (reason: \"" + Signal.getMessage() + "\")");
} catch (IOException Signal) {
new RuntimeException("Error while reading file \"" + fileName + "\" (reason: \"" + Signal.getMessage() + "\")" );
} */
catch (KettleFileException Signal) {
new RuntimeException("Error while reading file \"" + fileName + "\" (reason: \"" + Signal.getMessage() + "\")" );
} catch (ScriptException Signal) {
new RuntimeException("Error while reading file \"" + fileName + "\" (reason: \"" + Signal.getMessage() + "\")" );
} finally {
try {
if (inStream != null) inStream.close();
} catch (Exception Signal) {
/* nop */
};
};
};
// Setting Variable
public static void setVariable(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sArg1 = "";
String sArg2 = "";
String sArg3 = "";
if(ArgList.length==3){
try{
Object scmo = actualObject.get("_step_");
Object scmO = scmo;
if ( scmO instanceof StepInterface)
{
StepInterface scm = (StepInterface)scmO;
sArg1 = (String) ArgList[0];
sArg2 = (String) ArgList[1];
sArg3 = (String) ArgList[2];
if ( "s".equals(sArg3) )
{
// System wide properties
System.setProperty(sArg1, sArg2);
// Set also all the way to the root as else we will take
// stale values
scm.setVariable(sArg1, sArg2);
VariableSpace parentSpace = scm.getParentVariableSpace();
while (parentSpace!=null)
{
parentSpace.setVariable(sArg1, sArg2);
parentSpace = parentSpace.getParentVariableSpace();
}
}
else if ( "r".equals(sArg3) )
{
// Upto the root... this should be the default.
scm.setVariable(sArg1, sArg2);
VariableSpace parentSpace = scm.getParentVariableSpace();
while (parentSpace!=null)
{
parentSpace.setVariable(sArg1, sArg2);
parentSpace = parentSpace.getParentVariableSpace();
}
}
else if ( "p".equals(sArg3) )
{
// Upto the parent
scm.setVariable(sArg1, sArg2);
VariableSpace parentSpace = scm.getParentVariableSpace();
if ( parentSpace != null )
{
parentSpace.setVariable(sArg1, sArg2);
}
}
else if ( "g".equals(sArg3) )
{
// Upto the grand parent
scm.setVariable(sArg1, sArg2);
VariableSpace parentSpace = scm.getParentVariableSpace();
if ( parentSpace != null )
{
parentSpace.setVariable(sArg1, sArg2);
VariableSpace grandParentSpace = parentSpace.getParentVariableSpace();
if ( grandParentSpace != null )
{
grandParentSpace.setVariable(sArg1, sArg2);
}
}
}
else
{
throw new RuntimeException("The argument type of function call setVariable should either be \"s\", \"r\", \"p\", or \"g\".");
}
}
else
{
// Ignore for now... if we're executing via the Test Button
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
else
{
throw new RuntimeException("The function call setVariable requires 3 arguments.");
}
}
// Returning EnvironmentVar
public static String getVariable(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
String sRC = "";
String sArg1 = "";
String sArg2 = "";
if(ArgList.length==2){
try{
Object scmo = actualObject.get("_step_");
Object scmO = scmo;
if ( scmO instanceof ScriptValuesMod)
{
ScriptValuesMod scm = (ScriptValuesMod) scmO;
sArg1 = (String) ArgList[0];
sArg2 = (String) ArgList[1];
return scm.getVariable(sArg1, sArg2);
}
else
{
// running via the Test button in a dialog
sArg2 = (String) ArgList[1];
return sArg2;
}
}catch(Exception e){
sRC="";
}
}
else
{
throw new RuntimeException("The function call getVariable requires 2 arguments.");
}
return sRC;
}
// Return the output row metadata
public static RowMetaInterface getOutputRowMeta(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==0){
try{
Object scmO = actualObject.get("_step_");
try {
ScriptValuesMod scm = (ScriptValuesMod) scmO;
return scm.getOutputRowMeta();
}
catch(Exception e) {
ScriptValuesModDummy scm = (ScriptValuesModDummy) scmO;
return scm.getOutputRowMeta();
}
}
catch(Exception e){
throw new RuntimeException("Unable to get the output row metadata because of an error: "+Const.CR+e.toString());
}
}
else
{
throw new RuntimeException("The function call getOutputRowMeta doesn't require arguments.");
}
}
// Return the input row metadata
public static RowMetaInterface getInputRowMeta(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==0){
try{
Object scmO = actualObject.get("_step_");
try {
ScriptValuesMod scm = (ScriptValuesMod) scmO;
return scm.getInputRowMeta();
}
catch(Exception e) {
ScriptValuesModDummy scm = (ScriptValuesModDummy) scmO;
return scm.getInputRowMeta();
}
}
catch(Exception e){
throw new RuntimeException("Unable to get the input row metadata because of an error: "+Const.CR+e.toString());
}
}
else
{
throw new RuntimeException("The function call getInputRowMeta doesn't require arguments.");
}
}
// Return the input row metadata
public static Object[] createRowCopy(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
if(ArgList.length==1){
try {
int newSize = (int) Math.round( (Double) ArgList[0] );
Object scmO = actualObject.get("row");
Object[] row = (Object[]) scmO;//TODO AKRETION ensure
return RowDataUtil.createResizedCopy(row, newSize);
}
catch(Exception e){
throw new RuntimeException("Unable to create a row copy: "+Const.CR+e.toString());
}
}
else
{
throw new RuntimeException("The function call createRowCopy requires a single arguments : the new size of the row");
}
}
// put a row out to the next steps...
//
public static void putRow(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
if(ArgList.length==1){
try{
Object[] newRow = (Object[]) ArgList[0];
Object scmO = actualObject.get("_step_");
try {
ScriptValuesMod step = (ScriptValuesMod) scmO;
step.putRow(step.getOutputRowMeta(), newRow);
}
catch(Exception e) {
ScriptValuesModDummy step = (ScriptValuesModDummy) scmO;
step.putRow(step.getOutputRowMeta(), newRow);
}
}
catch(Exception e){
throw new RuntimeException("Unable to pass the new row to the next step(s) because of an error: "+Const.CR+e.toString());
}
}
else
{
throw new RuntimeException("The function call putRow requires 1 argument : the output row data (Object[])");
}
}
public static void deleteFile(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
//Object act = actualObject.get("_step_", actualObject);
//ScriptValuesMod act = (ScriptValuesMod)Context.toType(scm_delete, ScriptValuesMod.class);
FileObject fileObject=null;
try
{
fileObject = KettleVFS.getFileObject((String) ArgList[0]);
if(fileObject.exists())
{
if(fileObject.getType() == FileType.FILE)
{
if(!fileObject.delete())
new RuntimeException("We can not delete file [" + (String) ArgList[0] + "]!");
}
}else{new RuntimeException("file [" + (String) ArgList[0] + "] can not be found!");}
}catch (IOException e)
{
throw new RuntimeException("The function call deleteFile is not valid.");
}finally {if(fileObject!=null) try{fileObject.close();}catch(Exception e){}}
}else{
throw new RuntimeException("The function call deleteFile is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static void createFolder(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
FileObject fileObject=null;
try
{
fileObject = KettleVFS.getFileObject((String) ArgList[0]);
if(!fileObject.exists())
{
fileObject.createFolder();
}else{new RuntimeException("folder [" + (String) ArgList[0] + "] already exist!");}
}catch (IOException e)
{
throw new RuntimeException("The function call createFolder is not valid.");
}finally {if(fileObject!=null) try{fileObject.close();}catch(Exception e){}}
}else{
throw new RuntimeException("The function call createFolder is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static void copyFile(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==3 && !isNull(ArgList[0]) && !isNull(ArgList[1]) && !isUndefined(ArgList[0]) && !isUndefined(ArgList[1])){
FileObject fileSource=null,fileDestination=null;
try
{
// Source file to copy
fileSource = KettleVFS.getFileObject((String) ArgList[0]);
// Destination filename
fileDestination = KettleVFS.getFileObject((String) ArgList[1]);
if(fileSource.exists())
{
// Source file exists...
if(fileSource.getType() == FileType.FILE)
{
// Great..source is a file ...
boolean overwrite=false;
if(!ArgList[1].equals(null)) overwrite=(Boolean) ArgList[2];
boolean destinationExists=fileDestination.exists();
// Let's copy the file...
if((destinationExists && overwrite) || !destinationExists)
FileUtil.copyContent(fileSource, fileDestination);
}
}else{new RuntimeException("file to copy [" + (String) ArgList[0] + "] can not be found!");}
}catch (IOException e)
{
throw new RuntimeException("The function call copyFile throw an error : " + e.toString());
}finally {if(fileSource!=null) try{fileSource.close();}catch(Exception e){}
if(fileDestination!=null) try{fileDestination.close();}catch(Exception e){}}
}else{
throw new RuntimeException("The function call copyFileis not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static double getFileSize(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
if(ArgList[0].equals(null)) return 0;
FileObject file=null;
try
{
// Source file
file= KettleVFS.getFileObject((String) ArgList[0]);
long filesize=0;
if(file.exists())
{
if(file.getType().equals(FileType.FILE))
filesize=file.getContent().getSize();
else
new RuntimeException("[" + (String) ArgList[0] + "] is not a file!");
}else{new RuntimeException("file [" + (String) ArgList[0] + "] can not be found!");}
return filesize;
}catch (IOException e)
{
throw new RuntimeException("The function call getFileSize throw an error : " + e.toString());
}finally {if(file!=null) try{file.close();}catch(Exception e){}
}
}else{
throw new RuntimeException("The function call getFileSize is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static boolean isFile(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
if(ArgList[0].equals(null)) return false;
FileObject file=null;
try
{
// Source file
file= KettleVFS.getFileObject((String) ArgList[0]);
boolean isafile=false;
if(file.exists())
{
if(file.getType().equals(FileType.FILE))
isafile=true;
else
new RuntimeException("[" + (String) ArgList[0] + "] is not a file!");
}else{new RuntimeException("file [" + (String) ArgList[0] + "] can not be found!");}
return isafile;
}catch (IOException e)
{
throw new RuntimeException("The function call is File throw an error : " + e.toString());
}finally {if(file!=null) try{file.close();}catch(Exception e){}
}
}else{
throw new RuntimeException("The function call isFile is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static boolean isFolder(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
if(ArgList[0].equals(null)) return false;
FileObject file=null;
try
{
// Source file
file= KettleVFS.getFileObject((String) ArgList[0]);
boolean isafolder=false;
if(file.exists())
{
if(file.getType().equals(FileType.FOLDER))
isafolder=true;
else
new RuntimeException("[" + (String) ArgList[0] + "] is not a folder!");
}else{new RuntimeException("folder [" + (String) ArgList[0] + "] can not be found!");}
return isafolder;
}catch (IOException e)
{
throw new RuntimeException("The function call isFolder throw an error : " + e.toString());
}finally {if(file!=null) try{file.close();}catch(Exception e){}
}
}else{
throw new RuntimeException("The function call isFolder is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static String getShortFilename(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
if(ArgList[0].equals(null)) return null;
FileObject file=null;
try
{
// Source file
file= KettleVFS.getFileObject((String) ArgList[0]);
String Filename=null;
if(file.exists())
{
Filename=file.getName().getBaseName().toString();
}else{new RuntimeException("file [" + (String) ArgList[0] + "] can not be found!");}
return Filename;
}catch (IOException e)
{
throw new RuntimeException("The function call getShortFilename throw an error : " + e.toString());
}finally {if(file!=null) try{file.close();}catch(Exception e){}
}
}else{
throw new RuntimeException("The function call getShortFilename is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static String getFileExtension(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
if(ArgList[0].equals(null)) return null;
FileObject file=null;
try
{
// Source file
file= KettleVFS.getFileObject((String) ArgList[0]);
String Extension=null;
if(file.exists())
{
Extension=file.getName().getExtension().toString();
}else{new RuntimeException("file [" + (String) ArgList[0] + "] can not be found!");}
return Extension;
}catch (IOException e)
{
throw new RuntimeException("The function call getFileExtension throw an error : " + e.toString());
}finally {if(file!=null) try{file.close();}catch(Exception e){}
}
}else{
throw new RuntimeException("The function call getFileExtension is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static String getParentFoldername(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==1 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])){
if(ArgList[0].equals(null)) return null;
FileObject file=null;
try
{
// Source file
file= KettleVFS.getFileObject((String) ArgList[0]);
String foldername=null;
if(file.exists())
{
foldername=KettleVFS.getFilename(file.getParent());
}else{new RuntimeException("file [" + (String) ArgList[0] + "] can not be found!");}
return foldername;
}catch (IOException e)
{
throw new RuntimeException("The function call getParentFoldername throw an error : " + e.toString());
}finally {if(file!=null) try{file.close();}catch(Exception e){}
}
}else{
throw new RuntimeException("The function call getParentFoldername is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
public static String getLastModifiedTime(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
try {
if (ArgList.length == 2 && !isNull(ArgList[0]) && !isUndefined(ArgList[0])) {
if (ArgList[0].equals(null))
return null;
FileObject file = null;
try {
// Source file
file = KettleVFS.getFileObject((String) ArgList[0]);
String dateformat = (String) ArgList[1];
if (isNull(dateformat))
dateformat = "yyyy-MM-dd";
String lastmodifiedtime = null;
if (file.exists()) {
java.util.Date lastmodifiedtimedate = new java.util.Date(file.getContent().getLastModifiedTime());
java.text.DateFormat dateFormat = new SimpleDateFormat(dateformat);
lastmodifiedtime = dateFormat.format(lastmodifiedtimedate);
} else {
new RuntimeException("file [" + (String) ArgList[0] + "] can not be found!");
}
return lastmodifiedtime;
} catch (IOException e) {
throw new RuntimeException("The function call getLastModifiedTime throw an error : " + e.toString());
} finally {
if (file != null)
try {
file.close();
} catch (Exception e) {
}
}
} else {
throw new RuntimeException("The function call getLastModifiedTime is not valid.");
}
} catch (Exception e) {
throw new RuntimeException(e.toString());
}
}
public static Object trunc(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
try {
// 1 argument: normal truncation of numbers
//
if (ArgList.length == 1) {
if (isNull(ArgList[0])) {
return null;
}
else if (isUndefined(ArgList[0])) {
return undefinedValue;
}
// This is the truncation of a number...
//
Double dArg1 = (Double) ArgList[0];
return Double.valueOf(Math.floor(dArg1));
} else {
throw new RuntimeException("The function call trunc requires 1 argument, a number.");
}
} catch (Exception e) {
throw new RuntimeException(e.toString());
}
}
public static Object truncDate(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext) {
try {
// 2 arguments: truncation of dates to a certain precision
//
if (ArgList.length == 2) {
if (isNull(ArgList[0])) {
return null;
}
else if (isUndefined(ArgList[0])) {
return undefinedValue;
}
// This is the truncation of a date...
// The second argument specifies the level: ms, s, min, hour, day, month, year
//
java.util.Date dArg1 = (java.util.Date) ArgList[0];
Calendar cal = Calendar.getInstance();
cal.setTime(dArg1);
Integer level = (Integer) ArgList[1];
switch(level.intValue())
{
// MONTHS
case 5: cal.set(Calendar.MONTH, 1);
// DAYS
case 4: cal.set(Calendar.DAY_OF_MONTH, 1);
// HOURS
case 3: cal.set(Calendar.HOUR_OF_DAY, 0);
// MINUTES
case 2: cal.set(Calendar.MINUTE, 0);
// SECONDS
case 1: cal.set(Calendar.SECOND, 0);
// MILI-SECONDS
case 0: cal.set(Calendar.MILLISECOND, 0); break;
default:
throw new RuntimeException("Argument of TRUNC of date has to be between 0 and 5");
}
return cal.getTime();
} else {
throw new RuntimeException("The function call truncDate requires 2 arguments: a date and a level (int)");
}
} catch (Exception e) {
throw new RuntimeException(e.toString());
}
}
public static void moveFile(ScriptEngine actualContext, Bindings actualObject, Object[] ArgList, Object FunctionContext){
try{
if(ArgList.length==3 && !isNull(ArgList[0]) && !isNull(ArgList[1]) && !isUndefined(ArgList[0]) && !isUndefined(ArgList[1])){
FileObject fileSource=null,fileDestination=null;
try
{
// Source file to move
fileSource = KettleVFS.getFileObject((String) ArgList[0]);
// Destination filename
fileDestination = KettleVFS.getFileObject((String) ArgList[1]);
if(fileSource.exists())
{
// Source file exists...
if(fileSource.getType() == FileType.FILE)
{
// Great..source is a file ...
boolean overwrite=false;
if(!ArgList[1].equals(null)) overwrite=(Boolean) ArgList[2];
boolean destinationExists=fileDestination.exists();
// Let's move the file...
if((destinationExists && overwrite) || !destinationExists)
fileSource.moveTo(fileDestination);
}
}else{new RuntimeException("file to move [" + (String) ArgList[0] + "] can not be found!");}
}catch (IOException e)
{
throw new RuntimeException("The function call moveFile throw an error : " + e.toString());
}finally {if(fileSource!=null) try{fileSource.close();}catch(Exception e){}
if(fileDestination!=null) try{fileDestination.close();}catch(Exception e){}}
}else{
throw new RuntimeException("The function call copyFile is not valid.");
}
}catch(Exception e){
throw new RuntimeException(e.toString());
}
}
}