You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2010/04/11 19:49:04 UTC

svn commit: r932956 [1/2] - /jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/

Author: thomasm
Date: Sun Apr 11 17:49:03 2010
New Revision: 932956

URL: http://svn.apache.org/viewvc?rev=932956&view=rev
Log:
Some code for a Jackrabbit 3 prototype

Added:
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/BinaryImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyIteratorImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RangeIteratorImpl.java
Removed:
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/Cache.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/Change.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/ChangeList.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/Constants.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/ExceptionFactory.java
Modified:
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NamespaceRegistryImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeIteratorImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeState.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RepositoryFactoryImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RepositoryImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/SessionImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/ValueFactoryImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/ValueImpl.java
    jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/WorkspaceImpl.java

Added: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/BinaryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/BinaryImpl.java?rev=932956&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/BinaryImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/BinaryImpl.java Sun Apr 11 17:49:03 2010
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.j3;
+
+import java.io.IOException;
+import java.io.InputStream;
+import javax.jcr.Binary;
+import javax.jcr.RepositoryException;
+import org.apache.jackrabbit.j3.mc.Val;
+import org.apache.jackrabbit.j3.util.Log;
+import org.apache.jackrabbit.j3.util.LogObject;
+
+/**
+ * The implementation of the corresponding JCR interface.
+ */
+public class BinaryImpl implements Binary, LogObject {
+
+    private final Log log;
+    private final ValueFactoryImpl factory;
+    private final Val value;
+    private InputStream stream;
+
+    BinaryImpl(Val value, ValueFactoryImpl factory) {
+        this.factory = factory;
+        this.log = factory.getLog();
+        this.value = value;
+    }
+
+    public void dispose() {
+        log.code(this, "dispose");
+        if (stream != null) {
+            try {
+                stream.close();
+            } catch (IOException e) {
+                // TODO log
+            }
+        }
+    }
+
+    public long getSize() throws RepositoryException {
+        log.code(this, "getSize");
+        return ValueFactoryImpl.getLength(value, factory);
+    }
+
+    public InputStream getStream() throws RepositoryException {
+        log.code(this, "getStream");
+        stream = ValueFactoryImpl.getInputStream(value, factory);
+        return stream;
+    }
+
+    public int read(byte[] b, long position) throws IOException, RepositoryException {
+        log.code(this, "read", b, position);
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    Val getValue() {
+        return value;
+    }
+
+}

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NamespaceRegistryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NamespaceRegistryImpl.java?rev=932956&r1=932955&r2=932956&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NamespaceRegistryImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NamespaceRegistryImpl.java Sun Apr 11 17:49:03 2010
@@ -17,18 +17,24 @@
 package org.apache.jackrabbit.j3;
 
 import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
 import javax.jcr.AccessDeniedException;
 import javax.jcr.NamespaceException;
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
+import org.apache.jackrabbit.j3.mc.Val;
+import org.apache.jackrabbit.j3.util.ExceptionFactory;
+import org.apache.jackrabbit.j3.util.Log;
+import org.apache.jackrabbit.j3.util.LogObject;
 
 /**
- * A namespace registry implementation.
+ * The implementation of the corresponding JCR interface.
  */
-public class NamespaceRegistryImpl implements NamespaceRegistry {
+public class NamespaceRegistryImpl implements NamespaceRegistry, LogObject {
 
-    public static final NamespaceRegistryImpl BUILT_IN = new NamespaceRegistryImpl(null);
+    public static final NamespaceRegistryImpl BUILT_IN = new NamespaceRegistryImpl(null, Log.DEFAULT);
 
     static {
         NamespaceRegistryImpl registry = BUILT_IN;
@@ -37,14 +43,17 @@ public class NamespaceRegistryImpl imple
         registry.register(PREFIX_MIX, NAMESPACE_MIX);
         registry.register(PREFIX_XML, NAMESPACE_XML);
         registry.register(PREFIX_EMPTY, NAMESPACE_EMPTY);
+        registry.register("rep", "internal");
     }
 
+    private final Log log;
     private final NamespaceRegistryImpl parent;
-    private HashMap<String, String> prefixToUri = new HashMap<String, String>();
+    private LinkedHashMap<String, String> prefixToUri = new LinkedHashMap<String, String>();
     private HashMap<String, String> uriToPrefix = new HashMap<String, String>();
     private boolean shareMapsWithParent;
 
-    private NamespaceRegistryImpl(NamespaceRegistryImpl parent) {
+    private NamespaceRegistryImpl(NamespaceRegistryImpl parent, Log log) {
+        this.log = log;
         this.parent = parent;
         if (parent != null) {
             prefixToUri = parent.prefixToUri;
@@ -53,25 +62,62 @@ public class NamespaceRegistryImpl imple
         }
     }
 
-    public static NamespaceRegistryImpl createLocalInstance() {
-        return new NamespaceRegistryImpl(BUILT_IN);
+    public static NamespaceRegistryImpl createLocalInstance(Log log) {
+        return new NamespaceRegistryImpl(BUILT_IN, log);
+    }
+
+    public String nameToString(Val name) {
+        if (name.getType() == Val.TYPE_MULTI_VALUE) {
+            Val[] namePair = name.getArray();
+            String uri = getPrefix(namePair[0].getString());
+            String localName = namePair[1].getString();
+            StringBuilder buff = new StringBuilder(uri.length() + 1 + localName.length());
+            buff.append(uri).append(':').append(localName);
+            return buff.toString();
+        }
+        return name.getString();
+    }
+
+    public Val parseName(String name) {
+        if (name.charAt(0) == '{') {
+            int index = name.indexOf('}');
+            Val namespace = Val.get(name.substring(1, index));
+            Val localName = Val.get(name.substring(index + 1));
+            return Val.get(namespace, localName);
+        }
+        int index = name.indexOf(':');
+        if (index < 0) {
+            return Val.get(name);
+        }
+        String prefix = name.substring(0, index);
+        String ns = getURI(prefix);
+        if (ns == null) {
+            throw ExceptionFactory.illegalArgument("Not URI found for prefix: {0}", prefix);
+        }
+        Val namespace = Val.get(ns);
+        Val localName = Val.get(name.substring(index + 1));
+        return Val.get(namespace, localName);
     }
 
     public String getPrefix(String uri) {
+        log.code(this, "getPrefix", uri);
         return uriToPrefix.get(uri);
     }
 
     public synchronized String[] getPrefixes() throws RepositoryException {
+        log.code(this, "getPrefixes");
         String[] prefixes = new String[prefixToUri.size()];
         prefixToUri.keySet().toArray(prefixes);
         return prefixes;
     }
 
     public String getURI(String prefix) {
+        log.code(this, "getURI", prefix);
         return prefixToUri.get(prefix);
     }
 
     public synchronized String[] getURIs() throws RepositoryException {
+        log.code(this, "getURIs");
         String[] uris = new String[uriToPrefix.size()];
         uriToPrefix.keySet().toArray(uris);
         return uris;
@@ -79,18 +125,20 @@ public class NamespaceRegistryImpl imple
 
     public void registerNamespace(String prefix, String uri) throws NamespaceException,
             UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException {
+        log.code(this, "registerNamespace", prefix, uri);
         if (parent.prefixToUri.containsKey(prefix) || parent.uriToPrefix.containsKey(uri)) {
-            throw new NamespaceException("Can not redefine a built-in prefix");
-        }
-        if (prefix.equalsIgnoreCase("xml")) {
-            throw new NamespaceException("Can not redefine an xml variant");
+            if (!parent.prefixToUri.get(prefix).equals(uri)) {
+                throw ExceptionFactory.namespace("Can not redefine built-in prefix: {0}", prefix);
+            }
+        } else if (prefix.equalsIgnoreCase("xml")) {
+            throw ExceptionFactory.namespace("Can not (re-)define an xml variant: {0}", prefix);
         }
         register(prefix, uri);
     }
 
     private synchronized void register(String prefix, String uri) {
         if (shareMapsWithParent) {
-            prefixToUri = new HashMap<String, String>(prefixToUri);
+            prefixToUri = new LinkedHashMap<String, String>(prefixToUri);
             uriToPrefix = new HashMap<String, String>(uriToPrefix);
             shareMapsWithParent = false;
         }
@@ -100,14 +148,27 @@ public class NamespaceRegistryImpl imple
 
     public synchronized void unregisterNamespace(String prefix) throws NamespaceException, UnsupportedRepositoryOperationException,
             AccessDeniedException, RepositoryException {
+        log.code(this, "unregisterNamespace", prefix);
         if (parent.prefixToUri.containsKey(prefix)) {
-            throw new NamespaceException("Can not unregister a built-in prefix");
+            throw ExceptionFactory.namespace("Can not unregister a built-in prefix: {0}", prefix);
         }
         if (!prefixToUri.containsKey(prefix)) {
-            throw new NamespaceException("Not registered");
+            throw ExceptionFactory.namespace("Not registered: {0}", prefix);
         }
         String uri = prefixToUri.remove(prefix);
         uriToPrefix.remove(uri);
     }
 
+    public String toString() {
+        StringBuilder buff = new StringBuilder();
+        for (Entry<String, String> e : prefixToUri.entrySet()) {
+            buff.append('<').append(e.getKey()).append('=').append(e.getValue()).append('>');
+        }
+        return buff.toString();
+    }
+
+    public Log getLog() {
+        return log;
+    }
+
 }

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeImpl.java?rev=932956&r1=932955&r2=932956&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeImpl.java Sun Apr 11 17:49:03 2010
@@ -16,9 +16,6 @@
  */
 package org.apache.jackrabbit.j3;
 
-import org.apache.jackrabbit.j3.lock.LockImpl;
-import org.apache.jackrabbit.j3.mc.Val;
-import org.apache.jackrabbit.j3.security.PrivilegeImpl;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.Calendar;
@@ -39,7 +36,6 @@ import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 import javax.jcr.ReferentialIntegrityException;
 import javax.jcr.RepositoryException;
-import javax.jcr.Session;
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
@@ -53,11 +49,25 @@ import javax.jcr.version.ActivityViolati
 import javax.jcr.version.Version;
 import javax.jcr.version.VersionException;
 import javax.jcr.version.VersionHistory;
+import org.apache.jackrabbit.j3.lock.LockImpl;
+import org.apache.jackrabbit.j3.mc.Val;
+import org.apache.jackrabbit.j3.nodetype.NodeTypeImpl;
+import org.apache.jackrabbit.j3.nodetype.PropertyDefinitionImpl;
+import org.apache.jackrabbit.j3.observation.EventAddLock;
+import org.apache.jackrabbit.j3.observation.EventAddMixin;
+import org.apache.jackrabbit.j3.observation.EventAddNode;
+import org.apache.jackrabbit.j3.observation.EventAddProperty;
+import org.apache.jackrabbit.j3.observation.EventModifyProperty;
+import org.apache.jackrabbit.j3.observation.EventRemoveNode;
+import org.apache.jackrabbit.j3.security.PrivilegeImpl;
+import org.apache.jackrabbit.j3.util.ExceptionFactory;
+import org.apache.jackrabbit.j3.util.Log;
+import org.apache.jackrabbit.j3.util.LogObject;
 
 /**
- * A node implementation.
+ * The implementation of the corresponding JCR interface.
  */
-public class NodeImpl implements Node {
+public class NodeImpl implements Node, LogObject {
 
     private final NodeState state;
 
@@ -67,32 +77,51 @@ public class NodeImpl implements Node {
      */
     private NodeImpl parent;
     private int privilegesChecked;
+    protected final Log log;
 
-    NodeImpl(NodeImpl parent, NodeState state) {
+    protected NodeImpl(NodeImpl parent, NodeState state, Log log) {
         this.state = state;
         this.parent = parent;
+        this.log = log;
     }
 
     public NodeImpl addNode(String relPath, String primaryNodeTypeName) throws ItemExistsException, PathNotFoundException,
             NoSuchNodeTypeException, LockException, VersionException, ConstraintViolationException, RepositoryException {
-        // TODO primaryNodeTypeName is incorrect
-        return addNode(relPath, NodeState.NT_UNSTRUCTURED);
+        NodeTypeImpl nt = state.getSession().getNodeTypeManager().getNodeType(primaryNodeTypeName);
+        NodeImpl n = addNode(relPath, nt);
+        log.codeAssign(n, this, "addNode", relPath, primaryNodeTypeName);
+        return n;
     }
 
-    private NodeImpl addNode(String relPath, Val primaryNodeType) throws RepositoryException {
+    private NodeImpl addNode(String relPath, NodeTypeImpl nt) throws RepositoryException {
         SessionImpl s = state.getSession();
-        ChangeAddNode change = new ChangeAddNode(s);
-        change.childName = Val.get(relPath);
-        ChangeAddProperty changePrimaryType = new ChangeAddProperty(s);
-        changePrimaryType.propertyName = NodeState.PROPERTY_PRIMARY_TYPE;
-        changePrimaryType.value = primaryNodeType;
         synchronized (s) {
             NodeImpl node = s.createNode(this, state.getId());
-            change.newNode = node;
-            changePrimaryType.node = node;
-            changePrimaryType.applyAndAddChange();
-            change.applyAndAddChange();
-            return change.newNode;
+            EventAddNode event = new EventAddNode(s, Val.get(relPath), node);
+            Val primaryNodeType;
+            if (nt == null) {
+                // TODO primaryNodeTypeName may be incorrect
+                primaryNodeType = NodeState.DEFAULT_PRIMARY_TYPE;
+            } else {
+                primaryNodeType = nt.getNameVal();
+            }
+            EventAddProperty eventSetPrimaryType = new EventAddProperty(s, node, NodeState.PROPERTY_PRIMARY_TYPE,  primaryNodeType);
+            eventSetPrimaryType.applyAndAdd();
+            event.applyAndAdd();
+            if (nt != null) {
+                nt.visit(node);
+            }
+            return node;
+        }
+    }
+
+    public void apply(PropertyDefinitionImpl p) throws RepositoryException {
+        SessionImpl s = state.getSession();
+        if (p.isAutoCreated()) {
+            Val propertyName = p.getNameVal();
+            Val value = p.getDefaultVal();
+            EventModifyProperty event = new EventModifyProperty(s, this, propertyName, value);
+            event.applyAndAdd();
         }
     }
 
@@ -103,46 +132,60 @@ public class NodeImpl implements Node {
 
     public NodeImpl addNode(String relPath) throws ItemExistsException, PathNotFoundException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
-        // TODO primaryNodeTypeName may be incorrect
-        return addNode(relPath, NodeState.NT_UNSTRUCTURED);
+        NodeImpl n = addNode(relPath, (NodeTypeImpl) null);
+        log.codeAssign(n, this, "addNode", relPath);
+        return n;
+    }
+
+    void log(String message) {
+    }
+
+    String format(String x, Object... args) {
+        return "";
+    }
+
+    boolean trace() {
+        return true;
     }
 
     public PropertyImpl setProperty(String name, String value) throws ValueFormatException, VersionException,
-    LockException, ConstraintViolationException, RepositoryException {
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, Val.get(value));
+        log.codeAssign(p, this, "setProperty", name, value);
+        return p;
+    }
+
+    private PropertyImpl setProperty(String name, Val value) throws RepositoryException {
         SessionImpl s = state.getSession();
-        ChangeModifyProperty change = new ChangeModifyProperty(s);
+        Val propertyName = Val.get(name);
+        EventModifyProperty event = new EventModifyProperty(s, this, propertyName, value);
         synchronized (s) {
-            change.node = this;
-            change.propertyName = Val.get(name);
-            change.value = Val.get(value);
-            change.applyAndAddChange();
-            PropertyImpl prop = new PropertyImpl(this, change.propertyName);
-            return prop;
+            event.applyAndAdd();
+            return new PropertyImpl(this, propertyName);
         }
     }
 
+
     public void doSetProperty(Val propertyName, Val value) throws LockException {
         checkAccess(PrivilegeImpl.MODIFY_PROPERTIES | PrivilegeImpl.LOCK_OK);
-        state.setPropertyValue(propertyName, value);
+        state.setPropertyInternal(propertyName, value);
     }
 
     public Property getProperty(String relPath) throws PathNotFoundException, RepositoryException {
         Val propertyName = Val.get(relPath);
         // just verify that the property exists for now
-        state.getPropertyValue(propertyName);
+        state.getPropertyInternal(propertyName);
         PropertyImpl prop = new PropertyImpl(this, propertyName);
+        log.codeAssign(prop, this, "getProperty", relPath);
         return prop;
     }
 
-    Value getPropertyValue(Val name) {
-        return new ValueImpl(state.getPropertyValue(name));
-    }
-
-    Val getPropertyVal(Val name) {
-        return state.getPropertyValue(name);
+    ValueImpl getPropertyValue(Val name) {
+        return getValueFactory().wrap(state.getPropertyInternal(name));
     }
 
     public NodeImpl getParent() throws ItemNotFoundException, AccessDeniedException, RepositoryException {
+        log.codeAssign(parent, this, "getParent");
         return parent;
     }
 
@@ -151,6 +194,7 @@ public class NodeImpl implements Node {
     }
 
     public String getPath() throws RepositoryException {
+        log.code(this, "getPath");
         SessionImpl s = state.getSession();
         synchronized (s) {
             StringBuilder buff = new StringBuilder();
@@ -171,28 +215,28 @@ public class NodeImpl implements Node {
         }
     }
 
-    public String toString() {
-        return "NodeImpl: " + (parent == null ? "" : "parent=" + parent.state.getId()) + " state=" + state;
-    }
-
     public String getIdentifier() throws RepositoryException {
+        log.code(this, "getIdentifier");
         return state.getIdentifier();
     }
 
-    public Node getNode(String relPath) throws PathNotFoundException, RepositoryException {
-        return getNodeImpl(relPath);
+    public NodeImpl getNode(String relPath) throws PathNotFoundException, RepositoryException {
+        NodeImpl n = getNodeImpl(relPath);
+        log.codeAssign(n, this, "getNode", relPath);
+        return n;
     }
 
     NodeImpl getNodeImpl(String relPath) throws PathNotFoundException, RepositoryException {
         Val childName = Val.get(relPath);
         Val childId = state.getNodeData().getChildId(childName);
         if (childId == null) {
-            throw new PathNotFoundException();
+            throw ExceptionFactory.pathNotFound("Path: {0}", relPath);
         }
         return state.getSession().getNode(this, childId);
     }
 
     public String getName() throws RepositoryException {
+        log.code(this, "getName");
         if (parent == null) {
             return "/";
         }
@@ -200,6 +244,7 @@ public class NodeImpl implements Node {
     }
 
     public boolean hasNode(String relPath) throws RepositoryException {
+        log.code(this, "hasNode", relPath);
         Val childName = Val.get(relPath);
         Val childId = state.getNodeData().getChildId(childName);
         return childId != null;
@@ -207,14 +252,14 @@ public class NodeImpl implements Node {
 
     public void remove() throws VersionException, LockException, ConstraintViolationException, AccessDeniedException,
             RepositoryException {
+        log.code(this, "remove");
         SessionImpl s = state.getSession();
-        ChangeRemoveNode change = new ChangeRemoveNode(s);
         if (parent == null) {
-            throw new RepositoryException("Can not remove the root node");
+            throw ExceptionFactory.repository("Can not remove the root node");
         }
         synchronized (s) {
-            change.node = this;
-            change.applyAndAddChange();
+            EventRemoveNode event = new EventRemoveNode(s, this);
+            event.applyAndAdd();
         }
     }
 
@@ -224,7 +269,7 @@ public class NodeImpl implements Node {
         getParentNode().state.removeChild(name);
     }
 
-    public Session getSession() {
+    public SessionImpl getSession() {
         return state.getSession();
     }
 
@@ -232,6 +277,10 @@ public class NodeImpl implements Node {
         if ((privilegesChecked & privilegeMask) == privilegeMask) {
             return;
         }
+        if (state.session.isAdmin()) {
+            privilegesChecked |= PrivilegeImpl.ALL;
+            return;
+        }
         // remove what was already checked
         privilegeMask &= ~privilegesChecked;
         if ((privilegeMask & PrivilegeImpl.LOCK_OK) != 0) {
@@ -255,41 +304,40 @@ public class NodeImpl implements Node {
 
     public void addMixin(String mixinName) throws NoSuchNodeTypeException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
+        log.code(this, "addMixin", mixinName);
         SessionImpl s = state.getSession();
-        ChangeAddMixin change = new ChangeAddMixin(s);
-        change.node = this;
-        change.mixin = Val.get(mixinName);
+        EventAddMixin event = new EventAddMixin(s, this, Val.get(mixinName));
         synchronized (s) {
-            change.applyAndAddChange();
+            event.applyAndAdd();
         }
     }
 
     public void doAddMixin(Val mixin) throws LockException {
         checkAccess(PrivilegeImpl.MODIFY_PROPERTIES | PrivilegeImpl.LOCK_OK);
-        Val oldList = state.getPropertyValue(NodeState.PROPERTY_MIXIN_TYPES);
+        Val oldList = state.getPropertyInternal(NodeState.PROPERTY_MIXIN_TYPES);
         Val newList;
         if (oldList == null) {
             newList = Val.get(mixin);
         } else {
             newList = oldList.addOrdered(mixin);
         }
-        state.setPropertyValue(NodeState.PROPERTY_MIXIN_TYPES, newList);
+        state.setPropertyInternal(NodeState.PROPERTY_MIXIN_TYPES, newList);
     }
 
     public LockImpl lock(boolean isDeep, boolean isSessionScoped) throws UnsupportedRepositoryOperationException,
             LockException, AccessDeniedException, InvalidItemStateException, RepositoryException {
         if (state.session.hasPendingChanges()) {
-            throw new InvalidItemStateException("Session has pending changes");
+            throw ExceptionFactory.invalidItemState("Session has pending changes");
         }
         SessionImpl s = state.getSession();
-        ChangeAddLock change = new ChangeAddLock(s);
         // TODO the lock token currently is the node id; this is not secure
         Val lockToken = state.getId();
         LockImpl lock = new LockImpl(this, lockToken, isDeep, isSessionScoped);
-        change.lock = lock;
+        EventAddLock event = new EventAddLock(s, lock);
         synchronized (s) {
-            change.applyAndAddChange();
+            event.applyAndAdd();
         }
+        log.codeAssign(lock, this, "lock", isDeep, isSessionScoped);
         return lock;
     }
 
@@ -304,398 +352,498 @@ public class NodeImpl implements Node {
         return state;
     }
 
-    public NodeType getPrimaryNodeType() throws RepositoryException {
-        Val pt = state.getPropertyValue(NodeState.PROPERTY_PRIMARY_TYPE);
-        return state.getSession().getNodeTypeManager().getNodeType(pt);
+    public NodeTypeImpl getPrimaryNodeType() throws RepositoryException {
+        Val pt = state.getPropertyInternal(NodeState.PROPERTY_PRIMARY_TYPE);
+        NodeTypeImpl nt = state.getSession().getNodeTypeManager().getNodeType(pt);
+        log.codeAssign(nt, this, "getPrimaryNodeType");
+        return nt;
+    }
+
+    public PropertyIteratorImpl getProperties() throws RepositoryException {
+        PropertyIteratorImpl p = new PropertyIteratorImpl(this);
+        log.codeAssign(p, this, "getProperties");
+        return p;
+    }
+
+    public NodeIterator getNodes() throws RepositoryException {
+        Val childId = state.getNextChildId(null);
+        NodeImpl first;
+        if (childId == null) {
+            first = null;
+        } else {
+            first = state.getSession().getNode(this, childId);
+        }
+        NodeIteratorImpl it = new NodeIteratorImpl(first, log);
+        log.codeAssign(it, this, "getNodes");
+        return it;
+    }
+
+    NodeImpl getNextSibling() throws RepositoryException {
+        Val childId = parent.state.getNextChildId(state);
+        if (childId == null) {
+            return null;
+        } else {
+            return state.getSession().getNode(parent, childId);
+        }
+    }
+
+    public Property setProperty(String name, Calendar value) throws ValueFormatException, VersionException,
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    private ValueFactoryImpl getValueFactory() {
+        return state.getSession().getValueFactory();
+    }
+
+    public Property setProperty(String name, InputStream value) throws ValueFormatException, VersionException,
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Property setProperty(String name, Binary value) throws ValueFormatException, VersionException,
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Property setProperty(String name, boolean value) throws ValueFormatException, VersionException,
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Property setProperty(String name, double value) throws ValueFormatException, VersionException,
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Property setProperty(String name, BigDecimal value) throws ValueFormatException, VersionException,
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Property setProperty(String name, long value) throws ValueFormatException, VersionException, LockException,
+            ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Property setProperty(String name, Node value) throws ValueFormatException, VersionException, LockException,
+            ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Property setProperty(String name, String value, int type) throws ValueFormatException, VersionException,
+            LockException, ConstraintViolationException, RepositoryException {
+        PropertyImpl p = setProperty(name, getValueFactory().createVal(value, type));
+        log.codeAssign(p, this, "setProperty", value);
+        return p;
+    }
+
+    public Log getLog() {
+        return log;
+    }
+
+    public Item getPrimaryItem() throws ItemNotFoundException, RepositoryException {
+        log.code(this, "getPrimaryItem");
+        // TODO
+        return null;
     }
 
     public boolean canAddMixin(String mixinName) throws NoSuchNodeTypeException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "canAddMixin", mixinName);
+        // TODO
         return false;
     }
 
     public void cancelMerge(Version version) throws VersionException, InvalidItemStateException,
             UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "cancelMerge", version);
+        // TODO
 
     }
 
     public Version checkin() throws VersionException, UnsupportedRepositoryOperationException,
             InvalidItemStateException, LockException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "checkin");
+        // TODO
         return null;
     }
 
     public void checkout() throws UnsupportedRepositoryOperationException, LockException, ActivityViolationException,
             RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "checkout");
+        // TODO
 
     }
 
     public void doneMerge(Version version) throws VersionException, InvalidItemStateException,
             UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "doneMerge", version);
+        // TODO
 
     }
 
     public void followLifecycleTransition(String transition) throws UnsupportedRepositoryOperationException,
             InvalidLifecycleTransitionException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "followLifecycleTransition", transition);
+        // TODO
 
     }
 
     public String[] getAllowedLifecycleTransistions() throws UnsupportedRepositoryOperationException,
             RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getAllowedLifecycleTransistions");
+        // TODO
         return null;
     }
 
     public Version getBaseVersion() throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getBaseVersion");
+        // TODO
         return null;
     }
 
     public String getCorrespondingNodePath(String workspaceName) throws ItemNotFoundException,
             NoSuchWorkspaceException, AccessDeniedException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getCorrespondingNodePath", workspaceName);
+        // TODO
         return null;
     }
 
     public NodeDefinition getDefinition() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getDefinition");
+        // TODO
         return null;
     }
 
     public int getIndex() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getIndex");
+        // TODO
         return 0;
     }
 
     public Lock getLock() throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException,
             RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getLock");
+        // TODO
         return null;
     }
 
     public NodeType[] getMixinNodeTypes() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public NodeIterator getNodes() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getMixinNodeTypes");
+        // TODO
         return null;
     }
 
     public NodeIterator getNodes(String namePattern) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getNodes", namePattern);
+        // TODO
         return null;
     }
 
     public NodeIterator getNodes(String[] nameGlobs) throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Item getPrimaryItem() throws ItemNotFoundException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public PropertyIterator getProperties() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getNodes", (Object) nameGlobs);
+        // TODO
         return null;
     }
 
     public PropertyIterator getProperties(String namePattern) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getProperties", namePattern);
+        // TODO
         return null;
     }
 
     public PropertyIterator getProperties(String[] nameGlobs) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getProperties", (Object) nameGlobs);
+        // TODO
         return null;
     }
 
     public PropertyIterator getReferences() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getReferences");
+        // TODO
         return null;
     }
 
     public PropertyIterator getReferences(String name) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getReferences", name);
+        // TODO
         return null;
     }
 
     public NodeIterator getSharedSet() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getSharedSet");
+        // TODO
         return null;
     }
 
     public String getUUID() throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getUUID");
+        // TODO
         return null;
     }
 
     public VersionHistory getVersionHistory() throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getVersionHistory");
+        // TODO
         return null;
     }
 
     public PropertyIterator getWeakReferences() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getWeakReferences");
+        // TODO
         return null;
     }
 
     public PropertyIterator getWeakReferences(String name) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getWeakReferences", name);
+        // TODO
         return null;
     }
 
     public boolean hasNodes() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "hasNodes");
+        // TODO
         return false;
     }
 
     public boolean hasProperties() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "hasProperties");
+        // TODO
         return false;
     }
 
     public boolean hasProperty(String relPath) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "hasProperty", relPath);
+        // TODO
         return false;
     }
 
     public boolean holdsLock() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "holdsLock");
+        // TODO
         return false;
     }
 
     public boolean isCheckedOut() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "isCheckedOut");
+        // TODO
         return false;
     }
 
     public boolean isLocked() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "isLocked");
+        // TODO
         return false;
     }
 
     public boolean isNodeType(String nodeTypeName) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "isNodeType", nodeTypeName);
+        // TODO
         return false;
     }
 
     public NodeIterator merge(String srcWorkspace, boolean bestEffort) throws NoSuchWorkspaceException,
             AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "merge", srcWorkspace, bestEffort);
+        // TODO
         return null;
     }
 
     public void orderBefore(String srcChildRelPath, String destChildRelPath)
             throws UnsupportedRepositoryOperationException, VersionException, ConstraintViolationException,
             ItemNotFoundException, LockException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "orderBefore", srcChildRelPath, destChildRelPath);
+        // TODO
 
     }
 
     public void removeMixin(String mixinName) throws NoSuchNodeTypeException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "removeMixin", mixinName);
+        // TODO
 
     }
 
     public void removeShare() throws VersionException, LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "removeShare");
+        // TODO
 
     }
 
     public void removeSharedSet() throws VersionException, LockException, ConstraintViolationException,
             RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "removeSharedSet");
+        // TODO
 
     }
 
     public void restore(String versionName, boolean removeExisting) throws VersionException, ItemExistsException,
             UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "restore", versionName, removeExisting);
+        // TODO
 
     }
 
     public void restore(Version version, boolean removeExisting) throws VersionException, ItemExistsException,
             InvalidItemStateException, UnsupportedRepositoryOperationException, LockException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "restore", version, removeExisting);
+        // TODO
 
     }
 
     public void restore(Version version, String relPath, boolean removeExisting) throws PathNotFoundException,
             ItemExistsException, VersionException, ConstraintViolationException,
             UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "restore", version, relPath, removeExisting);
+        // TODO
 
     }
 
     public void restoreByLabel(String versionLabel, boolean removeExisting) throws VersionException,
             ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException,
             RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "restoreByLabel", versionLabel, removeExisting);
+        // TODO
 
     }
 
     public void setPrimaryType(String nodeTypeName) throws NoSuchNodeTypeException, VersionException,
             ConstraintViolationException, LockException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setPrimaryType", nodeTypeName);
+        // TODO
 
     }
 
     public Property setProperty(String name, Value value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setProperty", name, value);
+        // TODO
         return null;
     }
 
     public Property setProperty(String name, Value[] values) throws ValueFormatException, VersionException,
             LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setProperty", name, values);
+        // TODO
         return null;
     }
 
     public Property setProperty(String name, String[] values) throws ValueFormatException, VersionException,
             LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, InputStream value) throws ValueFormatException, VersionException,
-            LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, Binary value) throws ValueFormatException, VersionException,
-            LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, boolean value) throws ValueFormatException, VersionException,
-            LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, double value) throws ValueFormatException, VersionException,
-            LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, BigDecimal value) throws ValueFormatException, VersionException,
-            LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, long value) throws ValueFormatException, VersionException, LockException,
-            ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, Calendar value) throws ValueFormatException, VersionException,
-            LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, Node value) throws ValueFormatException, VersionException, LockException,
-            ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setProperty", name, values);
+        // TODO
         return null;
     }
 
     public Property setProperty(String name, Value value, int type) throws ValueFormatException, VersionException,
             LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setProperty", name, value, type);
+        // TODO
         return null;
     }
 
     public Property setProperty(String name, Value[] values, int type) throws ValueFormatException, VersionException,
             LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setProperty", name, values, type);
+        // TODO
         return null;
     }
 
     public Property setProperty(String name, String[] values, int type) throws ValueFormatException, VersionException,
             LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, String value, int type) throws ValueFormatException, VersionException,
-            LockException, ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setProperty", name, values, type);
+        // TODO
         return null;
     }
 
     public void unlock() throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException,
             InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "unlock");
+        // TODO
 
     }
 
     public void update(String srcWorkspace) throws NoSuchWorkspaceException, AccessDeniedException, LockException,
             InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "update", srcWorkspace);
+        // TODO
 
     }
 
     public void accept(ItemVisitor visitor) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "accept", visitor);
+        // TODO
 
     }
 
     public Item getAncestor(int depth) throws ItemNotFoundException, AccessDeniedException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getAncestor", depth);
+        // TODO
         return null;
     }
 
     public int getDepth() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getDepth");
+        // TODO
         return 0;
     }
 
     public boolean isModified() {
-        // TODO Auto-generated method stub
+        log.code(this, "isModified");
+        // TODO
         return false;
     }
 
     public boolean isNew() {
-        // TODO Auto-generated method stub
+        log.code(this, "isNew");
+        // TODO
         return false;
     }
 
     public boolean isNode() {
-        // TODO Auto-generated method stub
+        log.code(this, "isNode");
+        // TODO
         return false;
     }
 
     public boolean isSame(Item otherItem) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "isSame", otherItem);
+        // TODO
         return false;
     }
 
     public void refresh(boolean keepChanges) throws InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "refresh", keepChanges);
+        // TODO
 
     }
 
     public void save() throws AccessDeniedException, ItemExistsException, ConstraintViolationException,
             InvalidItemStateException, ReferentialIntegrityException, VersionException, LockException,
             NoSuchNodeTypeException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "save");
+        // TODO
 
     }
 
+    public String toString() {
+        return "NodeImpl: " + (parent == null ? "" : "parent=" + parent.state.getId()) + " state=" + state;
+    }
+
 }

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeIteratorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeIteratorImpl.java?rev=932956&r1=932955&r2=932956&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeIteratorImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeIteratorImpl.java Sun Apr 11 17:49:03 2010
@@ -16,47 +16,70 @@
  */
 package org.apache.jackrabbit.j3;
 
-import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import org.apache.jackrabbit.j3.util.ExceptionFactory;
+import org.apache.jackrabbit.j3.util.Log;
+import org.apache.jackrabbit.j3.util.LogObject;
 
 /**
- * A node iterator implementation.
+ * The implementation of the corresponding JCR interface.
  */
-public class NodeIteratorImpl implements NodeIterator {
+public class NodeIteratorImpl implements NodeIterator, LogObject {
 
-    public Node nextNode() {
-        // TODO Auto-generated method stub
-        return null;
+    private final Log log;
+    private NodeImpl next;
+    private long pos;
+
+    NodeIteratorImpl(NodeImpl first, Log log) {
+        this.log = log;
+        this.next = first;
+    }
+
+    public NodeImpl nextNode() {
+        NodeImpl n = next;
+        if (n == null) {
+            throw ExceptionFactory.noSuchElement();
+        }
+        pos++;
+        try {
+            next = n.getNextSibling();
+        } catch (RepositoryException e) {
+            throw ExceptionFactory.runtime(e);
+        }
+        log.codeAssign(n, this, "nextNode");
+        return n;
     }
 
     public long getPosition() {
-        // TODO Auto-generated method stub
-        return 0;
+        log.code(this, "getPosition");
+        return pos;
     }
 
     public long getSize() {
-        // TODO Auto-generated method stub
-        return 0;
+        log.code(this, "getSize");
+        return -1;
     }
 
     public void skip(long skipNum) {
-        // TODO Auto-generated method stub
-
+        log.code(this, "skip", skipNum);
+        while (skipNum > 0) {
+            nextNode();
+        }
     }
 
     public boolean hasNext() {
-        // TODO Auto-generated method stub
-        return false;
+        log.code(this, "hasNext");
+        return next != null;
     }
 
     public Object next() {
-        // TODO Auto-generated method stub
-        return null;
+        return nextNode();
     }
 
     public void remove() {
-        // TODO Auto-generated method stub
-
+        log.code(this, "remove");
+        throw ExceptionFactory.unsupportedOperation();
     }
 
 }

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeState.java?rev=932956&r1=932955&r2=932956&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeState.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/NodeState.java Sun Apr 11 17:49:03 2010
@@ -20,6 +20,7 @@ import javax.jcr.NamespaceRegistry;
 import javax.jcr.lock.LockException;
 import org.apache.jackrabbit.j3.mc.NodeData;
 import org.apache.jackrabbit.j3.mc.Val;
+import org.apache.jackrabbit.j3.util.ExceptionFactory;
 
 /**
  * There is one node state for each session and instance of shareable node. That
@@ -38,29 +39,37 @@ public class NodeState {
 
     final SessionImpl session;
     private NodeData data;
-    private boolean modified;
+    private int modCount;
     private SessionImpl lockOwner;
 
-    NodeState(SessionImpl session, NodeData data, boolean modified) {
+    NodeState(SessionImpl session, NodeData data, int modCount) {
         this.session = session;
         this.data = data;
-        this.modified = modified;
+        this.modCount = modCount;
     }
 
     void modify() {
-        if (!modified) {
+        if (modCount++ == 0) {
             data = data.createCopy();
             session.modify(this);
-            modified = true;
         }
     }
 
     void reset(NodeData data) {
-        modified = false;
+        modCount = 0;
         this.data = data;
     }
 
-    void setPropertyValue(Val name, Val value) {
+    /**
+     * Set the property.
+     *
+     * The system properties jcr:primaryType
+     * and jcr:mixinTypes are in the array format.
+     *
+     * @param name the property name
+     * @param value the value
+     */
+    void setPropertyInternal(Val name, Val value) {
         modify();
         if (name.equals(NodeState.PROPERTY_PRIMARY_TYPE)) {
             if (value.equals(DEFAULT_PRIMARY_TYPE)) {
@@ -73,7 +82,16 @@ public class NodeState {
         }
     }
 
-    Val getPropertyValue(Val name) {
+    /**
+     * Get the internal property value.
+     *
+     * The system properties jcr:primaryType
+     * and jcr:mixinTypes are in the name format.
+     *
+     * @param name the property name
+     * @param value the value
+     */
+    Val getPropertyInternal(Val name) {
         if (name.equals(NodeState.PROPERTY_PRIMARY_TYPE)) {
             Val pt = data.getPrimaryType();
             return pt == null ? DEFAULT_PRIMARY_TYPE : pt;
@@ -81,6 +99,31 @@ public class NodeState {
         return data.getPropertyValue(name);
     }
 
+    /**
+     * Get the external property value.
+     *
+     * The system properties jcr:primaryType
+     * and jcr:mixinTypes are converted to strings.
+     *
+     * @param name the property name
+     * @param value the value
+     */
+    Val getPropertyExternal(Val name) {
+        Val v = getPropertyInternal(name);
+        if (name.equals(NodeState.PROPERTY_PRIMARY_TYPE)) {
+            v = Val.get(session.nameToString(v));
+        } else if (name.equals(NodeState.PROPERTY_MIXIN_TYPES)) {
+            Val[] array = v.getArray();
+            Val[] nameArray = new Val[array.length];
+            for (int i = 0; i < array.length; i++) {
+                Val a = array[i];
+                nameArray[i] = Val.get(session.nameToString(a));
+            }
+            v = Val.get(array);
+        }
+        return v;
+    }
+
     Val getId() {
         return data.getId();
     }
@@ -108,12 +151,12 @@ public class NodeState {
         return data.getName(parent.data);
     }
 
-    String nameToString(Val name) {
+    public String nameToString(Val name) {
         return session.nameToString(name);
     }
 
     public String toString() {
-        return (modified ? "(mod) " : "") + data;
+        return (modCount > 0 ? "(mod) " : "") + data;
     }
 
     NodeData getNodeData() {
@@ -143,7 +186,15 @@ public class NodeState {
         if (session.getLockManager().hasLockToken(lockToken)) {
             lockOwner = session;
         }
-        throw new LockException("Node is locked");
+        throw ExceptionFactory.lock("Node is locked");
+    }
+
+    int getModCount() {
+        return modCount;
+    }
+
+    Val getNextChildId(NodeState last) {
+        return data.getNextChildId(last == null ? null : last.data);
     }
 
 }

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyImpl.java?rev=932956&r1=932955&r2=932956&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyImpl.java Sun Apr 11 17:49:03 2010
@@ -16,7 +16,6 @@
  */
 package org.apache.jackrabbit.j3;
 
-import org.apache.jackrabbit.j3.mc.Val;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.Calendar;
@@ -31,7 +30,6 @@ import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.ReferentialIntegrityException;
 import javax.jcr.RepositoryException;
-import javax.jcr.Session;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
 import javax.jcr.lock.LockException;
@@ -39,245 +37,292 @@ import javax.jcr.nodetype.ConstraintViol
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.version.VersionException;
+import org.apache.jackrabbit.j3.mc.Val;
+import org.apache.jackrabbit.j3.util.Log;
+import org.apache.jackrabbit.j3.util.LogObject;
 
 /**
- * The property implementation.
+ * The implementation of the corresponding JCR interface.
  */
-public class PropertyImpl implements Property {
+public class PropertyImpl implements Property, LogObject {
 
     private final NodeImpl node;
+    private final Log log;
     private final Val name;
 
     PropertyImpl(NodeImpl node, Val name) {
         this.node = node;
+        this.log = node.getLog();
         this.name = name;
     }
 
-    public Value getValue() throws ValueFormatException, RepositoryException {
-        return node.getPropertyValue(name);
+    public ValueImpl getValue() throws ValueFormatException, RepositoryException {
+        ValueImpl v = node.getPropertyValue(name);
+        log.codeAssign(v, this, "getValue");
+        return v;
+    }
+
+    private Val getVal() {
+        return node.getNodeState().getPropertyExternal(name);
     }
 
     public String getString() throws ValueFormatException, RepositoryException {
-        return node.getPropertyVal(name).getString();
+        log.code(this, "getString");
+        return ValueFactoryImpl.getString(getVal(), node.getSession().getValueFactory());
+    }
+
+    public SessionImpl getSession() throws RepositoryException {
+        return node.getSession();
+    }
+
+    public boolean isNode() {
+        log.code(this, "isNode");
+        return false;
     }
 
     public Binary getBinary() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        BinaryImpl b = new BinaryImpl(getVal(), getValueFactory());
+        log.codeAssign(b, this, "getBinary");
+        return b;
+    }
+
+    private ValueFactoryImpl getValueFactory() {
+        return node.getSession().getValueFactory();
     }
 
     public boolean getBoolean() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
-        return false;
+        log.code(this, "getBoolean");
+        return ValueFactoryImpl.getBoolean(getVal());
     }
 
     public Calendar getDate() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        log.code(this, "getDate");
+        return ValueFactoryImpl.getDate(getVal());
     }
 
     public BigDecimal getDecimal() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        log.code(this, "getDecimal");
+        return ValueFactoryImpl.getDecimal(getVal());
     }
 
-    public PropertyDefinition getDefinition() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+    public double getDouble() throws ValueFormatException, RepositoryException {
+        log.code(this, "getDouble");
+        return ValueFactoryImpl.getDouble(getVal());
     }
 
-    public double getDouble() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
-        return 0;
+    public String getName() throws RepositoryException {
+        log.code(this, "getName");
+        return node.getSession().nameToString(name);
     }
 
     public long getLength() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
-        return 0;
+        log.code(this, "getLength");
+        return ValueFactoryImpl.getLength(getVal(), node.getSession().getValueFactory());
     }
 
-    public long[] getLengths() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
+    public long getLong() throws ValueFormatException, RepositoryException {
+        log.code(this, "getLong");
+        return ValueFactoryImpl.getLong(getVal());
+    }
+
+    public NodeImpl getParent() throws ItemNotFoundException, AccessDeniedException, RepositoryException {
+        log.code(this, "getParent");
+        return node;
+    }
+
+    public NodeImpl getNode() throws ItemNotFoundException, ValueFormatException, RepositoryException {
+        log.code(this, "getNode");
+        // TODO
+        // for reference properties
         return null;
     }
 
-    public long getLong() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
-        return 0;
+    public PropertyDefinition getDefinition() throws RepositoryException {
+        log.code(this, "getDefinition");
+        // TODO
+        return null;
     }
 
-    public Node getNode() throws ItemNotFoundException, ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
+    public long[] getLengths() throws ValueFormatException, RepositoryException {
+        log.code(this, "getLengths");
+        // TODO
         return null;
     }
 
     public Property getProperty() throws ItemNotFoundException, ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getProperty");
+        // TODO
         return null;
     }
 
     public InputStream getStream() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getStream");
+        // TODO
         return null;
     }
 
     public int getType() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getType");
+        // TODO
         return 0;
     }
 
     public Value[] getValues() throws ValueFormatException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getValues");
+        // TODO
         return null;
     }
 
     public boolean isMultiple() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "isMultiple");
+        // TODO
         return false;
     }
 
     public void setValue(Value value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(Value[] values) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", (Object) values);
+        // TODO
 
     }
 
     public void setValue(String value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(String[] values) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", (Object) values);
+        // TODO
 
     }
 
     public void setValue(InputStream value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(Binary value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(long value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(double value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(BigDecimal value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(Calendar value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(boolean value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void setValue(Node value) throws ValueFormatException, VersionException, LockException,
             ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "setValue", value);
+        // TODO
 
     }
 
     public void accept(ItemVisitor visitor) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "accept", visitor);
+        // TODO
 
     }
 
     public Item getAncestor(int depth) throws ItemNotFoundException, AccessDeniedException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getAncestor", depth);
+        // TODO
         return null;
     }
 
     public int getDepth() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getDepth");
+        // TODO
         return 0;
     }
 
-    public String getName() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Node getParent() throws ItemNotFoundException, AccessDeniedException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
     public String getPath() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Session getSession() throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "getPath");
+        // TODO
         return null;
     }
 
     public boolean isModified() {
-        // TODO Auto-generated method stub
+        log.code(this, "isModified");
+        // TODO
         return false;
     }
 
     public boolean isNew() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    public boolean isNode() {
-        // TODO Auto-generated method stub
+        log.code(this, "isNew");
+        // TODO
         return false;
     }
 
     public boolean isSame(Item otherItem) throws RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "isSame", otherItem);
+        // TODO
         return false;
     }
 
     public void refresh(boolean keepChanges) throws InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "refresh", keepChanges);
+        // TODO
 
     }
 
     public void remove() throws VersionException, LockException, ConstraintViolationException, AccessDeniedException,
             RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "remove");
+        // TODO
 
     }
 
     public void save() throws AccessDeniedException, ItemExistsException, ConstraintViolationException,
             InvalidItemStateException, ReferentialIntegrityException, VersionException, LockException,
             NoSuchNodeTypeException, RepositoryException {
-        // TODO Auto-generated method stub
+        log.code(this, "save");
+        // TODO
 
     }
 

Added: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyIteratorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyIteratorImpl.java?rev=932956&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyIteratorImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/PropertyIteratorImpl.java Sun Apr 11 17:49:03 2010
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.j3;
+
+import javax.jcr.PropertyIterator;
+import org.apache.jackrabbit.j3.mc.NodeData;
+import org.apache.jackrabbit.j3.mc.Val;
+import org.apache.jackrabbit.j3.util.ExceptionFactory;
+import org.apache.jackrabbit.j3.util.Log;
+import org.apache.jackrabbit.j3.util.LogObject;
+
+/**
+ * The implementation of the corresponding JCR interface.
+ *
+ * If properties are modified while iterating, a
+ * ConcurrentModificationException is thrown.
+ */
+public class PropertyIteratorImpl implements PropertyIterator, LogObject {
+
+    private final Log log;
+    private final NodeImpl node;
+    private final NodeData nodeData;
+    private final int modCount;
+    private final int size;
+    private Val propertyName;
+
+    /**
+     * Index 0 means the primary type of the node.
+     * There is always at least this one property.
+     */
+    private int index;
+
+    PropertyIteratorImpl(NodeImpl node) {
+        this.log = node.getLog();
+        this.node = node;
+        this.nodeData = node.getNodeState().getNodeData();
+        this.modCount = node.getNodeState().getModCount();
+        this.size = nodeData.getPropertyCount();
+    }
+
+    public PropertyImpl nextProperty() {
+        PropertyImpl result;
+        if (index == 0) {
+            result = new PropertyImpl(node, NodeState.PROPERTY_PRIMARY_TYPE);
+        } else {
+            if (propertyName == null) {
+                throw ExceptionFactory.noSuchElement();
+            }
+            result = new PropertyImpl(node, propertyName);
+        }
+        go();
+        log.codeAssign(result, this, "nextNode");
+        return result;
+    }
+
+    void go() {
+        NodeState state = node.getNodeState();
+        if (state.getModCount() != modCount || state.getNodeData() != nodeData) {
+            throw ExceptionFactory.concurrentModification();
+        }
+        if (index > size) {
+            throw ExceptionFactory.noSuchElement();
+        }
+        while (true) {
+            propertyName = nodeData.getPropertyName(index++);
+            if (propertyName == null) {
+                break;
+            }
+            if (skip()) {
+                continue;
+            }
+            break;
+        }
+    }
+
+    private boolean skip() {
+        log.code(this, "skip");
+        return false;
+    }
+
+    public long getPosition() {
+        log.code(this, "getPosition");
+        return index;
+    }
+
+    public long getSize() {
+        log.code(this, "getSize");
+        return size;
+    }
+
+    public void skip(long skipNum) {
+        log.code(this, "skip", skipNum);
+        index += skipNum;
+    }
+
+    public boolean hasNext() {
+        log.code(this, "hasNext");
+        return index <= size;
+    }
+
+    public Object next() {
+        return nextProperty();
+    }
+
+    public void remove() {
+        log.code(this, "remove");
+        throw ExceptionFactory.unsupportedOperation();
+    }
+
+}

Added: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RangeIteratorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RangeIteratorImpl.java?rev=932956&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RangeIteratorImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RangeIteratorImpl.java Sun Apr 11 17:49:03 2010
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.j3;
+
+import java.util.Iterator;
+import javax.jcr.RangeIterator;
+import javax.jcr.RepositoryException;
+import org.apache.jackrabbit.j3.util.ExceptionFactory;
+import org.apache.jackrabbit.j3.util.Log;
+import org.apache.jackrabbit.j3.util.LogObject;
+
+/**
+ * The implementation of the corresponding JCR interface.
+ *
+ * @param <T> the type
+ */
+public abstract class RangeIteratorImpl<T> implements RangeIterator, LogObject {
+
+    protected final Log log;
+    private final Iterator<T> iterator;
+    private T next;
+    private long size;
+    private long pos;
+
+    protected RangeIteratorImpl(Iterator<T> iterator, long size, Log log) {
+        this.iterator = iterator;
+        this.size = size;
+        this.log = log;
+        go();
+    }
+
+    public boolean skip(T x) throws RepositoryException {
+        return false;
+    }
+
+    void go() {
+        try {
+            while (true) {
+                if (!iterator.hasNext()) {
+                    next = null;
+                    break;
+                }
+                next = iterator.next();
+                if (skip(next)) {
+                    continue;
+                }
+                break;
+            }
+        } catch (RepositoryException e) {
+            throw ExceptionFactory.runtime(e);
+        }
+    }
+
+    public Object next() {
+        return goNext();
+    }
+
+    public T goNext() {
+        pos++;
+        T result = next;
+        if (result == null) {
+            throw ExceptionFactory.noSuchElement();
+        }
+        go();
+        return result;
+    }
+
+    public long getPosition() {
+        log.code(this, "getPosition");
+        return pos;
+    }
+
+    public long getSize() {
+        log.code(this, "getSize");
+        return size;
+    }
+
+    public void skip(long skipNum) {
+        log.code(this, "skip", skipNum);
+        for (int i = 0; i < skipNum; i++) {
+            go();
+        }
+    }
+
+    public boolean hasNext() {
+        log.code(this, "hasNext");
+        return next != null;
+    }
+
+    public void remove() {
+        log.code(this, "remove");
+        throw ExceptionFactory.unsupportedOperation();
+    }
+
+}

Modified: jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RepositoryFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RepositoryFactoryImpl.java?rev=932956&r1=932955&r2=932956&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RepositoryFactoryImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-j3/src/main/java/org/apache/jackrabbit/j3/RepositoryFactoryImpl.java Sun Apr 11 17:49:03 2010
@@ -17,18 +17,33 @@
 package org.apache.jackrabbit.j3;
 
 import java.util.Map;
-import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.RepositoryFactory;
+import org.apache.jackrabbit.j3.util.Constants;
+import org.apache.jackrabbit.j3.util.Log;
 
 /**
- * The repository factory implementation.
+ * The implementation of the corresponding JCR interface.
  */
 public class RepositoryFactoryImpl implements RepositoryFactory {
 
     @SuppressWarnings("unchecked")
-    public Repository getRepository(Map parameters) throws RepositoryException {
-        return new RepositoryImpl(parameters);
+    public RepositoryImpl getRepository(Map parameters) throws RepositoryException {
+        String url;
+        Object o = parameters.get("url");
+        if (o == null) {
+            url = Constants.DEFAULT_URL;
+        } else {
+            url = o.toString();
+        }
+        Log log = new Log();
+        if (url.endsWith("&log=debug")) {
+            url = url.substring(0, url.length() - "&log=debug".length());
+            log.debug = true;
+        }
+        RepositoryImpl  rep = new RepositoryImpl(url, log);
+        log.codeAssign(rep, null, "new " + RepositoryFactoryImpl.class.getName() + "().getRepository", parameters);
+        return rep;
     }
 
 }