/* 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()); } } }