You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2009/03/24 23:17:18 UTC

svn commit: r758061 - in /commons/sandbox/flatfile/trunk/src/main: antlr/EntityTreeParser.g java/org/apache/commons/flatfile/dsl/ParserEntityFactory.java

Author: mbenson
Date: Tue Mar 24 22:17:18 2009
New Revision: 758061

URL: http://svn.apache.org/viewvc?rev=758061&view=rev
Log:
address some TODOs

Modified:
    commons/sandbox/flatfile/trunk/src/main/antlr/EntityTreeParser.g
    commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/dsl/ParserEntityFactory.java

Modified: commons/sandbox/flatfile/trunk/src/main/antlr/EntityTreeParser.g
URL: http://svn.apache.org/viewvc/commons/sandbox/flatfile/trunk/src/main/antlr/EntityTreeParser.g?rev=758061&r1=758060&r2=758061&view=diff
==============================================================================
--- commons/sandbox/flatfile/trunk/src/main/antlr/EntityTreeParser.g (original)
+++ commons/sandbox/flatfile/trunk/src/main/antlr/EntityTreeParser.g Tue Mar 24 22:17:18 2009
@@ -82,7 +82,6 @@
 		}
 	}
 
-//TODO support other encodings
 	private byte[] getBytes(String s) {
 		try {
 			return s.getBytes("UTF-8");

Modified: commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/dsl/ParserEntityFactory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/dsl/ParserEntityFactory.java?rev=758061&r1=758060&r2=758061&view=diff
==============================================================================
--- commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/dsl/ParserEntityFactory.java (original)
+++ commons/sandbox/flatfile/trunk/src/main/java/org/apache/commons/flatfile/dsl/ParserEntityFactory.java Tue Mar 24 22:17:18 2009
@@ -46,6 +46,33 @@
 
     private static final Log LOG = LogFactory.getLog(ParserEntityFactory.class);
     private static final EntityNameStrategy DEFAULT_NAME_STRATEGY = new DefaultEntityNameStrategy();
+
+    private class EntityHolder {
+        private EntityDefinition definition;
+        private Entity prototype;
+
+        /**
+         * Create a new EntityHolder instance.
+         * @param definition base
+         */
+        EntityHolder(EntityDefinition definition) {
+            this.definition = definition;
+        }
+
+        /**
+         * Get the prototypical entity from this {@link EntityHolder}.
+         * @return Entity
+         */
+        Entity getPrototype() {
+            synchronized (this) {
+                if (prototype == null) {
+                    prototype = getTreeParser().createEntity(definition);
+                }
+            }
+            return prototype;
+        }
+    }
+
     private EntityNameStrategy entityNameStrategy;
 
     private ThreadLocal<EntityTreeParser> treeParser = new ThreadLocal<EntityTreeParser>() {
@@ -56,9 +83,8 @@
         }
     };
 
-    private Map<String, Object> entityMap;
-    private Map<String, Map<String, ? extends Object>> defaultOptionMaps
-            = new HashMap<String, Map<String, ? extends Object>>();
+    private Map<String, EntityHolder> entityMap;
+    private Map<String, Map<String, ? extends Object>> defaultOptionMaps = new HashMap<String, Map<String, ? extends Object>>();
     private boolean checked;
     private InputStream[] sources;
     private EntityFactory parent;
@@ -89,26 +115,11 @@
      * {@inheritDoc}
      */
     public final Entity getEntity(Object cue) {
-        if (parent != null) {
-            Entity e = parent.getEntity(cue);
-            if (e != null) {
-                return e;
-            }
+        EntityHolder holder = getEntityMap().get(getEntityNameStrategy().getEntityName(cue));
+        if (holder != null) {
+            return holder.getPrototype().clone();
         }
-        Object o = getEntityMap().get(getEntityNameStrategy().getEntityName(cue));
-        if (o == null) {
-            return null;
-        }
-        Entity prototype = null;
-        if (o instanceof Entity) {
-            prototype = (Entity) o;
-        } else {
-            EntityDefinition def = (EntityDefinition) o;
-            EntityTreeParser tp = getTreeParser();
-            prototype = tp.createEntity(def);
-            entityMap.put(def.getName(), prototype);
-        }
-        return prototype.clone();
+        return getParent() == null ? null : getParent().getEntity(cue);
     }
 
     /**
@@ -185,7 +196,7 @@
      * @param def to add
      */
     void add(String name, EntityDefinition def) {
-        entityMap.put(name, def);
+        entityMap.put(name, new EntityHolder(def));
     }
 
     /**
@@ -209,9 +220,6 @@
         return defaultOptionMaps.get(type);
     }
 
-    // TODO make field creation pluggable
-    // TODO tie default options to class rather than mnemonic
-
     /**
      * Create a Field of a particular length, applying default options.
      * @param length of field
@@ -258,14 +266,13 @@
         return treeParser.get();
     }
 
-    // TODO come up with a single wrapper to get the Entity for the value.
     /**
      * Return our entity map, initializing if necessary.
-     * @return Map<String, Object> - value may be an EntityDefinition or an Entity.
+     * @return Map<String, EntityProxy> - value may be an EntityDefinition or an Entity.
      */
-    private synchronized Map<String, Object> getEntityMap() {
+    private synchronized Map<String, EntityHolder> getEntityMap() {
         if (entityMap == null) {
-            entityMap = new HashMap<String, Object>();
+            entityMap = new HashMap<String, EntityHolder>();
             try {
                 EntityParser p = null;
                 ArrayList<AST> trees = new ArrayList<AST>();