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

Last change on this file since 193 was 193, checked in by Maciej Komosinski, 10 years ago

Set svn:eol-style native for all textual files

  • Property svn:eol-style set to native
File size: 6.6 KB
Line 
1package com.framsticks.params;
2
3import java.lang.reflect.InvocationTargetException;
4import java.lang.reflect.Method;
5
6
7import org.apache.logging.log4j.Logger;
8import org.apache.logging.log4j.LogManager;
9
10import com.framsticks.params.types.EventParam;
11import com.framsticks.params.types.ProcedureParam;
12import com.framsticks.util.FramsticksException;
13import com.framsticks.util.Misc;
14
15import static com.framsticks.util.lang.Containers.*;
16
17/**
18 * The Class ReflectionAccess. Stores data in provided object using reflection.
19 *
20 * @author Mateusz Jarus <name.surname@gmail.com> (please replace name and
21 *         surname with my personal data)
22 *
23 * @author Piotr Sniegowski
24 */
25public class ReflectionAccess extends SimpleAbstractAccess {
26        private final static Logger log = LogManager.getLogger(ReflectionAccess.class.getName());
27
28        protected final Class<?> javaClass;
29        protected final ReflectionAccessBackend backend;
30
31        private Object object;
32
33        public ReflectionAccess(Class<?> javaClass) throws ConstructionException {
34                this(javaClass, FramsClass.build().forClass(javaClass));
35        }
36
37
38        public ReflectionAccess(Class<?> javaClass, FramsClass framsClass) throws ConstructionException {
39                this(javaClass, framsClass, ReflectionAccessBackend.getOrCreateFor(javaClass, framsClass));
40        }
41
42        protected ReflectionAccess(Class<?> javaClass, FramsClass framsClass, ReflectionAccessBackend backend) throws ConstructionException {
43                super(framsClass);
44                this.javaClass = javaClass;
45                this.backend = backend;
46        }
47
48        @Override
49        public ReflectionAccess cloneAccess() {
50                return new ReflectionAccess(javaClass, framsClass, backend);
51        }
52
53        @Override
54        public <T> T get(ValueParam param, Class<T> type) {
55                try {
56                        try {
57                                if (object == null) {
58                                        throw new FramsticksException().msg("no object set");
59                                }
60
61                                return backend.getters.get(param.getId()).get(object, type);
62                        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
63                                throw new FramsticksException().msg("failed to get").cause(e);
64                        }
65                } catch (FramsticksException e) {
66                        throw e.arg("param", param).arg("type", type).arg("access", this);
67                }
68        }
69
70        @Override
71        protected <T> void internalSet(ValueParam param, T value) {
72                setValue(param, value);
73        }
74
75        private <T> void setValue(ValueParam param, T value) {
76                try {
77                        try {
78                                if (object == null) {
79                                        throw new FramsticksException().msg("no object set");
80                                }
81                                ReflectionAccessBackend.ReflectedSetter s = backend.setters.get(param.getId());
82                                if (s == null) {
83                                        throw new FramsticksException().msg("trying to set unsettable");
84                                        // return;
85                                        // if (value != backend.getters.get(param).get(object, Object.class)) {
86                                        // }
87                                }
88                                s.set(object, value);
89                        } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
90                                throw new FramsticksException().msg("failed to set").cause(e);
91                        }
92                } catch (FramsticksException e) {
93                        throw e.arg("param", param).arg("value", value).arg("value type", Misc.getClass(value)).arg("access", this);
94                }
95        }
96
97        @Override
98        public void reg(EventParam param, EventListener<?> listener) {
99                try {
100                        try {
101                                if (object == null) {
102                                        throw new FramsticksException().msg("no object set");
103                                }
104
105                                backend.adders.get(param.getId()).reg(object, listener);
106                                return;
107                        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
108                                throw new FramsticksException().msg("failed to add listener").cause(e);
109                        }
110                } catch (FramsticksException e) {
111                        throw e.arg("param", param).arg("access", this);
112                }
113        }
114
115        @Override
116        public void regRemove(EventParam param, EventListener<?> listener) {
117                try {
118                        try {
119                                if (object == null) {
120                                        throw new FramsticksException().msg("no object set");
121                                }
122
123                                backend.removers.get(param.getId()).regRemove(object, listener);
124                                return;
125                        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
126                                throw new FramsticksException().msg("failed to remove listener").cause(e);
127                        }
128                } catch (FramsticksException e) {
129                        throw e.arg("param", param).arg("access", this);
130                }
131        }
132
133        @Override
134        public Object call(String id, Object... arguments) {
135                try {
136                        try {
137                                if (object == null) {
138                                        throw new FramsticksException().msg("no object set");
139                                }
140                                ReflectionAccessBackend.ReflectedCaller c = backend.callers.get(id);
141                                if (c == null) {
142                                        throw new FramsticksException().msg("method is not bound");
143                                }
144                                return c.call(object, arguments);
145                        } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
146                                throw new FramsticksException().msg("failed to call").cause(e);
147                        }
148                } catch (FramsticksException e) {
149                        throw e.arg("param", framsClass.getParam(id)).arg("access", this);
150                }
151        }
152
153        @Override
154        public Object call(ProcedureParam param, Object... arguments) {
155                return call(param.getId(), arguments);
156        }
157
158        @Override
159        public void clearValues() {
160                if (object == null) {
161                        return;
162                }
163
164                try {
165                        for (ValueParam p : filterInstanceof(framsClass.getParams(), ValueParam.class)) {
166                                setValue(p, p.getDef(Object.class));
167                        }
168                } catch (IllegalArgumentException ex) {
169                        ex.printStackTrace();
170                }
171        }
172
173        /**
174         * Sets the new object to operate on.
175         *
176         * @param object
177         *            new object to operate on
178         */
179        @Override
180        public ReflectionAccess select(Object object) {
181                this.object = ParamsUtil.selectObjectForAccess(this, object, javaClass);
182                return this;
183        }
184
185        @Override
186        public Object getSelected() {
187                return object;
188        }
189
190        @Override
191        public Object createAccessee() {
192                try {
193                        return javaClass.newInstance();
194                } catch (InstantiationException | IllegalAccessException e) {
195                        throw new FramsticksException().msg("failed to create reflected object").arg("java class", javaClass).arg("frams class", framsClass).cause(e);
196                }
197        }
198
199        @Override
200        public void tryAutoAppend(Object value) {
201                assert object != null;
202                try {
203                        for (Method m : backend.autoAppendMethods) {
204                                if (m.getParameterTypes()[0].isAssignableFrom(value.getClass())) {
205                                        try {
206                                                log.trace("auto appending with value {} with method {}", value, m);
207                                                m.invoke(object, value);
208                                                return;
209                                        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | FramsticksException e) {
210                                                throw new FramsticksException().msg("failed to auto append").cause(e).arg("with method", m);
211                                        }
212                                }
213                        }
214                        throw new FramsticksException().msg("no method found to append");
215                } catch (FramsticksException e) {
216                        throw e.arg("value", value).arg("into object", object);
217                }
218
219        }
220
221        @Override
222        public String toString() {
223                StringBuilder b = new StringBuilder();
224                b.append(framsClass);
225                if (getSelected() != null) {
226                        b.append("(").append(getSelected()).append(")");
227                }
228                return b.toString();
229        }
230}
231
Note: See TracBrowser for help on using the repository browser.