Hi,

I just discovered that we have tests that do not do anything meaningful because we didn't have test data in the repo. I just fixed that for ./property (see TestContentLoader).

This exposed three issues:

1) missing Date->long/double/decimal value conversions. I have added those for now in ValueImpl (not core); is this correct, Angela?

2) we didn't round-trip a relative path of ".". Now we do, but I'm not sure I got the mapping correct. What is a same-node reference in Oak path syntax? "." or empty string? I also fear that we need to be able to round-trip relative paths like "../foo/bar" in path values, which we currently do not. Do we need a "normalize" flag???

3) Node.getNode(".") failed because it looked for a child called ".". If have added a hack to make this work, but I'm wondering how to do this properly.

Best regards, Julian



On 2012-05-09 17:52, [email protected] wrote:
Author: reschke
Date: Wed May  9 15:52:35 2012
New Revision: 1336250

URL: http://svn.apache.org/viewvc?rev=1336250&view=rev
Log:
OAK-6: add test content for property tests; add value conversion for dates, handle 
"." paths in path-typed properties

Modified:
     
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
     
jackrabbit/oak/trunk/oak-it/jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
     
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
     
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java?rev=1336250&r1=1336249&r2=1336250&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
 Wed May  9 15:52:35 2012
@@ -143,6 +143,11 @@ public class NamePathMapperImpl implemen
              }
          }

+        // empty path: map to "."
+        if (oakPath.length() == 0) {
+            return ".";
+        }
+
          // root path is special-cased early on so it does not need to
          // be considered here
          oakPath.deleteCharAt(oakPath.length() - 1);
@@ -228,6 +233,11 @@ public class NamePathMapperImpl implemen
              }
          }

+        // empty path: map to "."
+        if (jcrPath.length() == 0) {
+            return ".";
+        }
+
          jcrPath.deleteCharAt(jcrPath.length() - 1);
          return jcrPath.toString();
      }

Modified: 
jackrabbit/oak/trunk/oak-it/jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java?rev=1336250&r1=1336249&r2=1336250&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-it/jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-it/jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
 Wed May  9 15:52:35 2012
@@ -16,16 +16,22 @@
   */
  package org.apache.jackrabbit.oak.jcr;

+import java.util.Calendar;
+
  import javax.jcr.Node;
  import javax.jcr.PathNotFoundException;
+import javax.jcr.PropertyType;
  import javax.jcr.RepositoryException;
  import javax.jcr.Session;
+import javax.jcr.ValueFactory;

  public class TestContentLoader {

      public void loadTestContent(Session session) throws RepositoryException {

-        getOrAddNode(session.getRootNode(), "testdata");
+        Node data = getOrAddNode(session.getRootNode(), "testdata");
+        addPropertyTestData(getOrAddNode(data, "property"));
+
          session.save();
      }

@@ -36,4 +42,20 @@ public class TestContentLoader {
              return node.addNode(name);
          }
      }
+
+    /**
+     * Creates a boolean, double, long, calendar and a path property at the
+     * given node.
+     */
+    private  void addPropertyTestData(Node node) throws RepositoryException {
+        node.setProperty("boolean", true);
+        node.setProperty("double", Math.PI);
+        node.setProperty("long", 90834953485278298l);
+        Calendar c = Calendar.getInstance();
+        c.set(2005, 6, 18, 17, 30);
+        node.setProperty("calendar", c);
+        ValueFactory factory = node.getSession().getValueFactory();
+        node.setProperty("path", factory.createValue("/", PropertyType.PATH));
+        node.setProperty("multi", new String[] { "one", "two", "three" });
+    }
  }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1336250&r1=1336249&r2=1336250&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
 Wed May  9 15:52:35 2012
@@ -365,6 +365,12 @@ public class NodeImpl extends ItemImpl i
          checkStatus();

          String oakPath = sessionDelegate.getOakPathOrThrowNotFound(relPath);
+
+        // TODO: hack
+        if (".".equals(oakPath)) {
+            return this;
+        }
+
          NodeDelegate nd = dlg.getChild(oakPath);
          if (nd == null) {
              throw new PathNotFoundException(relPath);

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java?rev=1336250&r1=1336249&r2=1336250&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/value/ValueImpl.java
 Wed May  9 15:52:35 2012
@@ -113,7 +113,13 @@ class ValueImpl implements Value {
      @Override
      public BigDecimal getDecimal() throws RepositoryException {
          try {
-            return value.getDecimal();
+            switch (getType()) {
+                case PropertyType.DATE:
+                    Calendar cal = getDate();
+                    return BigDecimal.valueOf(cal.getTimeInMillis());
+                default:
+                    return value.getDecimal();
+            }
          } catch (NumberFormatException e) {
              throw new ValueFormatException("Incompatible type " + 
PropertyType.nameFromValue(getType()));
          }
@@ -125,7 +131,13 @@ class ValueImpl implements Value {
      @Override
      public double getDouble() throws RepositoryException {
          try {
-            return value.getDouble();
+            switch (getType()) {
+                case PropertyType.DATE:
+                    Calendar cal = getDate();
+                    return cal.getTimeInMillis();
+                default:
+                    return value.getDouble();
+            }
          } catch (NumberFormatException e) {
              throw new ValueFormatException("Incompatible type " + 
PropertyType.nameFromValue(getType()));
          }
@@ -137,7 +149,13 @@ class ValueImpl implements Value {
      @Override
      public long getLong() throws RepositoryException {
          try {
-            return value.getLong();
+            switch (getType()) {
+                case PropertyType.DATE:
+                    Calendar cal = getDate();
+                    return cal.getTimeInMillis();
+                default:
+                    return value.getLong();
+            }
          } catch (NumberFormatException e) {
              throw new ValueFormatException("Incompatible type " + 
PropertyType.nameFromValue(getType()));
          }




Reply via email to