[78] | 1 | package com.framsticks.params; |
---|
| 2 | |
---|
| 3 | import org.apache.log4j.Logger; |
---|
| 4 | |
---|
[86] | 5 | import com.framsticks.params.annotations.FramsClassAnnotation; |
---|
[88] | 6 | import com.framsticks.util.DoubleMap; |
---|
| 7 | import com.framsticks.util.FramsticksException; |
---|
[86] | 8 | |
---|
[87] | 9 | import java.util.Set; |
---|
[78] | 10 | |
---|
| 11 | /** |
---|
| 12 | * Author: Piotr Śniegowski |
---|
| 13 | */ |
---|
| 14 | public class Registry { |
---|
[84] | 15 | private static final Logger log = Logger.getLogger(Registry.class.getName()); |
---|
[78] | 16 | |
---|
[87] | 17 | // protected void internalRegisterClass(FramsClass framsClass, @Nullable Class<?> javaClass) { |
---|
| 18 | // assert framsClass.getName() != null; |
---|
| 19 | // assert framsClass.getId() != null; |
---|
| 20 | // infoCacheByName.put(framsClass.getName(), framsClass); |
---|
| 21 | // infoCacheById.put(framsClass.getId(), framsClass); |
---|
| 22 | |
---|
| 23 | // if (javaClass != null) { |
---|
| 24 | // reflectedClasses.put(framsClass, javaClass); |
---|
| 25 | // infoCacheByJavaName.put(javaClass.getCanonicalName(), framsClass); |
---|
| 26 | // } |
---|
| 27 | // } |
---|
[88] | 28 | protected final DoubleMap<String, Class<?>> javaClasses = new DoubleMap<>(); |
---|
| 29 | protected final DoubleMap<String, FramsClass> framsClasses = new DoubleMap<>(); |
---|
[87] | 30 | |
---|
| 31 | public void registerReflectedClass(String name, String id, Class<?> reflectedClass) { |
---|
| 32 | javaClasses.put(id, name, reflectedClass); |
---|
| 33 | } |
---|
| 34 | |
---|
[88] | 35 | public Registry registerAndBuild(Class<?> reflectedClass) { |
---|
| 36 | register(reflectedClass); |
---|
| 37 | putInfoIntoCache(FramsClass.build().forClass(reflectedClass)); |
---|
| 38 | return this; |
---|
| 39 | } |
---|
| 40 | |
---|
[86] | 41 | public Registry register(Class<?> reflectedClass) { |
---|
| 42 | FramsClassAnnotation a = reflectedClass.getAnnotation(FramsClassAnnotation.class); |
---|
| 43 | if (a == null) { |
---|
[88] | 44 | throw new FramsticksException().msg("class is not annotated").arg("class", reflectedClass); |
---|
[86] | 45 | } |
---|
| 46 | |
---|
| 47 | registerReflectedClass(FramsClassBuilder.getName(a, reflectedClass), FramsClassBuilder.getId(a, reflectedClass), reflectedClass); |
---|
| 48 | return this; |
---|
| 49 | } |
---|
| 50 | |
---|
| 51 | public AccessInterface createAccess(String name, FramsClass framsClass) throws ConstructionException { |
---|
[88] | 52 | // assert framsClasses.containsValue(framsClass); |
---|
[87] | 53 | if (javaClasses.containsKey(name)) { |
---|
| 54 | return new ReflectionAccess(javaClasses.get(name), framsClass); |
---|
[78] | 55 | } |
---|
| 56 | return new PropertiesAccess(framsClass); |
---|
| 57 | } |
---|
| 58 | |
---|
| 59 | public void putInfoIntoCache(FramsClass framsClass) { |
---|
[84] | 60 | log.debug("caching info for " + framsClass); |
---|
[87] | 61 | framsClasses.put(framsClass.getId(), framsClass.getName(), framsClass); |
---|
[78] | 62 | } |
---|
| 63 | |
---|
[87] | 64 | public FramsClass getInfoFromCache(String identifier) { |
---|
| 65 | if (identifier == null) { |
---|
[78] | 66 | return null; |
---|
| 67 | } |
---|
[87] | 68 | return framsClasses.get(identifier); |
---|
[78] | 69 | } |
---|
[84] | 70 | |
---|
| 71 | public static AccessInterface wrapAccessWithListIfNeeded(CompositeParam param, AccessInterface access) { |
---|
[86] | 72 | if (access == null) { |
---|
[84] | 73 | return null; |
---|
| 74 | } |
---|
[86] | 75 | return param.prepareAccessInterface(access); |
---|
[84] | 76 | } |
---|
| 77 | |
---|
[86] | 78 | public AccessInterface prepareAccess(CompositeParam param) throws ConstructionException { |
---|
| 79 | return wrapAccessWithListIfNeeded(param, createAccess(param.getContainedTypeName())); |
---|
| 80 | } |
---|
[84] | 81 | |
---|
[86] | 82 | public AccessInterface createAccess(String name) throws ConstructionException { |
---|
[84] | 83 | if (name == null) { |
---|
| 84 | return null; |
---|
| 85 | } |
---|
| 86 | FramsClass framsClass = getInfoFromCache(name); |
---|
| 87 | if (framsClass == null) { |
---|
| 88 | return null; |
---|
| 89 | } |
---|
| 90 | |
---|
| 91 | return createAccess(name, framsClass); |
---|
| 92 | } |
---|
| 93 | |
---|
[87] | 94 | public Set<Class<?>> getReflectedClasses() { |
---|
| 95 | return javaClasses.getValues(); |
---|
| 96 | } |
---|
| 97 | |
---|
| 98 | public Set<FramsClass> getInfoCache() { |
---|
| 99 | return framsClasses.getValues(); |
---|
| 100 | } |
---|
| 101 | |
---|
[78] | 102 | } |
---|