/* * Copyright (C) 2000 - 2015 aw2.0Ltd * * This file is part of Open BlueDragon (OpenBD) CFML Server Engine. * * OpenBD is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * Free Software Foundation,version 3. * * OpenBD is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenBD. If not, see http://www.gnu.org/licenses/ * * Additional permission under GNU GPL version 3 section 7 * * If you modify this Program, or any covered work, by linking or combining * it with any of the JARS listed in the README.txt (or a modified version of * (that library), containing parts covered by the terms of that JAR, the * licensors of this Program grant you additional permission to convey the * resulting work. * README.txt @ http://openbd.org/license/README.txt * * http://openbd.org/ * $Id: AmazonBase.java 2466 2015-01-11 15:53:09Z alan $ */ package com.naryx.tagfusion.expression.function; /** * A simple base class that allows for the checking of the * function for errors */ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.naryx.tagfusion.cfm.engine.cfArgStructData; import com.naryx.tagfusion.cfm.engine.cfArrayData; import com.naryx.tagfusion.cfm.engine.cfData; import com.naryx.tagfusion.cfm.engine.cfSession; import com.naryx.tagfusion.cfm.engine.cfStructData; import com.naryx.tagfusion.cfm.engine.cfmRunTimeException; import com.naryx.tagfusion.cfm.parser.CFUndefinedValue; import com.naryx.tagfusion.expression.operator.expressionBase; public class functionBase extends expressionBase { private static final long serialVersionUID = 1L; private static List<String> emptyFormals = new ArrayList<String>(0); public enum ReturnType { ARRAY, BINARY, BOOLEAN, CFC, DATE, NULL, NUMERIC, IMAGE, OBJECT, QUERY, STRING, STRUCTURE, SPREADSHEET, THREAD, XML, UNKNOWN}; protected int min = 0, max = 0; protected List<String> namedParams = emptyFormals; protected Map<String,Integer> namedParamsIndex = null; public functionBase(){} public int getMin(){ return min; } public int getMax(){ return max; } public boolean supportNamedParams(){ return (namedParams != emptyFormals); } public List<String> getFormals() { return namedParams; } protected void setNamedParams( String[] params ){ namedParams = new ArrayList<String>( params.length ); namedParamsIndex = new HashMap<String,Integer>(); for ( int x=0; x < params.length; x++ ){ namedParams.add( params[x] ); namedParamsIndex.put( params[x], x ); } } protected cfData getNamedParam( cfArgStructData argStruct, String namedParam ){ cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } return v; } protected cfData getNamedParam( cfArgStructData argStruct, String namedParam, cfData def ){ cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ) return def; else return v; } protected String getNamedStringParam( cfArgStructData argStruct, String namedParam, String def ) throws cfmRunTimeException { cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ) return def; else return v.getString(); } protected int getNamedIntParam( cfArgStructData argStruct, String namedParam, int def ) throws cfmRunTimeException { cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ) return def; else return v.getInt(); } protected long getNamedLongParam( cfArgStructData argStruct, String namedParam, long def ) throws cfmRunTimeException { cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ) return def; else return v.getLong(); } protected double getNamedDoubleParam( cfArgStructData argStruct, String namedParam, long def ) throws cfmRunTimeException { cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ) return def; else return v.getDouble(); } protected cfStructData getNamedStructParam( cfSession session, cfArgStructData argStruct, String namedParam, cfStructData def ) throws cfmRunTimeException { cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ){ return def; }else if ( v instanceof cfStructData ){ return (cfStructData)v; }else{ throwException(session, namedParam + " is not of structure type"); return null; } } protected cfArrayData getNamedArrayParam( cfSession session, cfArgStructData argStruct, String namedParam, cfArrayData def ) throws cfmRunTimeException { cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ){ return def; }else if ( v instanceof cfArrayData ){ return (cfArrayData)v; }else{ throwException(session, namedParam + " is not of array type"); return null; } } protected boolean getNamedBooleanParam( cfArgStructData argStruct, String namedParam, boolean def ) throws cfmRunTimeException { cfData v; if ( argStruct.isNamedBased() ){ v = argStruct.getData(namedParam); }else{ v = argStruct.getData( namedParamsIndex.get(namedParam) ); } if ( v == null || v instanceof CFUndefinedValue ){ return def; }else{ return v.getBoolean(); } } public List<cfStructData> getFormalArguments() { return null; } protected int getIntParam( List<cfData> params, int index, int def ) throws cfmRunTimeException { if ( index < params.size() ) return params.get(index).getInt(); else return def; } protected String getStringParam( List<cfData> params, int index, String def ) throws cfmRunTimeException { if ( index < params.size() ) return params.get(index).getString(); else return def; } protected boolean getBooleanParam( List<cfData> params, int index, boolean def ) throws cfmRunTimeException { if ( index < params.size() ) return params.get(index).getBoolean(); else return def; } /* * Meta Information: * * Returns back String array, of short descriptions for each of the * parameters */ public String[] getParamInfo(){ return new String[ max ]; } /* * Meta Information: * * Returns a MAP containing meta data for this function */ public java.util.Map<String,String> getInfo(){ return makeInfo( "unknown", "not available", ReturnType.UNKNOWN ); } /* * Helper method for quickly creating the meta information */ protected java.util.Map<String,String> makeInfo( String category, String summary, ReturnType returntype ){ Map<String,String> map = new java.util.HashMap<String,String>(); map.put("category", category.toLowerCase() ); map.put("summary", summary ); map.put("return", returntype.toString() ); return map; } public boolean isEscapeSingleQuotes() { return true; } }