package railo.runtime.type;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import railo.commons.lang.CFTypes;
import railo.commons.lang.ExternalizableUtil;
/**
* a single argument of a function
*/
public final class FunctionArgumentImpl implements FunctionArgument,Externalizable {
private static final long serialVersionUID = -7275048405949174352L; // do not change
private String dspName;
private String hint;
private Collection.Key name;
private short type;
private String strType;
private boolean required;
private Struct meta;
private int defaultType;
private boolean passByReference;
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String type,boolean required) {
this(name,type,required,"","");
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String type,boolean required,String dspName,String hint) {
this(name,type,required,DEFAULT_TYPE_RUNTIME_EXPRESSION,true,dspName,hint,null);
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String type,boolean required,String dspName,String hint,StructImpl meta) {
this(name,type,required,DEFAULT_TYPE_RUNTIME_EXPRESSION,true,dspName,hint,meta);
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String type,boolean required,int defaultType,String dspName,String hint,StructImpl meta) {
this(name, type, required, defaultType,true, dspName, hint, meta);
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String type,boolean required,double defaultType,String dspName,String hint,StructImpl meta) {
this(name, type, required, (int)defaultType,true, dspName, hint, meta);
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String type,boolean required,double defaultType,boolean passByReference,String dspName,String hint,StructImpl meta) {
this(name, type, required, (int)defaultType,passByReference, dspName, hint, meta);
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String type,boolean required,int defaultType,boolean passByReference,String dspName,String hint,StructImpl meta) {
this(KeyImpl.init(name),type,required,defaultType,passByReference,dspName,hint,meta);
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(String name,String strType,short type,boolean required,int defaultType,boolean passByReference,String dspName,String hint,StructImpl meta) {
this(KeyImpl.init(name), strType, type, required, defaultType, passByReference, dspName, hint, meta);
}
/** @deprecated use other constructor */
public FunctionArgumentImpl(Collection.Key name,String type,boolean required,int defaultType,boolean passByReference,String dspName,String hint,StructImpl meta) {
this.name=name;
this.strType=(type);
this.type=CFTypes.toShortStrict(type,CFTypes.TYPE_UNKNOW);
this.required=required;
this.defaultType=defaultType;
this.dspName=dspName;
this.hint=hint;
this.meta=meta;
this.passByReference=passByReference;
}
/**
* NEVER USE THIS CONSTRUCTOR, this constructor is only for deserialize this object from stream
*/
public FunctionArgumentImpl() {}
public FunctionArgumentImpl(Collection.Key name) {
this(name, "any", CFTypes.TYPE_ANY, false, DEFAULT_TYPE_NULL, true, "", "", null);
}
public FunctionArgumentImpl(Collection.Key name,short type) {
this(name, CFTypes.toString(type,"any"), type, false, DEFAULT_TYPE_NULL, true, "", "", null);
}
public FunctionArgumentImpl(Collection.Key name,String strType,short type) {
this(name, strType, type, false, DEFAULT_TYPE_NULL, true, "", "", null);
}
public FunctionArgumentImpl(Collection.Key name,String strType,short type,boolean required) {
this(name, strType, type, required, DEFAULT_TYPE_NULL, true, "", "", null);
}
public FunctionArgumentImpl(Collection.Key name,String strType,short type,boolean required,int defaultType) {
this(name, strType, type, required, defaultType, true, "", "", null);
}
public FunctionArgumentImpl(Collection.Key name,String strType,short type,boolean required,int defaultType,boolean passByReference) {
this(name, strType, type, required, defaultType, passByReference, "", "", null);
}
public FunctionArgumentImpl(Collection.Key name,String strType,short type,boolean required,int defaultType,boolean passByReference,String dspName) {
this(name, strType, type, required, defaultType, passByReference, dspName, "", null);
}
public FunctionArgumentImpl(Collection.Key name,String strType,short type,boolean required,int defaultType,boolean passByReference,String dspName,String hint) {
this(name, strType, type, required, defaultType, passByReference, dspName, hint, null);
}
public FunctionArgumentImpl(Collection.Key name,String strType,short type,boolean required,int defaultType,boolean passByReference,String dspName,String hint,StructImpl meta) {
this.name=name;
this.strType=strType;
this.type=type;
this.required=required;
this.defaultType=defaultType;
this.dspName=dspName;
this.hint=hint;
this.meta=meta;
this.passByReference=passByReference;
}
//private static StructImpl sct=new StructImpl();
/**
* @return the defaultType
*/
public int getDefaultType() {
return defaultType;
}
@Override
public Collection.Key getName() {
return name;
}
@Override
public boolean isRequired() {
return required;
}
@Override
public short getType() {
return type;
}
@Override
public String getTypeAsString() {
return strType;
}
@Override
public String getHint() {
return hint;
}
@Override
public String getDisplayName() {
return dspName;
}
@Override
public Struct getMetaData() {
return meta;
}
public boolean isPassByReference() {
return passByReference;
}
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {
dspName=ExternalizableUtil.readString(in);
hint=ExternalizableUtil.readString(in);
name=KeyImpl.init(ExternalizableUtil.readString(in));
type=in.readShort();
strType=ExternalizableUtil.readString(in);
required=in.readBoolean();
meta=(Struct) in.readObject();
defaultType=in.readInt();
passByReference=in.readBoolean();
}
public void writeExternal(ObjectOutput out) throws IOException {
ExternalizableUtil.writeString(out, dspName);
ExternalizableUtil.writeString(out, hint);
ExternalizableUtil.writeString(out, name.getString());
out.writeShort(type);
ExternalizableUtil.writeString(out, strType);
out.writeBoolean(required);
out.writeObject(meta);
out.writeInt(defaultType);
out.writeBoolean(passByReference);
}
public boolean equals(Object obj){
if(!(obj instanceof FunctionArgument)) return false;
return equals(this,(FunctionArgument)obj);
}
public static boolean equals(FunctionArgument left, FunctionArgument right) {
if(
left.getDefaultType()!=right.getDefaultType()
|| left.getType()!=right.getType()
|| !_eq(left.getName(), right.getName())
|| !_eq(left.getTypeAsString(), right.getTypeAsString())
|| left.isPassByReference()!=right.isPassByReference()
|| left.isRequired()!=right.isRequired()
)
return false;
return true;
}
private static boolean _eq(Object left, Object right) {
if(left==null) return right==null;
return left.equals(right);
}
}