Ignore:
Timestamp:
06/28/13 11:56:03 (11 years ago)
Author:
psniegowski
Message:

HIGHLIGHTS:

  • FramsClass? and contained Param are now immutable classes (like String),

which allows to refer to them concurrently without synchronization
(which for example in turn simplifies GUI management)

  • also make Path immutable (which was earlier only assumed)
  • add global cache for FramsClasses? created solely and automatically

on base of Java classes.

representations basing on given FramsClass?

  • above changes greatly improved GUI responsivness during browsing
  • furtherly improve Param class hierarchy
  • allow to inject actions on state changes into MultiParamLoader?
  • add more tests

CHANGELOG:

Add StatusListener? to MultiParamLoader?.

Minor refactorization in MultiParamLoader?.

First step with auto append.

Add SchemaTest?.

Improve Registry.

Clean up in Registry.

Work out Registry.

Use annotations for Param.

Fix ListChange?.

Improve fluent interface of the FramsClassBuilder?.

Done caching of ReflectionAccess?.Backend

Fix hashCode of Pair.

A step on a way to cache ReflectionAccess?.Backend

Make SimpleAbstractAccess?.framsClass a final field.

Add static cache for FramsClasses? based on java.

Only classes created strictly and automatically
based on java classes are using this cache.

Make all Params immutable.

Many improvement to make Param immutable.

Make PrimitiveParam? generic type.

Several changes to make Param immutable.

Make FramsClass? immutable.

Another improvement to Path immutability.

Several improvements to Path.

Improve PathTest?.

Configurarable MutabilityDetector?.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • java/main/src/main/java/com/framsticks/params/Registry.java

    r86 r87  
    55import com.framsticks.params.annotations.FramsClassAnnotation;
    66
     7import java.util.Collections;
    78import java.util.HashMap;
     9import java.util.HashSet;
    810import java.util.Map;
     11import java.util.Set;
    912
    1013/**
     
    1417        private static final Logger log = Logger.getLogger(Registry.class.getName());
    1518
    16         protected final Map<String, Class<?>> reflectedClasses = new HashMap<String, Class<?>>();
    17         protected final Map<String, String> invertedReflectedClasses = new HashMap<String, String>();
    18         protected final Map<String, FramsClass> infoCache = new HashMap<String, FramsClass>();
     19        public static class DoubleSet<K1, K2, V> {
     20                protected final Map<K1, V> byId = new HashMap<>();
     21                protected final Map<K2, V> byName = new HashMap<>();
     22                protected final Set<V> values = new HashSet<>();
    1923
    20         public final void registerReflectedClass(String name, String id, String className) {
    21                 try {
    22                         registerReflectedClass(name, id, Class.forName(className));
    23                 } catch (ClassNotFoundException e) {
    24                         log.fatal("class not found during registration: " + e);
     24                public int size() {
     25                        return values.size();
     26                }
     27
     28                public void put(K1 id, K2 name, V value) {
     29                        values.add(value);
     30                        if (id != null) {
     31                                byId.put(id, value);
     32                        }
     33                        if (name != null) {
     34                                byName.put(name, value);
     35                        }
     36                }
     37
     38                public boolean containsValue(V value) {
     39                        return values.contains(value);
     40
     41                }
     42
     43                public boolean containsKey(String identifier) {
     44                        return byId.containsKey(identifier) || byName.containsKey(identifier);
     45                }
     46
     47                public V get(String identifier) {
     48                        if (byId.containsKey(identifier)) {
     49                                return byId.get(identifier);
     50                        }
     51                        if (byName.containsKey(identifier)) {
     52                                return byName.get(identifier);
     53                        }
     54                        return null;
     55                }
     56
     57                public Set<V> getValues() {
     58                        return Collections.unmodifiableSet(values);
    2559                }
    2660        }
    2761
    28         public void registerReflectedClass(String name, String id,
    29                         Class<?> reflectedClass) {
    30                 if (name != null) {
    31                         reflectedClasses.put(name, reflectedClass);
    32                         invertedReflectedClasses.put(reflectedClass.getCanonicalName(), name);
    33                 }
    34                 if (id != null) {
    35                         reflectedClasses.put(id, reflectedClass);
    36                 }
     62        // protected void internalRegisterClass(FramsClass framsClass, @Nullable Class<?> javaClass) {
     63        //      assert framsClass.getName() != null;
     64        //      assert framsClass.getId() != null;
     65        //      infoCacheByName.put(framsClass.getName(), framsClass);
     66        //      infoCacheById.put(framsClass.getId(), framsClass);
     67
     68        //      if (javaClass != null) {
     69        //              reflectedClasses.put(framsClass, javaClass);
     70        //              infoCacheByJavaName.put(javaClass.getCanonicalName(), framsClass);
     71        //      }
     72        // }
     73        protected final DoubleSet<String, String, Class<?>> javaClasses = new DoubleSet<>();
     74        protected final DoubleSet<String, String, FramsClass> framsClasses = new DoubleSet<>();
     75
     76        public void registerReflectedClass(String name, String id, Class<?> reflectedClass) {
     77                javaClasses.put(id, name, reflectedClass);
    3778        }
    3879
     
    5091
    5192        public AccessInterface createAccess(String name, FramsClass framsClass) throws ConstructionException {
    52                 if (reflectedClasses.containsKey(name)) {
    53                         return new ReflectionAccess(reflectedClasses.get(name), framsClass);
     93                assert framsClasses.containsValue(framsClass);
     94                if (javaClasses.containsKey(name)) {
     95                        return new ReflectionAccess(javaClasses.get(name), framsClass);
    5496                }
    5597                return new PropertiesAccess(framsClass);
     
    5799
    58100        public void putInfoIntoCache(FramsClass framsClass) {
    59                 if (infoCache.containsKey(framsClass.getId())) {
    60                         log.info("already cached " + framsClass);
    61                         return;
    62                 }
    63101                log.debug("caching info for " + framsClass);
    64                 infoCache.put(framsClass.getId(), framsClass);
    65                 infoCache.put(framsClass.getName(), framsClass);
     102                framsClasses.put(framsClass.getId(), framsClass.getName(), framsClass);
    66103        }
    67104
    68         public FramsClass getInfoFromCache(String id) {
    69                 if (id == null) {
     105        public FramsClass getInfoFromCache(String identifier) {
     106                if (identifier == null) {
    70107                        return null;
    71108                }
    72                 if (infoCache.containsKey(id)) {
    73                         return infoCache.get(id);
    74                 }
    75                 if (invertedReflectedClasses.containsKey(id)) {
    76                         return getInfoFromCache(invertedReflectedClasses.get(id));
    77                 }
    78                 return null;
     109                return framsClasses.get(identifier);
    79110        }
    80111
     
    102133        }
    103134
     135        public Set<Class<?>> getReflectedClasses() {
     136                return javaClasses.getValues();
     137        }
     138
     139        public Set<FramsClass> getInfoCache() {
     140                return framsClasses.getValues();
     141        }
     142
    104143}
Note: See TracChangeset for help on using the changeset viewer.