001    package railo.intergral.fusiondebug.server.type.nat;
002    
003    import java.lang.reflect.Field;
004    import java.lang.reflect.Method;
005    import java.lang.reflect.Modifier;
006    import java.util.ArrayList;
007    import java.util.List;
008    
009    import railo.commons.lang.ClassUtil;
010    import railo.intergral.fusiondebug.server.type.FDValueNotMutability;
011    import railo.intergral.fusiondebug.server.type.simple.FDSimpleVariable;
012    import railo.runtime.op.Caster;
013    import railo.runtime.type.ObjectWrap;
014    
015    import com.intergral.fusiondebug.server.IFDStackFrame;
016    
017    public class FDNative extends FDValueNotMutability {
018    
019            private ArrayList children=new ArrayList();
020            
021            private String name;
022    
023            private Object value;
024    
025            /**
026             * Constructor of the class
027             * @param frame 
028             * @param name
029             * @param coll
030             */
031            public FDNative(IFDStackFrame frame, String name, Object value) {
032                    this.name=name;
033                    
034                    if(value instanceof ObjectWrap){
035                            value=((ObjectWrap)value).getEmbededObject(value);
036                    }
037                    this.value=value;
038                    
039                    Class clazz = value.getClass();
040                    
041                    
042                    // super
043                    children.add(new FDSimpleVariable(frame,"Extends",ClassUtil.getName(clazz.getSuperclass()),null));
044                    
045                    // interfaces
046                    Class[] faces = clazz.getInterfaces();
047                    if(faces.length>0){
048                            ArrayList list = new ArrayList();
049                            
050                            children.add(new FDSimpleVariable(frame,"Interfaces","",list));
051                            for(int i=0;i<faces.length;i++){
052                                    list.add(new FDSimpleVariable(frame,"["+(i+1)+"]",ClassUtil.getName(faces[i]),null));
053                            }
054                    }
055                    ArrayList el,list;
056                    
057                    // fields
058                    Field[] flds = clazz.getFields();
059                    if(flds.length>0){
060                            Field fld;
061                            list = new ArrayList();
062                            children.add(new FDSimpleVariable(frame,"Fields","",list));
063                            for(int i=0;i<flds.length;i++){
064                                    fld=flds[i];
065                                    el = new ArrayList();
066                                    list.add(new FDSimpleVariable(frame,fld.getName(),"",el));
067                                    el.add(new FDSimpleVariable(frame,"Type",ClassUtil.getName(fld.getType()),null));
068                                    el.add(new FDSimpleVariable(frame,"Modifier",Modifier.toString(fld.getModifiers()),null));
069                            }
070                    }
071                    // methods
072                    Method[] mths = clazz.getMethods();
073                    if(mths.length>0){
074                            Method mth;
075                            list = new ArrayList();
076                            children.add(new FDSimpleVariable(frame,"Methods","",list));
077                            for(int i=0;i<mths.length;i++){
078                                    mth=mths[i];
079                                    el = new ArrayList();
080                                    list.add(new FDSimpleVariable(frame,mth.getName(),"",el));
081                                    
082                                    el.add(new FDSimpleVariable(frame,"Modifier",Modifier.toString(mth.getModifiers()),null));
083                                    
084                                    // exceptions
085                                    Class[] clsTypes = mth.getExceptionTypes();
086                                    if(clsTypes.length>0){
087                                            ArrayList exps = new ArrayList();
088                                            el.add(new FDSimpleVariable(frame,"Exceptions",Caster.toString(clsTypes.length),exps));
089                                            for(int y=0;y<clsTypes.length;y++){
090                                                    exps.add(new FDSimpleVariable(frame,"["+(y+1)+"]",ClassUtil.getName(clsTypes[y]),null));
091                                            }
092                                    }
093                                    
094                                    // params
095                                    Class[] clsParams = mth.getParameterTypes();
096                                    if(clsParams.length>0){
097                                            ArrayList params = new ArrayList();
098                                            el.add(new FDSimpleVariable(frame,"Parameters",Caster.toString(clsParams.length),params));
099                                            for(int y=0;y<clsParams.length;y++){
100                                                    params.add(new FDSimpleVariable(frame,"["+(y+1)+"]",ClassUtil.getName(clsParams[y]),null));
101                                            }
102                                    }
103                                    
104                                    // return
105                                    el.add(new FDSimpleVariable(frame,"Return",ClassUtil.getName(mth.getReturnType()),null));
106                            }
107                    }
108            }
109    
110            @Override
111            public List getChildren() {
112                    return children;
113            }
114    
115            public String getName() {
116                    return name;
117            }
118    
119            @Override
120            public boolean hasChildren() {
121                    return true;
122            }
123            
124            @Override
125            public String toString() {
126                    return Caster.toClassName(value);
127            }
128    }