source: java/main/src/main/java/com/framsticks/params/FramsClassBuilder.java @ 101

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

HIGHLIGHTS:

  • improve tree side notes
  • improve GUI layout
  • add foldable list of occured events to EventControl?
  • improve automatic type conversion in proxy listeners
  • implement several Access functionalities as algorithms independent of Access type
  • introduce draft base classes for distributed experiments
  • automatically register dependant Java classes to FramsClass? registry
  • add testing prime experiment and configuration
  • simplify and improve task dispatching

CHANGELOG:
Improve task dispatching in RemoteTree?.

GUI no longer hangs on connection problems.

Make all dispatchers joinables.

Refactorize Thread dispatcher.

Remove Task and PeriodicTask?.

Use Java utilities in those situations.

Reworking tasks dispatching.

Fix bug in EventControl? listener dispatching.

Minor improvements.

Add testing configuration for ExternalProcess? in GUI.

More improvement to prime.

Support for USERREADONLY in GUI.

Add that flag to various params in Java classes.

Remove redundant register clauses from several FramsClassAnnotations?.

Automatically gather and register dependant classes.

Add configuration for prime.

Improve Simulator class.

Add prime.xml configuration.

Introduce draft Experiment and Simulator classes.

Add prime experiment tests.

Enclose typical map with listeners into SimpleUniqueList?.

Needfile works in GUI.

Improve needfile handling in Browser.

More improvement with NeedFile?.

Implementing needfile.

Update test.

Rename ChangeEvent? to TestChangeEvent?.

Automatic argument type search in RemoteTree? listeners.

MultiParamLoader? uses AccessProvider?. By default old implementation
enclosed in AccessStash? or Registry.

Minor changes.

Rename SourceInterface? to Source.

Also improve toString of File and ListSource?.

Remove unused SimpleSource? class.

Add clearing in HistoryControl?.

Show entries in table at EventControl?.

Improve EventControl?.

Add listeners registration to EventControl?.

Add foldable table to HistoryControl?.

Add control row to Procedure and Event controls.

Improve layout of controls.

Another minor change to gui layout.

Minor improvement in the SliderControl?.

Minor changes.

Move ReflectionAccess?.Backend to separate file.

It was to cluttered.

Cleanup in ReflectionAccess?.

Move setMin, setMax, setDef to AccessOperations?.

Extract loading operation into AccessOperations?.

Append Framsticks to name of UnsupportedOperationException?.

The java.lang.UnsupportedOperationException? was shadowing this class.

Rename params.Util to params.ParamsUtil?.

Several improvements.

Minor changes.

Implement revert functionality.

Improve local changes management.

Minor improvement.

Remove methods rendered superfluous after SideNoteKey? improvement.

Improve SideNoteKey?.

It is now generic type, so explicit type specification at
call site is no more needed.

Introduce SideNoteKey? interface.

Only Objects implementing that key may be used as side note keys.

Minor improvements.

Use strings instead of ValueControls? in several gui mappings.

File size: 6.4 KB
Line 
1package com.framsticks.params;
2
3import java.io.InputStream;
4import java.lang.reflect.Field;
5import java.lang.reflect.Member;
6import java.lang.reflect.Method;
7import java.util.ArrayList;
8import java.util.Collections;
9import java.util.IdentityHashMap;
10import java.util.LinkedList;
11import java.util.List;
12import java.util.Map;
13
14import org.apache.logging.log4j.Logger;
15import org.apache.logging.log4j.LogManager;
16
17import com.framsticks.params.annotations.AutoAppendAnnotation;
18import com.framsticks.params.annotations.FramsClassAnnotation;
19import com.framsticks.params.annotations.ParamAnnotation;
20import com.framsticks.parsers.FileSource;
21import com.framsticks.parsers.Loaders;
22import com.framsticks.util.Builder;
23import com.framsticks.util.Misc;
24import com.framsticks.util.lang.Containers;
25import com.framsticks.util.lang.Strings;
26
27@FramsClassAnnotation(id = "class", name = "class")
28public class FramsClassBuilder implements Builder<FramsClass> {
29        private static final Logger log =
30                LogManager.getLogger(FramsClassBuilder.class);
31
32        public static String getName(FramsClassAnnotation fca, Class<?> javaClass) {
33                return fca.name().equals("") ? javaClass.getSimpleName() : fca.name();
34        }
35
36        public static String getId(FramsClassAnnotation fca, Class<?> javaClass) {
37                return fca.id().equals("") ? javaClass.getSimpleName() : fca.id();
38        }
39
40
41        public static final String GENERATE_HELP_PREFIX = "automatically generated from: ";
42
43        public static FramsClass readFromStream(InputStream stream) {
44                return Loaders.loadFramsClass(new FileSource(stream));
45        }
46
47        // public static Class<? extends Param> getParamType(@Nonnull Class<?> c) {
48        //      if (c.equals(Integer.class)) {
49        //              return DecimalParam.class;
50        //      }
51        //      if (c.equals(Double.class)) {
52        //              return FloatParam.class;
53        //      }
54        //      if (c.equals(String.class)) {
55        //              return StringParam.class;
56        //      }
57        //      if (c.equals(Object.class)) {
58        //              return UniversalParam.class;
59        //      }
60        //      return null;
61        // }
62
63        public static String extractIdOf(Member member) {
64                if (member instanceof Field) {
65                        return member.getName();
66                }
67                if (member instanceof Method) {
68                        Method m = (Method) member;
69                        String n = m.getName();
70                        int argsNum = m.getParameterTypes().length;
71                        if (argsNum == 0) {
72                                return n.startsWith("get") ? Strings.uncapitalize(n.substring(3)) : n;
73                        }
74                        if (argsNum == 1) {
75                                if (n.startsWith("set")) {
76                                        return Strings.uncapitalize(n.substring(3));
77                                }
78                                if (n.startsWith("add")) {
79                                        return Strings.uncapitalize(n.substring(3));
80                                }
81                                if (n.startsWith("remove")) {
82                                        return Strings.uncapitalize(n.substring(6));
83                                }
84                                return n;
85                        }
86                        log.error("invalid number of arguments");
87                        return null;
88                }
89                log.error("invalid kind of member");
90                return null;
91        }
92        public static String getName(ParamAnnotation annotation, Member member) {
93                return annotation.name().equals("") ? Strings.capitalize(extractIdOf(member)) : annotation.name();
94        }
95
96        public static String getId(ParamAnnotation annotation, Member member) {
97                return annotation.id().equals("") ? extractIdOf(member) : annotation.id();
98        }
99
100        public static ParamBuilder fill(ParamBuilder builder, Member member, ParamAnnotation annotation) {
101                return builder
102                        .id(getId(annotation, member))
103                        .name(getName(annotation, member));
104
105        }
106
107        public static final Map<Class<?>, FramsClass> synchronizedCacheForBasedOnForJavaClass = Collections.synchronizedMap(new IdentityHashMap<Class<?>, FramsClass>());
108
109        public FramsClass forClass(Class<?> javaClass) throws ConstructionException {
110                FramsClass result = synchronizedCacheForBasedOnForJavaClass.get(javaClass);
111                if (result != null) {
112                        return result;
113                }
114
115                log.debug("building for class {}", javaClass);
116
117                FramsClassAnnotation fca = javaClass.getAnnotation(FramsClassAnnotation.class);
118                if (fca == null) {
119                        throw new ConstructionException().msg("java class is not annotated with FramsClassAnnotation").arg("java", javaClass);
120                }
121
122                id(getId(fca, javaClass));
123                name(getName(fca, javaClass));
124
125                for (ParamCandidate pc : ParamCandidate.getAllCandidates(javaClass).getOrder()) {
126                        ParamBuilder builder = Param.build().id(pc.getId()).name(pc.getName()).flags(pc.getFlags());
127
128                        pc.induceParamType(builder);
129
130                        for (ParamAnnotation pa : pc.getAnnotations()) {
131                                if (!"".equals(pa.def())) {
132                                        builder.def(pa.def());
133                                }
134                                if (!"".equals(pa.help())) {
135                                        builder.help(pa.help());
136                                }
137                                if (!"".equals(pa.min())) {
138                                        builder.min(pa.min());
139                                }
140                                if (!"".equals(pa.max())) {
141                                        builder.max(pa.max());
142                                }
143                                builder.extra(pa.extra());
144                                if (!"".equals(pa.stringType())) {
145                                        builder.type(pa.stringType());
146                                }
147                                if (!pa.paramType().equals(Param.class)) {
148                                        builder.type(pa.paramType());
149                                }
150                        }
151                        param(builder);
152                }
153
154                result = finish();
155
156                synchronizedCacheForBasedOnForJavaClass.put(javaClass, result);
157
158                return result;
159        }
160
161
162        protected String id;
163
164        protected String name;
165
166        protected String description;
167
168        protected final List<Param> params = new LinkedList<>();
169
170        protected List<GroupBuilder> groupBuilders = new ArrayList<GroupBuilder>();
171
172        @ParamAnnotation
173        public FramsClassBuilder id(String id) {
174                this.id = id;
175                return this;
176        }
177
178        @ParamAnnotation
179        public FramsClassBuilder name(String name) {
180                this.name = name;
181                return this;
182        }
183
184        public FramsClassBuilder idAndName(String v) {
185                this.id = v;
186                this.name = v;
187                return this;
188        }
189
190        @ParamAnnotation(id = "desc")
191        public FramsClassBuilder description(String description) {
192                this.description = description;
193                return this;
194        }
195
196        public FramsClassBuilder() {
197        }
198
199        public FramsClass finish() {
200                return new FramsClass(this);
201        }
202
203        @AutoAppendAnnotation
204        public FramsClassBuilder param(ParamBuilder builder) {
205                Param param = builder.finish();
206
207                Integer group = param.getGroup();
208                if (group != null) {
209                        Containers.getFromList(groupBuilders, group, "group", this).addParam(param);
210                }
211
212                params.add(param);
213                return this;
214        }
215
216        @AutoAppendAnnotation
217        public FramsClassBuilder group(GroupBuilder builder) {
218                groupBuilders.add(builder);
219                return this;
220        }
221
222        /**
223         * @return the id
224         */
225        @ParamAnnotation
226        public String getId() {
227                return id;
228        }
229
230        /**
231         * @return the name
232         */
233        @ParamAnnotation
234        public String getName() {
235                return name;
236        }
237
238        /**
239         * @return the description
240         */
241        @ParamAnnotation(id = "desc")
242        public String getDescription() {
243                return description;
244        }
245
246        public FramsClassBuilder group(String group) {
247                return group(new GroupBuilder().name(group));
248        }
249
250        @Override
251        public String toString() {
252                return "FramsClassBuilder for " + Misc.returnNotNull(id, "<not yet known>");
253        }
254
255
256
257}
Note: See TracBrowser for help on using the repository browser.