Package railo.runtime.net.rpc

Source Code of railo.runtime.net.rpc.AxisCaster

package railo.runtime.net.rpc;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.xml.namespace.QName;
import javax.xml.rpc.encoding.TypeMapping;

import org.apache.axis.Constants;
import org.apache.axis.types.Day;
import org.apache.axis.types.Duration;
import org.apache.axis.types.Entities;
import org.apache.axis.types.Entity;
import org.apache.axis.types.Language;
import org.apache.axis.types.Month;
import org.apache.axis.types.MonthDay;
import org.apache.axis.types.NCName;
import org.apache.axis.types.NMToken;
import org.apache.axis.types.NMTokens;
import org.apache.axis.types.Name;
import org.apache.axis.types.Token;
import org.apache.axis.types.URI;
import org.apache.axis.types.URI.MalformedURIException;
import org.apache.axis.types.Year;
import org.apache.axis.types.YearMonth;

import railo.commons.lang.ClassException;
import railo.commons.lang.ClassUtil;
import railo.commons.lang.StringUtil;
import railo.runtime.Component;
import railo.runtime.ComponentScope;
import railo.runtime.ComponentWrap;
import railo.runtime.PageContext;
import railo.runtime.component.Property;
import railo.runtime.engine.ThreadLocalPageContext;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.interpreter.CFMLExpressionInterpreter;
import railo.runtime.op.Caster;
import railo.runtime.op.Decision;
import railo.runtime.op.date.DateCaster;
import railo.runtime.reflection.Reflector;
import railo.runtime.type.Array;
import railo.runtime.type.Collection;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Query;
import railo.runtime.type.QueryColumn;
import railo.runtime.type.QueryImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.UDF;
import railo.runtime.type.cfc.ComponentAccess;
import railo.runtime.type.dt.DateTime;
import railo.runtime.type.dt.TimeSpan;
import railo.runtime.type.scope.Argument;
import railo.runtime.type.util.ArrayUtil;
import railo.runtime.type.util.ComponentUtil;
import coldfusion.xml.rpc.QueryBean;

/**
* Axis Type Caster
*/
public final class AxisCaster {

  /**
     * cast a value to a Axis Compatible Type
     * @param type
     * @param value
     * @return Axis Compatible Type
     * @throws PageException
     */
    public static Object toAxisType(TypeMapping tm,TimeZone tz,QName type, Object value, Class targetClass) throws PageException {
    return _toAxisType(tm, tz, type, value, targetClass,new HashSet<Object>());
  }

    public static Object toAxisType(TypeMapping tm,Object value,Class targetClass) throws PageException {
      return _toAxisType(tm,null,null, value, targetClass, new HashSet<Object>());
    }
 
    /**
     * cast a value to a Axis Compatible Type
     * @param type
     * @param value
     * @return Axis Compatible Type
     * @throws PageException
     */
    private static Object _toAxisType(TypeMapping tm,TimeZone tz,QName type, Object value, Class targetClass,Set<Object> done) throws PageException {
        if(done.contains(value)){
      return null;// TODO not sure what in this case is the best solution.
    }
     
    done.add(value);
      try{
     
        if(type!=null) {
            // XSD
            for(int i=0;i<Constants.URIS_SCHEMA_XSD.length;i++) {
                if(Constants.URIS_SCHEMA_XSD[i].equals(type.getNamespaceURI())) {
                    return toAxisTypeXSD(tm,tz,type, value,targetClass,done);
                }
            }
            //SOAP
            if(type.getNamespaceURI().indexOf("soap")!=-1) {
                return toAxisTypeSoap(tm,type, value,targetClass,done);
            }
            // Specials
            if(type.getLocalPart().equals("ArrayOf_xsd_anyType"))
                return toArrayList(tm,value,targetClass,done);
          }
          return _toAxisTypeSub(tm,value,targetClass,done);
       
      }
      finally{
        done.remove(value);
      }
    }
   
    private static Object toAxisTypeSoap(TypeMapping tm,QName type, Object value, Class targetClass, Set<Object> done) throws PageException {
        String local = type.getLocalPart();
       
        if(local.equals(Constants.SOAP_ARRAY.getLocalPart())) return toArrayList(tm,value,targetClass,done);
        if(local.equals(Constants.SOAP_ARRAY12.getLocalPart())) return toArrayList(tm,value,targetClass,done);
        if(local.equals(Constants.SOAP_ARRAY_ATTRS11.getLocalPart())) return toArrayList(tm,value,targetClass,done);
        if(local.equals(Constants.SOAP_ARRAY_ATTRS12.getLocalPart())) return toArrayList(tm,value,targetClass,done);
        if(local.equals(Constants.SOAP_BASE64.getLocalPart())) return Caster.toBinary(value);
        if(local.equals(Constants.SOAP_BASE64BINARY.getLocalPart())) return Caster.toBinary(value);
        if(local.equals(Constants.SOAP_BOOLEAN.getLocalPart())) return Caster.toBoolean(value);
        if(local.equals(Constants.SOAP_BYTE.getLocalPart())) return Caster.toByte(value);
        if(local.equals(Constants.SOAP_DECIMAL.getLocalPart())) return new BigDecimal(Caster.toDoubleValue(value));
        if(local.equals(Constants.SOAP_DOUBLE.getLocalPart())) return Caster.toDouble(value);
        if(local.equals(Constants.SOAP_FLOAT.getLocalPart())) return new Float(Caster.toDoubleValue(value));
        if(local.equals(Constants.SOAP_INT.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.SOAP_INTEGER.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.SOAP_LONG.getLocalPart())) return Caster.toLong(value);
        if(local.equals(Constants.SOAP_MAP.getLocalPart())) return toMap(tm,value,targetClass,done);
        if(local.equals(Constants.SOAP_SHORT.getLocalPart())) return Caster.toShort(value);
        if(local.equals(Constants.SOAP_STRING.getLocalPart())) return Caster.toString(value);
        if(local.equals(Constants.SOAP_VECTOR.getLocalPart())) return toVector(tm,value,targetClass,done);
       
        // TODO SOAP_COMMON_ATTRS11, SOAP_COMMON_ATTRS12, SOAP_DOCUMENT, SOAP_ELEMENT
        return _toAxisTypeSub(tm,value,targetClass,done);
       
       
    }

    private static Object toAxisTypeXSD(TypeMapping tm,TimeZone tz,QName type, Object value, Class targetClass, Set<Object> done) throws PageException {
        String local = type.getLocalPart();
        if(local.equals(Constants.XSD_ANYSIMPLETYPE.getLocalPart())) return Caster.toString(value);
        if(local.equals(Constants.XSD_ANYURI.getLocalPart())) return toURI(value);
        if(local.equals(Constants.XSD_STRING.getLocalPart())) return Caster.toString(value);
        if(local.equals(Constants.XSD_BASE64.getLocalPart())) return Caster.toBinary(value);
        if(local.equals(Constants.XSD_BOOLEAN.getLocalPart())) return Caster.toBoolean(value);
        if(local.equals(Constants.XSD_BYTE.getLocalPart())) return Caster.toByte(value);
        if(local.equals(Constants.XSD_DATE.getLocalPart())) return Caster.toDate(value,null);
        if(local.equals(Constants.XSD_DATETIME.getLocalPart())) return Caster.toDate(value,null);
        if(local.equals(Constants.XSD_DAY.getLocalPart())) return toDay(value);
        if(local.equals(Constants.XSD_DECIMAL.getLocalPart())) return new BigDecimal(Caster.toDoubleValue(value));
        if(local.equals(Constants.XSD_DOUBLE.getLocalPart())) return Caster.toDouble(value);
        if(local.equals(Constants.XSD_DURATION.getLocalPart())) return toDuration(value);
        if(local.equals(Constants.XSD_ENTITIES.getLocalPart())) return toEntities(value);
        if(local.equals(Constants.XSD_ENTITY.getLocalPart())) return toEntity(value);
        if(local.equals(Constants.XSD_FLOAT.getLocalPart())) return new Float(Caster.toDoubleValue(value));
        if(local.equals(Constants.XSD_HEXBIN.getLocalPart())) return Caster.toBinary(value);
        if(local.equals(Constants.XSD_ID.getLocalPart())) return Caster.toString(value);
        if(local.equals(Constants.XSD_IDREF.getLocalPart())) return Caster.toString(value);
        if(local.equals(Constants.XSD_IDREFS.getLocalPart())) return Caster.toString(value);
        if(local.equals(Constants.XSD_INT.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.XSD_INTEGER.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.XSD_LANGUAGE.getLocalPart())) return toLanguage(value);
        if(local.equals(Constants.XSD_LONG.getLocalPart())) return Caster.toLong(value);
        if(local.equals(Constants.XSD_MONTH.getLocalPart())) return toMonth(value);
        if(local.equals(Constants.XSD_MONTHDAY.getLocalPart())) return toMonthDay(value);
        if(local.equals(Constants.XSD_NAME.getLocalPart())) return toName(value);
        if(local.equals(Constants.XSD_NCNAME.getLocalPart())) return toNCName(value);
        if(local.equals(Constants.XSD_NEGATIVEINTEGER.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.XSD_NMTOKEN.getLocalPart())) return toNMToken(value);
        if(local.equals(Constants.XSD_NMTOKENS.getLocalPart())) return toNMTokens(value);
        if(local.equals(Constants.XSD_NONNEGATIVEINTEGER.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.XSD_NONPOSITIVEINTEGER.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.XSD_NORMALIZEDSTRING.getLocalPart())) return Caster.toString(value);
        if(local.equals(Constants.XSD_POSITIVEINTEGER.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.XSD_QNAME.getLocalPart())) return toQName(value);
        if(local.equals(Constants.XSD_SCHEMA.getLocalPart())) return toQName(value);
        if(local.equals(Constants.XSD_SHORT.getLocalPart())) return Caster.toShort(value);
        if(local.equals(Constants.XSD_TIME.getLocalPart())) return DateCaster.toTime(tz,value);
        if(local.equals(Constants.XSD_TIMEINSTANT1999.getLocalPart())) return DateCaster.toTime(tz,value);
        if(local.equals(Constants.XSD_TIMEINSTANT2000.getLocalPart())) return DateCaster.toTime(tz,value);
        if(local.equals(Constants.XSD_TOKEN.getLocalPart())) return toToken(value);
        if(local.equals(Constants.XSD_UNSIGNEDBYTE.getLocalPart())) return Caster.toByte(value);
        if(local.equals(Constants.XSD_UNSIGNEDINT.getLocalPart())) return Caster.toInteger(value);
        if(local.equals(Constants.XSD_UNSIGNEDLONG.getLocalPart())) return Caster.toLong(value);
        if(local.equals(Constants.XSD_UNSIGNEDSHORT.getLocalPart())) return Caster.toShort(value);
        if(local.equals(Constants.XSD_YEAR.getLocalPart())) return toYear(value);
        if(local.equals(Constants.XSD_YEARMONTH.getLocalPart())) return toYearMonth(value);
        return _toAxisTypeSub(tm,value,targetClass,done);
    }

    private static ArrayList<Object> toArrayList(TypeMapping tm,Object value, Class targetClass, Set<Object> done) throws PageException {
        Array arr = Caster.toArray(value);
        ArrayList<Object> al=new ArrayList<Object>();
        int len=arr.size();
        Object o;
        for(int i=0;i<len;i++) {
            o=arr.get(i+1,null);
            al.add(i,_toAxisType(tm,null,null,o,targetClass,done));
        }
        return al;
    }
    private static Object[] toNativeArray(TypeMapping tm,Object value,Class targetClass, Set<Object> done) throws PageException {
      Object[] objs = Caster.toNativeArray(value);
      Object[] rtns;
      Class componentType = null;
      if(targetClass!=null) {
          componentType = targetClass.getComponentType();
        }
       
      if(componentType!=null)
          rtns = (Object[]) java.lang.reflect.Array.newInstance(componentType, objs.length);
        else
          rtns = new Object[objs.length];
     
        for(int i=0;i<objs.length;i++) {
          rtns[i]=_toAxisType(tm,null,null,objs[i],componentType,done);
        }
        return rtns;
    }

    private static Vector<Object> toVector(TypeMapping tm,Object value, Class targetClass, Set<Object> done) throws PageException {
        Array arr = Caster.toArray(value);
        Vector<Object> v=new Vector<Object>();
        int len=arr.size();
        Object o;
        for(int i=0;i<len;i++) {
            o=arr.get(i+1,null);
            v.set(i,_toAxisType(tm,null,null,o,targetClass,done));
        }
        return v;
    }

    private static Object toPojo(TypeMapping tm,Component comp, Class targetClass, Set<Object> done) throws PageException {

      PageContext pc = ThreadLocalPageContext.get();
     
      try {
        return _toPojo(pc, tm, comp,targetClass,done);
     
    }
    catch (Exception e) {
      throw Caster.toPageException(e);
    }
    /*finally {
      //pc.removeLastPageSource(true);
    }*/
    }
   
    private static Object _toPojo(PageContext pc, TypeMapping tm,Component comp, Class targetClass, Set<Object> done) throws PageException {//print.ds();System.exit(0);
      ComponentAccess ca = ComponentUtil.toComponentAccess(comp);
      comp=ComponentWrap.toComponentWrap(Component.ACCESS_PRIVATE,ca);
    ComponentScope scope = ca.getComponentScope();
     
      Property[] props=comp.getProperties(false);
      //Map rtn=new HashTable();
      Object obj=null;
    try {
      obj = ClassUtil.loadInstance(ComponentUtil.getServerComponentPropertiesClass(pc,comp));
    } catch (ClassException e) {
      throw Caster.toPageException(e);
    }
     
      //PageContext pc = ThreadLocalPageContext.get();
      Property p;
      Object v;
      Collection.Key k;
    CFMLExpressionInterpreter interpreter = new CFMLExpressionInterpreter();
      for(int i=0;i<props.length;i++){
        p=props[i];
        k=Caster.toKey(p.getName());
      // value
        v=scope.get(k,null);
        if(v==null)v=comp.get(k, null);
      // default
       
        if(v!=null)v=Caster.castTo(pc, p.getType(), v, false);
        else{
          if(!StringUtil.isEmpty(p.getDefault())){
            try {
              v=Caster.castTo(pc, p.getType(), p.getDefault(), false);
             
            }
              catch(PageException pe) {
                try {
                  v=interpreter.interpret(pc, p.getDefault());
                  v=Caster.castTo(pc, p.getType(), v, false);
                }
                  catch(PageException pe2) {
                  throw new ExpressionException("can not use default value ["+p.getDefault()+"] for property ["+p.getName()+"] with type ["+p.getType()+"]");
                  }
              }
          }
        }
       
      // set or throw
        if(v==null) {
          if(p.isRequired())throw new ExpressionException("required property ["+p.getName()+"] is not defined");
        }
        else {
          Reflector.callSetter(obj, p.getName().toLowerCase(), _toAxisType(tm,null,null,v,targetClass,done))
        }
      }
      return obj;
    }
   
    private static QueryBean toQueryBean(TypeMapping tm,Object value, Class targetClass, Set<Object> done) throws PageException {
      Query query = Caster.toQuery(value);
    int recordcount=query.getRecordcount();
        String[] columnList = query.getColumns();
        QueryColumn[] columns=new QueryColumn[columnList.length];
        Object[][] data = new Object[recordcount][columnList.length];
       
        for(int i=0;i<columnList.length;i++) {
          columns[i]=query.getColumn(columnList[i]);
        }
       
        int row;
        for(row=1;row<=recordcount;row++) {
            for(int i=0;i<columns.length;i++) {
              data[row-1][i]=_toAxisType(tm,null,null,columns[i].get(row,null),targetClass,done);
            }
        }
     
      QueryBean qb = new QueryBean();
      qb.setColumnList(columnList);
      qb.setData(data);
      return qb;
     
    }
   

   
    private static Map<String,Object> toMap(TypeMapping tm,Object value, Class targetClass, Set<Object> done) throws PageException {
        Struct src = Caster.toStruct(value);
        Map<String,Object> trg=new HashMap<String,Object>();
        Iterator<Entry<Key, Object>> it = src.entryIterator();
        Entry<Key, Object> e;
        while(it.hasNext()) {
          e = it.next();
            trg.put(e.getKey().getString(),_toAxisType(tm,null,null,e.getValue(),targetClass,done));

        }
        return trg;
       
    }

    private static Object _toAxisTypeSub(TypeMapping tm,Object value,Class targetClass,Set<Object> done) throws PageException {
      // Date
      if(value instanceof Date) {// not set to Decision.isDate(value)
          return new Date(((Date)value).getTime());
      }
     
      // Array
      if(Decision.isArray(value) && !(value instanceof Argument)) {
        if(value instanceof byte[]) return value;
        return toNativeArray(tm,value,targetClass,done);
      }
      // Struct
        if(Decision.isStruct(value)) {
          if(value instanceof Component) {
            Object pojo= toPojo(tm,(Component)value,targetClass,done);
            try 
              QName name = new QName("http://rpc.xml.coldfusion",pojo.getClass().getName());
            TypeMappingUtil.registerBeanTypeMapping(tm, pojo.getClass(), name);
             
            }
            catch(Throwable fault){
              throw Caster.toPageException(fault);
            }
            return pojo;
          }
          return toMap(tm,value,targetClass,done);
        }
        // Query
        if(Decision.isQuery(value)) return toQueryBean(tm,value,targetClass,done);
        // Other
        return value;
    }
   
    public static Class toAxisTypeClass(Class clazz) {
        if(Query.class==clazz) return QueryBean.class;
        if(Array.class==clazz) return Object[].class;
        if(Struct.class==clazz) return Map.class;
        return clazz;
    }
   
    private static Object toURI(Object value) throws PageException {
        if(value instanceof URI) return value;
        if(value instanceof java.net.URI) return value;
        try {
            return new URI(Caster.toString(value));
        } catch (MalformedURIException e) {
            throw Caster.toPageException(e);
        }
    }

    private static Token toToken(Object value) throws PageException {
        if(value instanceof Token) return (Token) value;
        return new Token(Caster.toString(value));
    }
   
    private static QName toQName(Object value) throws PageException {
        if(value instanceof QName) return (QName) value;
        return new QName(Caster.toString(value));
    }

    private static NMTokens toNMTokens(Object value) throws PageException {
        if(value instanceof NMTokens) return (NMTokens) value;
        return new NMTokens(Caster.toString(value));
    }
   
    private static NMToken toNMToken(Object value) throws PageException {
        if(value instanceof NMToken) return (NMToken) value;
        return new NMToken(Caster.toString(value));
    }
    private static NCName toNCName(Object value) throws PageException {
        if(value instanceof NCName) return (NCName) value;
        return new NCName(Caster.toString(value));
    }

    private static Name toName(Object value) throws PageException {
        if(value instanceof Name) return (Name) value;
        return new Name(Caster.toString(value));
    }

    private static Language toLanguage(Object value) throws PageException {
        if(value instanceof Language) return (Language) value;
        return new Language(Caster.toString(value));
    }

    private static Entities toEntities(Object value) throws PageException {
        if(value instanceof Entities) return (Entities) value;
        return new Entities(Caster.toString(value));
    }
   
    private static Entity toEntity(Object value) throws PageException {
        if(value instanceof Entity) return (Entity) value;
        return new Entity(Caster.toString(value));
    }

    private static Day toDay(Object value) throws PageException {
        if(value instanceof Day) return (Day) value;
        if(Decision.isDateSimple(value,false)) {
            return new Day(Caster.toDate(value,null).getDate());
        }
       
        try {
            return new Day(Caster.toIntValue(value));
        }
        catch (Exception e) {
            try {
                return new Day(Caster.toString(value));
            } catch (NumberFormatException nfe) {
                throw Caster.toPageException(nfe);
            }
            catch (ExpressionException ee) {
                throw ee;
            }
        }
    }

    private static Year toYear(Object value) throws PageException {
        if(value instanceof Year) return (Year) value;
        if(Decision.isDateSimple(value,false)) {
            return new Year(Caster.toDate(value,null).getYear());
        }
        try {
            return new Year(Caster.toIntValue(value));
        }
        catch (Exception e) {
            try {
                return new Year(Caster.toString(value));
            } catch (NumberFormatException nfe) {
                throw Caster.toPageException(nfe);
            }
            catch (ExpressionException ee) {
                throw ee;
            }
        }
    }

    private static Month toMonth(Object value) throws PageException {
        if(value instanceof Month) return (Month) value;
        if(Decision.isDateSimple(value,false)) {
            return new Month(Caster.toDate(value,null).getMonth());
        }
        try {
            return new Month(Caster.toIntValue(value));
        }
        catch (Exception e) {
            try {
                return new Month(Caster.toString(value));
            } catch (NumberFormatException nfe) {
                throw Caster.toPageException(nfe);
            }
            catch (ExpressionException ee) {
                throw ee;
            }
        }
    }

    private static YearMonth toYearMonth(Object value) throws PageException {
        if(value instanceof YearMonth) return (YearMonth) value;
        if(Decision.isDateSimple(value,false)) {
            DateTime dt = Caster.toDate(value,null);
            return new YearMonth(dt.getYear(),dt.getMonth());
        }
       
        try {
            return new YearMonth(Caster.toString(value));
        } catch (NumberFormatException nfe) {
            throw Caster.toPageException(nfe);
        }
        catch (ExpressionException ee) {
            throw ee;
        }
    }

    private static MonthDay toMonthDay(Object value) throws PageException {
        if(value instanceof MonthDay) return (MonthDay) value;
        if(Decision.isDateSimple(value,false)) {
            DateTime dt = Caster.toDate(value,null);
            return new MonthDay(dt.getMonth(),dt.getDate());
        }
       
        try {
            return new MonthDay(Caster.toString(value));
        } catch (NumberFormatException nfe) {
            throw Caster.toPageException(nfe);
        }
        catch (ExpressionException ee) {
            throw ee;
        }
    }

    private static Duration toDuration(Object value) throws PageException, IllegalArgumentException {
        if(value instanceof Duration) return (Duration) value;
        try {
            TimeSpan ts = Caster.toTimespan(value);
            return new Duration(true, 0, 0, ts.getDay(), ts.getHour(), ts.getMinute(), ts.getSecond());
        } catch (PageException e) {
            return new Duration(Caster.toString(value));
        }
    }

    public static Object toRailoType(PageContext pc, Object value) throws PageException {
      pc=ThreadLocalPageContext.get(pc);
      if(pc!=null && value instanceof Pojo) {
        try{
          ComponentAccess c = ComponentUtil.toComponentAccess(pc.loadComponent(value.getClass().getName()));
          ComponentWrap cw=ComponentWrap.toComponentWrap(Component.ACCESS_PRIVATE,c);
       
          // delete this scope data members
            Collection.Key[] keys = cw.keys();
            Object member;
            for(int i=0;i<keys.length;i++) {
              member = cw.get(keys[i]);
              if(member instanceof UDF) continue;
                    cw.removeEL(keys[i]);
            }
           
           
            Property[] props = c.getProperties(false);
            Property prop;
            for(int i=0;i<props.length;i++){
              prop=props[i];
              try{
                cw.set(pc, KeyImpl.init(prop.getName()), toRailoType(pc,Reflector.callGetter(value, prop.getName())));
              }
              catch(PageException pe){
                pe.printStackTrace();
              }
            }
            return c;
        }
        catch(Throwable t){
          return value;
        }
        }
        if(value instanceof Date || value instanceof Calendar) {// do not change to caster.isDate
          return Caster.toDate(value,null);
        }
        if(value instanceof Object[]) {
          Object[] arr=(Object[]) value;
          if(!ArrayUtil.isEmpty(arr)){
            boolean allTheSame=true;
            // byte
            if(arr[0] instanceof Byte){
              for(int i=1;i<arr.length;i++){
                if(!(arr[i] instanceof Byte)){
                  allTheSame=false;
                  break;
                }
              }
              if(allTheSame){
                byte[] bytes=new byte[arr.length];
                for(int i=0;i<arr.length;i++){
                    bytes[i]=Caster.toByteValue(arr[i]);
                  }
                return bytes;
              }
            }
          }
        }
        if(value instanceof Byte[]) {
          Byte[] arr=(Byte[]) value;
          if(!ArrayUtil.isEmpty(arr)){
        byte[] bytes=new byte[arr.length];
        for(int i=0;i<arr.length;i++){
            bytes[i]=arr[i].byteValue();
          }
        return bytes;
          }
        }
        if(value instanceof byte[]) {
          return value;
        }
        if(Decision.isArray(value)) {
            Array a = Caster.toArray(value);
            int len=a.size();
            Object o;
            for(int i=1;i<=len;i++) {
                o=a.get(i,null);
                if(o!=null)a.setEL(i,toRailoType(pc,o));
            }
            return a;
        }
        if(value instanceof Map) {
          Struct sct = new StructImpl();
            Iterator it=((Map)value).entrySet().iterator();
            Map.Entry entry;
            while(it.hasNext()) {
                entry=(Entry) it.next();
                sct.setEL(Caster.toString(entry.getKey()),toRailoType(pc,entry.getValue()));
            }
            return sct;
         
         
          //return StructUtil.copyToStruct((Map)value);
        }
        if(isQueryBean(value)) {
          QueryBean qb = (QueryBean) value;
            String[] strColumns = qb.getColumnList();
            Object[][] data = qb.getData();
            int recorcount=data.length;
            Query qry=new QueryImpl(strColumns,recorcount,"QueryBean");
            QueryColumn[] columns=new QueryColumn[strColumns.length];
            for(int i=0;i<columns.length;i++) {
              columns[i]=qry.getColumn(strColumns[i]);
            }
           
            int row;
            for(row=1;row<=recorcount;row++) {
              for(int i=0;i<columns.length;i++) {
                columns[i].set(row,toRailoType(pc,data[row-1][i]));
                }
            }
            return qry;
        }
        if(Decision.isQuery(value)) {
            Query q = Caster.toQuery(value);
            int recorcount=q.getRecordcount();
            String[] strColumns = q.getColumns();
           
            QueryColumn col;
            int row;
            for(int i=0;i<strColumns.length;i++) {
                col=q.getColumn(strColumns[i]);
                for(row=1;row<=recorcount;row++) {
                    col.set(row,toRailoType(pc,col.get(row,null)));
                }
            }
            return q;
        }
        return value;
    }

  private static boolean isQueryBean(Object value) {
    return (value instanceof QueryBean);
  }


}
TOP

Related Classes of railo.runtime.net.rpc.AxisCaster

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.