source: java/main/src/main/java/com/framsticks/params/Registry.java @ 103

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

HIGHLIGHTS:

  • add auto loading and saving algorithms between

frams files format and Java classes

  • respect ValueChange? events in GUI (do not reload object)
  • support results of procedures in Java server
  • make Experiment automatically convert between frams file and NetFile? object
  • add MessageLogger? (compatible with original frams server messages)
  • WorkPackageLogic? now validates results, is able to discard them, reschedule

whole package, or only uncomputed remainder

CHANGELOG:
Show just a short description in PrimeExperiment?.

Add primes_changed event to the PrimeExperiment?.

Make WorkPackageLogic? robust to frams server returning invalid results.

Add MessageLogger? to logics.

Add NetFile? interface. Support Messages from server.

Minor changes to connections.

Merge results in the PrimeExperiment?.

More netload class->file conversion to Simulator.

Move netsave parsing to Simulator.

Fix bug with inverted ordering of events firing in Experiment.

Minor changes.

Minor logging changes.

Use AccessOperations?.convert in NetLoadSaveLogic?

NetLoadSaveLogic? now encloses the conversion.

Use more generic AccessOperations? saveAll and loadAll in PrimePackage?.

Add Result class for enclosing of call invocations' results.

Improve feature request handling in Connections.

Use AccessOperations?.convert in RemoteTree? events parsing.

Minor change.

Add some information params to Java server root and CLI objects.

A draft implementation of loadAll algorithm.

That algorithm tries to load objects into a tree structure.

Add AccessOperationsTest? test.

Develop WorkPackageLogic?.

  • add state tracking fields
  • add work package generation

Add utility class SimplePrimitive?.

Meant for Java backend classes, enclose a single primitive value
and set of listeners.

Improve primitive value refresh in GUI.

When ValueChange? found in called event, do not reload whole
object, but only update GUI (no communication is performed).

Use ValueChange? in the TestClass? test.

Minor changes.

Sending all packages in PrimeExperiment? to the frams servers.

Develop AccessOperations?.loadComposites().

Remove addAccess from MultiParamLoader? interface.

There is now no default AccessProvider? in MultiParamLoader?.
User must explicitely set AccessStash? or Registry.

Improve saving algorithms in AccessOperations?.

File size: 5.2 KB
Line 
1package com.framsticks.params;
2
3import org.apache.logging.log4j.Logger;
4import org.apache.logging.log4j.LogManager;
5
6import com.framsticks.params.annotations.FramsClassAnnotation;
7import com.framsticks.params.annotations.ParamAnnotation;
8import com.framsticks.util.DoubleMap;
9import com.framsticks.util.FramsticksException;
10import com.framsticks.util.lang.Strings;
11
12import java.util.IdentityHashMap;
13import java.util.Map;
14import java.util.Set;
15
16import javax.annotation.Nonnull;
17
18/**
19 * Author: Piotr Śniegowski
20 */
21@FramsClassAnnotation
22public class Registry implements AccessProvider {
23        private static final Logger log = LogManager.getLogger(Registry.class.getName());
24
25        protected final DoubleMap<String, Class<?>> javaClasses = new DoubleMap<>();
26        protected final DoubleMap<String, FramsClass> framsClasses = new DoubleMap<>();
27        protected final Map<Class<?>, FramsClass> javaToFramsAssociation = new IdentityHashMap<>();
28
29        /**
30         *
31         */
32        public Registry() {
33                // registerAndBuild(Registry.class);
34                // registerAndBuild(FramsClass.class);
35                // registerAndBuild(Param.class);
36        }
37
38        public void registerReflectedClass(String name, String id, Class<?> javaClass) {
39                javaClasses.put(id, name, javaClass);
40        }
41
42        public void associate(Class<?> javaClass, FramsClass framsClass) {
43                javaToFramsAssociation.put(javaClass, framsClass);
44        }
45
46        public Registry registerAndBuild(Class<?> javaClass) {
47                if (javaToFramsAssociation.containsKey(javaClass)) {
48                        return this;
49                }
50                register(javaClass);
51                associate(javaClass, putFramsClass(FramsClass.build().forClass(javaClass)));
52                for (Class<?> r : ParamCandidate.getAllCandidates(javaClass).getDependentClasses()) {
53                        registerAndBuild(r);
54                }
55                return this;
56        }
57
58        public FramsClass registerReflectedIfNeeded(Class<?> javaClass) {
59                if (!javaToFramsAssociation.containsKey(javaClass)) {
60                        registerAndBuild(javaClass);
61                }
62                return javaToFramsAssociation.get(javaClass);
63        }
64
65        public Registry register(Class<?> javaClass) {
66                FramsClassAnnotation a = javaClass.getAnnotation(FramsClassAnnotation.class);
67                if (a == null) {
68                        throw new FramsticksException().msg("class is not annotated").arg("class", javaClass);
69                }
70
71                registerReflectedClass(FramsClassBuilder.getName(a, javaClass), FramsClassBuilder.getId(a, javaClass), javaClass);
72                return this;
73        }
74
75        public @Nonnull ReflectionAccess createAccess(Class<?> javaClass) throws ConstructionException {
76                try {
77                        if (!javaClasses.containsValue(javaClass)) {
78                                throw new FramsticksException().msg("java class is not registered");
79                        }
80                        if (!javaToFramsAssociation.containsKey(javaClass)) {
81                                throw new FramsticksException().msg("java class is not associated with any frams class");
82                        }
83                        return new ReflectionAccess(javaClass, javaToFramsAssociation.get(javaClass));
84                }
85                catch (FramsticksException e) {
86                        throw new FramsticksException().msg("failed to create access for java class").arg("class", javaClass).cause(e);
87                }
88        }
89
90        public @Nonnull Access createAccess(String name, FramsClass framsClass) throws ConstructionException {
91                // assert framsClasses.containsValue(framsClass);
92                if (javaClasses.containsKey(name)) {
93                        return new ReflectionAccess(javaClasses.get(name), framsClass);
94                }
95                return new PropertiesAccess(framsClass);
96        }
97
98        public FramsClass putFramsClass(FramsClass framsClass) {
99                log.debug("caching info for {}", framsClass);
100                framsClasses.put(framsClass.getId(), framsClass.getName(), framsClass);
101                return framsClass;
102        }
103
104        public FramsClass getFramsClass(@Nonnull CompositeParam param) {
105                return framsClasses.get(param.getContainedTypeName());
106        }
107
108        public FramsClass getFramsClass(@Nonnull String identifier) {
109                return framsClasses.get(identifier);
110        }
111
112        public static @Nonnull Access wrapAccessWithListIfNeeded(@Nonnull CompositeParam param, @Nonnull Access access) {
113                return param.prepareAccess(access);
114        }
115
116        public @Nonnull Access prepareAccess(CompositeParam param) throws ConstructionException {
117                return wrapAccessWithListIfNeeded(param, createAccess(param.getContainedTypeName()));
118        }
119
120        public @Nonnull Access createAccess(@Nonnull String name) throws ConstructionException {
121                try {
122                        Strings.assureNotEmpty(name);
123                        FramsClass framsClass = getFramsClass(name);
124                        if (framsClass == null) {
125                                throw new ConstructionException().msg("framsclass is missing");
126                        }
127
128                        return createAccess(name, framsClass);
129                }
130                catch (FramsticksException e) {
131                        throw new FramsticksException().msg("failed to create access for name").arg("name", name).cause(e);
132                }
133        }
134
135        public FramsClass getFramsClassForJavaClass(Class<?> javaClass) {
136                return javaToFramsAssociation.get(javaClass);
137        }
138
139        public Set<Class<?>> getReflectedClasses() {
140                return javaClasses.getValues();
141        }
142
143        public Set<FramsClass> getFramsClasses() {
144                return framsClasses.getValues();
145        }
146
147        @ParamAnnotation
148        public Map<String, FramsClass> getFramsClassesById() {
149                return framsClasses.getValuesById();
150        }
151
152        public void takeAllFrom(Registry source) {
153                for (Class<?> javaClass : source.getReflectedClasses()) {
154                        register(javaClass);
155                }
156                for (FramsClass framsClass : source.getFramsClasses()) {
157                        putFramsClass(framsClass);
158                }
159
160        }
161
162        @Override
163        public Access getAccess(String name) {
164                return createAccess(name);
165        }
166
167        public Access bindAccessFor(Object object) {
168                return createAccess(object.getClass()).select(object);
169        }
170
171
172}
Note: See TracBrowser for help on using the repository browser.