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

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

HIGHLIGHTS:

  • add SimultorProviders? hierarchy
  • start Framsticks server over SSH
  • FJF compatible with Framsticks 4.0rc3
  • reading and writing of standard.expt
  • a proof-of-concept implementation of StandardExperiment?

CHANGELOG:
Optionally return FreeAccess? from registry.

Add SimulatorRange?.

StandardExperiment? with genotypes circulation.

Automate registration around StandardState?.

More improvements to StandardExperiment?.

Skeleton version of StandardExperiment?.

Test saving of StandardState?.

Standard experiment state is being loaded.

More development towards StandardState? reading.

Work on reading standard experiment state.

Add classes for standard experiment.

Update example standard.expt

Add FreeAccess? and FreeObject?.

Made compatible with version 4.0rc3

Change deserialization policy.

Improve SSH support.

Working running simulator over SSH.

Fix joining bug in Experiment.

Working version of SimulatorRunner?.

Add more SimulatorProviders?.

Working PrimeExperimentTest? with 4.0rc3

Add references to deserialization.

Add OpaqueObject? and it's serialization.

Add deserialization of dictionaries.

Partial implementation of deserialization.

Add more tests for deserialization.

Prepare tests for deserialization.

Add proper result to prime experiment test.

Minor fixes to simulators providers.

Draft version of SimulatorProvider?.

Add SimulatorProvider? interface.

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.