package railo.runtime.type;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.HashSet;
import java.util.Set;
import railo.commons.lang.CFTypes;
import railo.commons.lang.ExceptionUtil;
import railo.commons.lang.ExternalizableUtil;
import railo.commons.lang.SizeOf;
import railo.runtime.PageContextImpl;
import railo.runtime.PageSource;
import railo.runtime.PageSourceImpl;
import railo.runtime.config.ConfigWebImpl;
import railo.runtime.engine.ThreadLocalPageContext;
import railo.runtime.engine.ThreadLocalPageSource;
import railo.runtime.type.util.UDFUtil;
public final class UDFPropertiesImpl implements UDFProperties {
private static final long serialVersionUID = 8679484452640746605L; // do not change
public String functionName;
public int returnType;
public String strReturnType;
public boolean output;
public Boolean bufferOutput;
public String hint;
public String displayName;
//public Page page;
public PageSource pageSource;
public int index;
public FunctionArgument[] arguments;
public Struct meta;
public String description;
public Boolean secureJson;
public Boolean verifyClient;
public String strReturnFormat;
public int returnFormat;
public Set<Collection.Key> argumentsSet;
public int access;
public long cachedWithin;
public Integer localMode;
/**
* NEVER USE THIS CONSTRUCTOR, this constructor is only for deserialize this object from stream
*/
public UDFPropertiesImpl(){
}
public UDFPropertiesImpl(
PageSource pageSource,
FunctionArgument[] arguments,
int index,
String functionName,
String strReturnType,
String strReturnFormat,
boolean output,
int access,
Boolean bufferOutput,
String displayName,
String description,
String hint,
Boolean secureJson,
Boolean verifyClient,
long cachedWithin,
Integer localMode,
StructImpl meta) {
// this happens when a arcive is based on older source code
if(pageSource==null){
pageSource = ThreadLocalPageSource.get();
}
if(arguments.length>0){
this.argumentsSet=new HashSet<Collection.Key>();
for(int i=0;i<arguments.length;i++){
argumentsSet.add(arguments[i].getName());
}
}
else this.argumentsSet=null;
this.arguments = arguments;
this.description = description;
this.displayName = displayName;
this.functionName = functionName;
this.hint = hint;
this.index = index;
this.meta = meta;
this.output = output;
this.bufferOutput = bufferOutput;
//this.page = PageProxy.toProxy(page);
this.pageSource=pageSource;
this.strReturnType=strReturnType;
this.returnType=CFTypes.toShortStrict(strReturnType,CFTypes.TYPE_UNKNOW);
this.strReturnFormat=strReturnFormat;
this.returnFormat=UDFUtil.toReturnFormat(strReturnFormat,-1);
this.secureJson = secureJson;
this.verifyClient = verifyClient;
this.access = access;
this.cachedWithin=cachedWithin;
this.localMode=localMode;
}
public UDFPropertiesImpl(
PageSource pageSource,
FunctionArgument[] arguments,
int index,
String functionName,
short returnType,
String strReturnFormat,
boolean output,
int access,
Boolean bufferOutput,
String displayName,
String description,
String hint,
Boolean secureJson,
Boolean verifyClient,
long cachedWithin,
Integer localMode,
StructImpl meta) {
// this happens when a arcive is based on older source code
if(pageSource==null){
pageSource = ThreadLocalPageSource.get();
}
if(arguments.length>0){
this.argumentsSet=new HashSet<Collection.Key>();
for(int i=0;i<arguments.length;i++){
argumentsSet.add(arguments[i].getName());
}
}
else this.argumentsSet=null;
this.arguments = arguments;
this.description = description;
this.displayName = displayName;
this.functionName = functionName;
this.hint = hint;
this.index = index;
this.meta = meta;
this.output = output;
this.bufferOutput = bufferOutput;
this.pageSource = pageSource;
this.strReturnType=CFTypes.toString(returnType,"any");
this.returnType=returnType;
this.strReturnFormat=strReturnFormat;
this.returnFormat=UDFUtil.toReturnFormat(strReturnFormat,-1);
this.secureJson = secureJson;
this.verifyClient = verifyClient;
this.access = access;
this.cachedWithin=cachedWithin;
this.localMode=localMode;
}
/**
* @deprecated only supported for old compile templates in .ra archives
* */
public UDFPropertiesImpl(
PageSource pageSource,
FunctionArgument[] arguments,
int index,
String functionName,
String strReturnType,
String strReturnFormat,
boolean output,
int access,
String displayName,
String description,
String hint,
Boolean secureJson,
Boolean verifyClient,
long cachedWithin,
StructImpl meta) {
this(pageSource, arguments, index, functionName, strReturnType, strReturnFormat,
output, access, null,displayName, description, hint, secureJson, verifyClient, cachedWithin,null, meta);
}
/**
* @deprecated only supported for old compile templates in .ra archives
* */
public UDFPropertiesImpl(
PageSource pageSource,
FunctionArgument[] arguments,
int index,
String functionName,
short returnType,
String strReturnFormat,
boolean output,
int access,
String displayName,
String description,
String hint,
Boolean secureJson,
Boolean verifyClient,
long cachedWithin,
StructImpl meta) {
this(pageSource, arguments, index, functionName, returnType, strReturnFormat,
output, access,null, displayName, description, hint, secureJson, verifyClient, cachedWithin, null, meta);
}
/**
* @deprecated only supported for very old compile templates in .ra archives
* */
public UDFPropertiesImpl(
PageSource pageSource,
FunctionArgument[] arguments,
int index,
String functionName,
short returnType,
String strReturnFormat,
boolean output,
int access) {
this(pageSource, arguments, index, functionName, returnType,strReturnFormat, output, access, null,
"","", "", null, null, 0L, null, null);
}
@Override
public long sizeOf() {
return
SizeOf.size(functionName)+
SizeOf.size(returnType)+
SizeOf.size(strReturnType)+
SizeOf.size(output)+
SizeOf.size(bufferOutput)+
SizeOf.size(hint)+
SizeOf.size(index)+
SizeOf.size(displayName)+
SizeOf.size(arguments)+
SizeOf.size(meta)+
SizeOf.size(description)+
SizeOf.size(secureJson)+
SizeOf.size(verifyClient)+
SizeOf.size(strReturnFormat)+
SizeOf.size(returnFormat)+
SizeOf.size(cachedWithin);
}
/**
* @return the access
*/
public int getAccess() {
return access;
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
try {
PageContextImpl pc = (PageContextImpl) ThreadLocalPageContext.get();
ConfigWebImpl cw = (ConfigWebImpl) ThreadLocalPageContext.getConfig(pc);
String path=ExternalizableUtil.readString(in);
pageSource=PageSourceImpl.best(cw.getPageSources(pc,null, path, false,true,true));
}
catch (Throwable e) {
e.printStackTrace();
throw ExceptionUtil.toIOException(e);
}
arguments=(FunctionArgument[]) in.readObject();
access = in.readInt();
index = in.readInt();
returnFormat = in.readInt();
returnType = in.readInt();
description = ExternalizableUtil.readString(in);
displayName = ExternalizableUtil.readString(in);
functionName = ExternalizableUtil.readString(in);
hint = ExternalizableUtil.readString(in);
meta = (Struct) in.readObject();
output = in.readBoolean();
bufferOutput = ExternalizableUtil.readBoolean(in);
secureJson = ExternalizableUtil.readBoolean(in);
strReturnFormat = ExternalizableUtil.readString(in);
strReturnType = ExternalizableUtil.readString(in);
verifyClient = ExternalizableUtil.readBoolean(in);
cachedWithin = in.readLong();
if(arguments!=null && arguments.length>0){
this.argumentsSet=new HashSet<Collection.Key>();
for(int i=0;i<arguments.length;i++){
argumentsSet.add(arguments[i].getName());
}
}
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(pageSource.getFullRealpath());
out.writeObject(arguments);
out.writeInt(access);
out.writeInt(index);
out.writeInt(returnFormat);
out.writeInt(returnType);
ExternalizableUtil.writeString(out,description);
ExternalizableUtil.writeString(out,displayName);
ExternalizableUtil.writeString(out,functionName);
ExternalizableUtil.writeString(out,hint);
out.writeObject(meta);
out.writeBoolean(output);
ExternalizableUtil.writeBoolean(out,bufferOutput);
ExternalizableUtil.writeBoolean(out,secureJson);
ExternalizableUtil.writeString(out,strReturnFormat);
ExternalizableUtil.writeString(out,strReturnType);
ExternalizableUtil.writeBoolean(out,verifyClient);
out.writeLong(cachedWithin);
}
}