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

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

Add f0 parsing and f0->Model transformation.

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