source: java/main/src/main/java/com/framsticks/params/ReflectionAccess.java @ 77

Last change on this file since 77 was 77, checked in by psniegowski, 11 years ago

Add new java codebase.

File size: 4.3 KB
Line 
1package com.framsticks.params;
2
3import java.lang.reflect.Field;
4import java.lang.reflect.InvocationTargetException;
5import java.util.List;
6
7import com.framsticks.params.types.ListParam;
8import org.apache.log4j.Logger;
9
10
11/**
12 * The Class ReflectionAccess. Stores data in provided object using reflection.
13 *
14 * @author Mateusz Jarus <name.surname@gmail.com> (please replace name and
15 *         surname with my personal data)
16 *
17 * @author Piotr Sniegowski
18 */
19public class ReflectionAccess extends SimpleAbstractAccess {
20        private final static Logger LOGGER = Logger.getLogger(ReflectionAccess.class
21                        .getName());
22
23
24    protected final Class reflectedClass;
25        private Object object;
26
27        public ReflectionAccess(Class reflectedClass, FramsClass framsClass) {
28        this.reflectedClass = reflectedClass;
29                setFramsClass(framsClass);
30        }
31
32        private static String accessorName(boolean get, String id) {
33                return (get ? "get"  : "set") + id.substring(0, 1).toUpperCase() + id.substring(1);
34        }
35
36        @Override
37        public <T> T get(Param param, Class<T> type) {
38                if (object == null) {
39                        return null;
40                }
41                try {
42                        //TODO: use internal id, if present
43                        String id = param.getId();
44                        try {
45                                return type.cast(object.getClass().getField(id).get(object));
46                        } catch (NoSuchFieldException ignored) {
47                        }
48                        try {
49                                return type.cast(object.getClass().getMethod(accessorName(true, id)).invoke(object));
50                        } catch (NoSuchMethodException ex) {
51                                //ex.printStackTrace();
52                        } catch (InvocationTargetException e) {
53                                //e.printStackTrace();
54            }
55
56                } catch (IllegalAccessException ex) {
57                        LOGGER.warn("illegal access error occurred while trying to access returnedObject");
58                        ex.printStackTrace();
59        } catch (ClassCastException ignored) {
60
61        }
62                return null;
63        }
64
65        @Override
66        protected <T> void internalSet(Param param, T value) {
67                setValue(param, value);
68        }
69
70        private <T> void setValue(Param param, T val) {
71                if (object == null) {
72                        return;
73        }
74                try {
75                        String id = param.getId();
76                        try {
77                                object.getClass().getField(id).set(object, val);
78                                return;
79                        } catch (NoSuchFieldException ignored) {
80                        }
81                        try {
82                                object.getClass().getMethod(accessorName(false, id), new Class[]{val.getClass()}).invoke(object, val);
83                        } catch (InvocationTargetException e) {
84                                //e.printStackTrace();
85                        } catch (NoSuchMethodException ignored) {
86                        }
87                } catch (IllegalAccessException ex) {
88                        LOGGER.warn("illegal access error occurred while trying to access returnedObject");
89                        ex.printStackTrace();
90                }
91        }
92
93        void resetErrors() {
94                //TODO this replaces returnedObject.resetErrors();
95        }
96
97        @Override
98        public void clearValues() {
99                if (object == null) {
100                        return;
101                }
102
103                resetErrors();
104
105                Field[] fields;
106                try {
107                        // TODO: conceptually invalid - should clean only fields that are specified in FramsClass
108                        fields = object.getClass().getFields();
109
110                        for (Field field : fields) {
111                                field.set(object, null);
112                        }
113                } catch (IllegalAccessException ex) {
114                        LOGGER.warn("IllegalAccessException thrown while trying to reset object values");
115                        ex.printStackTrace();
116                }
117        }
118
119        /**
120         * Sets the new object to operate on.
121         *
122         * @param object
123         *            new object to operate on
124         */
125        @Override
126        public void select(Object object) {
127                this.object = object;
128        }
129
130        @Override
131        public Object getSelected() {
132                return object;
133        }
134
135        // TODO: find a better place for it
136        public static String objectToString(Object object) {
137                StringBuilder b = new StringBuilder();
138                for (Field f : object.getClass().getFields()) {
139                        b.append(f.getName());
140                        b.append(":");
141                        try {
142                                Object value = f.get(object);
143                                b.append((value != null) ? value.toString() : "<null>");
144                        } catch (IllegalAccessException e) {
145                                e.printStackTrace();
146                        }
147                        b.append("\n");
148                }
149                return b.toString();
150        }
151
152
153        @Override
154        public ReflectionAccess cloneAccess() {
155                return new ReflectionAccess(reflectedClass, framsClass);
156        }
157
158    @Override
159    public Object createAccessee() {
160        try {
161            return reflectedClass.newInstance();
162        } catch (InstantiationException e) {
163            e.printStackTrace();
164        } catch (IllegalAccessException e) {
165            e.printStackTrace();
166        }
167        LOGGER.fatal("failed to create reflected object of class " + reflectedClass.getCanonicalName() + " for frams type " + framsClass.getId());
168
169        return null;
170    }
171}
Note: See TracBrowser for help on using the repository browser.