OSDN Git Service

property setter for ObjectLens
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Wed, 10 Jun 2009 05:23:28 +0000 (05:23 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Wed, 10 Jun 2009 05:23:28 +0000 (05:23 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3373 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

src/assembly/standalone.xml
src/main/java/org/xerial/lens/ObjectLens.java
src/main/java/org/xerial/lens/ObjectMapper.java
src/test/java/org/xerial/lens/ObjectLensTest.java
src/test/java/org/xerial/lens/property.silk [new file with mode: 0644]
src/test/java/org/xerial/relation/query/StreamAmoebaJoinTest.java

index 877e0a0..b14065e 100644 (file)
@@ -12,9 +12,6 @@
   </dependencySets>\r
   <fileSets>\r
     <fileSet>\r
-      <directory>${project.build.outputDirectory}</directory>\r
-    </fileSet>\r
-    <fileSet>\r
       <useStrictFiltering>true</useStrictFiltering>\r
       <outputDirectory>META-INF</outputDirectory>\r
       <includes>\r
@@ -23,4 +20,4 @@
       </includes>\r
     </fileSet>\r
   </fileSets>\r
-</assembly>
\ No newline at end of file
+</assembly>\r
index d2d0384..e3ab75f 100644 (file)
@@ -39,6 +39,7 @@ import java.util.Map.Entry;
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
 \r
+import org.xerial.core.XerialException;\r
 import org.xerial.json.JSONString;\r
 import org.xerial.json.JSONWriter;\r
 import org.xerial.util.Pair;\r
@@ -83,6 +84,16 @@ public class ObjectLens
     private List<RelationSetter> relationSetterContainer = new ArrayList<RelationSetter>();\r
     private ParameterSetter valueSetter = null;\r
 \r
+    private RelationSetter propertySetter = null;\r
+\r
+    public void setProperty(Object target, Object key, Object value) throws XerialException\r
+    {\r
+        if (propertySetter == null)\r
+            return;\r
+\r
+        propertySetter.bind(target, key, value);\r
+    }\r
+\r
     public List<ParameterSetter> getSetterList()\r
     {\r
         return Collections.unmodifiableList(setterContainer);\r
@@ -187,7 +198,7 @@ public class ObjectLens
             String methodName = eachMethod.getName();\r
             String paramName = pickPropertyName(methodName);\r
 \r
-            if (methodName.startsWith("add") || methodName.startsWith("set") || methodName.startsWith("put"))\r
+            if (methodName.startsWith("add") || methodName.startsWith("set"))\r
             {\r
                 Class< ? >[] argTypes = eachMethod.getParameterTypes();\r
                 switch (argTypes.length)\r
@@ -252,6 +263,47 @@ public class ObjectLens
                 continue;\r
 \r
             }\r
+            else if (methodName.startsWith("put"))\r
+            {\r
+                Class< ? >[] argTypes = eachMethod.getParameterTypes();\r
+                if (argTypes.length != 2)\r
+                    continue;\r
+\r
+                if (TypeInfo.isCollection(eachMethod.getDeclaringClass()))\r
+                    continue;\r
+\r
+                // relation adder\r
+                Pair<String, String> relName = pickRelationName(paramName);\r
+                if (relName == null)\r
+                {\r
+                    // infer relation node names\r
+                    if (TypeInfo.isMap(eachMethod.getDeclaringClass()))\r
+                    {\r
+\r
+                        Class< ? >[] mapElementType = BeanUtil.resolveActualTypeOfMapElement(targetType, eachMethod\r
+                                .getParameterTypes());\r
+\r
+                        // map.put(Key, Value)\r
+                        setterContainer.add(ParameterSetter.newMapEntrySetter(mapElementType[0], mapElementType[1]));\r
+\r
+                        // (entry, key)\r
+                        setterContainer.add(ParameterSetter.newKeySetter(mapElementType[0]));\r
+                        // (entry, value)\r
+                        setterContainer.add(ParameterSetter.newValueSetter(mapElementType[1]));\r
+                        continue;\r
+                    }\r
+                    else\r
+                    {\r
+                        propertySetter = RelationSetter.newRelationSetter("key", "value", eachMethod);\r
+                        continue;\r
+                    }\r
+                }\r
+\r
+                relationSetterContainer.add(RelationSetter.newRelationSetter(relName.getFirst(), relName.getSecond(),\r
+                        eachMethod));\r
+\r
+                continue;\r
+            }\r
             else if (methodName.startsWith("append"))\r
             {\r
                 addNewSetter(setterContainer, paramName, eachMethod);\r
index aafeb68..50fa8fe 100644 (file)
@@ -61,6 +61,7 @@ public class ObjectMapper
     private HashMap<Long, Object> objectHolder = new HashMap<Long, Object>();
 
     private HashMap<Schema, Binder> schema2binder = new HashMap<Schema, Binder>();
+
     private Deque<Object> contextNodeStack = new ArrayDeque<Object>();
     private final QuerySet qs;
 
@@ -369,6 +370,17 @@ public class ObjectMapper
 
         public void leaveNode(Schema schema, Node node) throws Exception
         {
+            if (schema == null && node.nodeValue != null)
+            {
+                // if putter is defined, set (node.nodeName, node.nodeValue) as (key, value)
+                if (_logger.isTraceEnabled())
+                    _logger.trace("put: " + node);
+
+                Object contextNode = contextNodeStack.getLast();
+                ObjectLens lens = ObjectLens.getObjectLens(contextNode.getClass());
+                lens.setProperty(contextNode, node.nodeName, node.nodeValue);
+            }
+
             Object obj = objectHolder.remove(node.nodeID);
 
             if (_logger.isDebugEnabled())
index 9cecf53..c3f283f 100644 (file)
@@ -28,11 +28,13 @@ import static org.junit.Assert.*;
 
 import java.io.StringReader;
 import java.util.ArrayList;
+import java.util.Properties;
 import java.util.TreeMap;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.xerial.util.FileResource;
 import org.xerial.util.Pair;
 import org.xerial.util.log.Logger;
 
@@ -166,4 +168,24 @@ public class ObjectLensTest
 
     }
 
+    public static class PropReader
+    {
+        Properties prop = new Properties();
+
+        public void put(String key, String value)
+        {
+            prop.put(key, value);
+        }
+    }
+
+    @Test
+    public void property() throws Exception
+    {
+        PropReader p = Lens.loadSilk(PropReader.class, FileResource.open(ObjectLensTest.class, "property.silk"));
+
+        assertEquals(2, p.prop.size());
+        assertEquals("hello", p.prop.get("db.name"));
+        assertEquals("sqlite", p.prop.get("db.type"));
+    }
+
 }
diff --git a/src/test/java/org/xerial/lens/property.silk b/src/test/java/org/xerial/lens/property.silk
new file mode 100644 (file)
index 0000000..b86aefd
--- /dev/null
@@ -0,0 +1,3 @@
+-db.name: hello\r
+-db.type: sqlite\r
+\r
index f8b4dc4..68fd88e 100644 (file)
@@ -46,9 +46,14 @@ public class StreamAmoebaJoinTest
 {\r
     private static Logger _logger = Logger.getLogger(StreamAmoebaJoinTest.class);\r
 \r
+    SilkParserConfig config = new SilkParserConfig();\r
+\r
     @Before\r
     public void setUp() throws Exception\r
-    {}\r
+    {\r
+        config.bufferSize = 1024 * 1024 * 8; // 8MB\r
+        config.numWorkers = 2;\r
+    }\r
 \r
     @After\r
     public void tearDown() throws Exception\r
@@ -118,16 +123,13 @@ public class StreamAmoebaJoinTest
         QuerySet qs = new QuerySetBuilder().build();\r
         StreamAmoebaJoin aj = new StreamAmoebaJoin(qs, new AmoebaJoinHandlerBase());\r
         StopWatch sw = new StopWatch();\r
-        aj.sweep(new SilkParser(FileResource.find(StreamAmoebaJoinTest.class, "../../silk/scaffold1.silk")));\r
+        aj.sweep(new SilkParser(FileResource.find(StreamAmoebaJoinTest.class, "../../silk/scaffold1.silk"), config));\r
         _logger.info("time: " + sw.getElapsedTime());\r
     }\r
 \r
     @Test\r
     public void silkWalkPerformance() throws Exception\r
     {\r
-        SilkParserConfig config = new SilkParserConfig();\r
-        config.bufferSize = 1024 * 1024 * 8; // 8MB\r
-        config.numWorkers = 2;\r
         SilkParser parser = new SilkParser(FileResource.find(StreamAmoebaJoinTest.class, "../../silk/scaffold1.silk"),\r
                 config);\r
         StopWatch sw = new StopWatch();\r