/*
* Copyright (C) 2000 - 2008 TagServlet Ltd
*
* 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://www.openbluedragon.org/license/README.txt
*
* http://www.openbluedragon.org/
*/
package com.naryx.tagfusion.expression.function;
import java.util.Iterator;
import com.naryx.tagfusion.cfm.engine.cfArgStructData;
import com.naryx.tagfusion.cfm.engine.cfArrayData;
import com.naryx.tagfusion.cfm.engine.cfBooleanData;
import com.naryx.tagfusion.cfm.engine.cfData;
import com.naryx.tagfusion.cfm.engine.cfDateData;
import com.naryx.tagfusion.cfm.engine.cfNumberData;
import com.naryx.tagfusion.cfm.engine.cfQueryResultData;
import com.naryx.tagfusion.cfm.engine.cfSession;
import com.naryx.tagfusion.cfm.engine.cfStringData;
import com.naryx.tagfusion.cfm.engine.cfStructData;
import com.naryx.tagfusion.cfm.engine.cfmRunTimeException;
import com.naryx.tagfusion.cfm.wddx.cfWDDX;
import com.naryx.tagfusion.cfm.wddx.wddxDataTypes;
public class ToScript extends functionBase {
private static final long serialVersionUID = 1L;
public ToScript(){
min = 2; max = 4;
setNamedParams( new String[]{ "object","jsname","format","shortcuts" } );
}
public String[] getParamInfo(){
return new String[]{
"object - struct, array, query or simple value",
"javascript var name",
"format - flag to set WDDX output; default false",
"shortcuts - flag to use shortcuts for structs/arrays; default to false"
};
}
public java.util.Map getInfo(){
return makeInfo(
"string",
"Used to convert the given input to Actionscript/Javascript variable",
ReturnType.STRING );
}
public cfData execute(cfSession _session, cfArgStructData argStruct ) throws cfmRunTimeException {
cfData cfvar = getNamedParam( argStruct, "object");
String jsvar = getNamedStringParam( argStruct, "jsname","");
boolean asFormat = getNamedBooleanParam(argStruct,"format",false );
boolean outputFormat = getNamedBooleanParam(argStruct,"shortcuts",false );
String script;
if ( outputFormat || ( cfData.isSimpleValue( cfvar ) ) ){
script = cfWDDX.cfml2JS( _session, cfvar, jsvar );
}else{
// actionscript
script = toActionScript( _session, cfvar, jsvar, asFormat );
}
return new cfStringData( script );
}
private String toActionScript( cfSession _session, cfData _data, String _var, boolean _asFormat ) throws cfmRunTimeException{
if ( cfData.isSimpleValue( _data ) ){
return cfWDDX.cfml2JS( _session, _data, _var );
}else if ( _data.getDataType() == cfData.CFQUERYRESULTDATA ){
return toActionScript( (cfQueryResultData) _data, _var, _asFormat );
}else if ( _data.getDataType() == cfData.CFARRAYDATA ){
return toActionScript( (cfArrayData) _data, _var, _asFormat );
}else if ( _data.getDataType() == cfData.CFSTRUCTDATA ){
return toActionScript( (cfStructData) _data, _var, _asFormat );
}else{
return _var + " =";
}
}
private String toActionScript( cfQueryResultData _queryData, String _name, boolean _asFormat ){
StringBuilder asString = new StringBuilder(256);
cfData value;
String columns[] = _queryData.getColumnList();
asString.append( _name + ( _asFormat ? " = [];\n" : " = new Array();\n" ) );
for ( int rows=0; rows < _queryData.getSize(); rows++ ){
asString.append( _name + "[" + rows + "] = " + ( _asFormat ? "{}" : "new Object()" ) + ";\n");
for( int cols=0; cols < _queryData.getNoColumns(); cols++ ){
value = _queryData.getCell(rows+1, cols+1, false);
asString.append( _name );
asString.append( '[' );
asString.append( rows );
asString.append( "]['" );
asString.append( columns[cols].toLowerCase() );
asString.append( "'] = " );
asString.append( getSimpleValueString( value ) );
asString.append( ";\n" );
}
}
return asString.toString();
}
private String toActionScript( cfArrayData _arrayData, String _name, boolean _asFormat ){
StringBuilder asString = new StringBuilder(256);
cfData value;
asString.append( _name + ( _asFormat ? " = [];\n" : " = new Array();\n" ) );
for( int i = 0; i < _arrayData.size(); i++){
value = _arrayData.getElement(i+1);
if ( cfData.isSimpleValue( value ) ){
asString.append( _name );
asString.append( '[' );
asString.append( i );
asString.append( "] = " );
asString.append( getSimpleValueString( value ) );
asString.append( ";\n" );
}else if ( value.getDataType() == cfData.CFQUERYRESULTDATA ){
asString.append( toActionScript( (cfQueryResultData) value, _name + '[' + i + ']', _asFormat ) );
}else if ( value.getDataType() == cfData.CFARRAYDATA ){
asString.append( toActionScript( (cfArrayData) value, _name + "[\"" + i + "\"]", _asFormat ) );
}else if ( value.getDataType() == cfData.CFSTRUCTDATA ){
asString.append( toActionScript( (cfStructData) value, _name + "[\"" + i + "\"]", _asFormat ) );
}
}
return asString.toString();
}
private String toActionScript( cfStructData _arrayData, String _name, boolean _asFormat ) {
StringBuilder asString = new StringBuilder( 256 );
asString.append( _name + ( _asFormat ? " = {};\n" : " = new Object();\n" ) );
Iterator<String> keys = _arrayData.keySet().iterator();
while ( keys.hasNext() ) {
String key = keys.next();
cfData value = _arrayData.getData( key );
if ( cfData.isSimpleValue( value ) ) {
asString.append( _name );
asString.append( "[\"" );
asString.append( key );
asString.append( "\"] = " );
asString.append( getSimpleValueString( value ) );
asString.append( ";\n" );
} else if ( value.getDataType() == cfData.CFQUERYRESULTDATA ) {
asString.append( toActionScript( (cfQueryResultData)value, _name + "[\"" + key + "\"]", _asFormat ) );
} else if ( value.getDataType() == cfData.CFARRAYDATA ) {
asString.append( toActionScript( (cfArrayData)value, _name + "[\"" + key + "\"]", _asFormat ) );
} else if ( value.getDataType() == cfData.CFSTRUCTDATA ) {
asString.append( toActionScript( (cfStructData)value, _name + "[\"" + key + "\"]", _asFormat ) );
}
}
return asString.toString();
}
private String getSimpleValueString( cfData _data ){
if ( _data.getDataType() == cfData.CFSTRINGDATA ){
return wddxDataTypes.getRHSData( (cfStringData) _data );
}else if ( _data.getDataType() == cfData.CFNUMBERDATA ){
return wddxDataTypes.getRHSData( (cfNumberData) _data );
}else if ( _data.getDataType() == cfData.CFBOOLEANDATA ){
return wddxDataTypes.getRHSData( (cfBooleanData) _data );
}else if( _data.getDataType() == cfData.CFDATEDATA ){
return wddxDataTypes.getRHSData( (cfDateData) _data );
}else if ( _data.getDataType() == cfData.CFNULLDATA ){
return "null";
}
return "";
}
}