You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2008/05/19 10:43:28 UTC

svn commit: r657756 [1/2] - in /jackrabbit/sandbox/jackrabbit-ngp: ./ src/main/java/org/apache/jackrabbit/ngp/ src/main/java/org/apache/jackrabbit/ngp/node/ src/main/java/org/apache/jackrabbit/ngp/nodetype/ src/main/java/org/apache/jackrabbit/ngp/sessi...

Author: jukka
Date: Mon May 19 01:43:27 2008
New Revision: 657756

URL: http://svn.apache.org/viewvc?rev=657756&view=rev
Log:
NGP: Number of changes written over the weekend
    - Simplified core abstraction in o.a.j.ngp.state:
      - Node (bundle) states can be either transient or persistent
      - Only transient states can be modified
    - Don't use the file journal for now, all persistent states remain in memory
    - Support for simple single-valued string properties
    - Dummy namespace and node type support
    - JCR TCK (far from passing...)

Added:
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NamespaceRegistryImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/PropertyImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/WorkspaceImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeDefinitionImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeManagerImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/PropertyDefinitionImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/NodeState.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/PersistentNodeState.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/TransientNodeState.java
    jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/JCRAPITest.java
    jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryStubImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/test/java/repositoryStubImpl.properties
Removed:
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/node/
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/session/
Modified:
    jackrabbit/sandbox/jackrabbit-ngp/   (props changed)
    jackrabbit/sandbox/jackrabbit-ngp/pom.xml
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NodeImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/RepositoryImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/SessionImpl.java
    jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/AbstractRepositoryTest.java
    jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/NodeTest.java
    jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryTest.java
    jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/SessionTest.java

Propchange: jackrabbit/sandbox/jackrabbit-ngp/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon May 19 01:43:27 2008
@@ -1,3 +1,4 @@
-target
-.classpath
-.project
+target
+.classpath
+.project
+.settings

Modified: jackrabbit/sandbox/jackrabbit-ngp/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/pom.xml?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/pom.xml (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/pom.xml Mon May 19 01:43:27 2008
@@ -39,7 +39,7 @@
     <dependency>
       <groupId>org.apache.jackrabbit</groupId>
       <artifactId>jackrabbit-jcr-commons</artifactId>
-      <version>1.4</version>
+      <version>1.5-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>commons-collections</groupId>
@@ -57,6 +57,12 @@
       <version>1.4</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-jcr-tests</artifactId>
+      <version>1.5-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.4</version>

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NamespaceRegistryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NamespaceRegistryImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NamespaceRegistryImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NamespaceRegistryImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,85 @@
+/*
+ * 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.ngp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.NamespaceException;
+import javax.jcr.NamespaceRegistry;
+import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
+
+import org.apache.jackrabbit.commons.NamespaceHelper;
+
+public class NamespaceRegistryImpl implements NamespaceRegistry {
+
+    private final Map<String, String> namespaces =
+        new HashMap<String, String>();
+
+    public NamespaceRegistryImpl() {
+        namespaces.put("", "");
+        namespaces.put("jcr", NamespaceHelper.JCR);
+        namespaces.put("nt", NamespaceHelper.NT);
+        namespaces.put("mix", NamespaceHelper.MIX);
+        // TODO: Shouldn't be needed!
+        namespaces.put("sv", "http://www.jcp.org/jcr/sv/1.0");
+    }
+
+    public String getPrefix(String uri) throws RepositoryException {
+        for (Map.Entry<String, String> entry : namespaces.entrySet()) {
+            if (entry.getValue().equals(uri)) {
+                return entry.getKey();
+            }
+        }
+        throw new NamespaceException("Unknown namespace URI: " + uri);
+    }
+
+    public String[] getPrefixes() throws RepositoryException {
+        return (String[])
+            namespaces.keySet().toArray(new String[namespaces.size()]);
+    }
+
+    public String getURI(String prefix) throws RepositoryException {
+        String uri = namespaces.get(prefix);
+        if (uri != null) {
+            return uri;
+        } else {
+            throw new NamespaceException("Unknown namespace prefix: " + prefix);
+        }
+    }
+
+    public String[] getURIs() throws RepositoryException {
+        return (String[])
+            namespaces.values().toArray(new String[namespaces.size()]);
+    }
+
+    public void registerNamespace(String prefix, String uri)
+            throws RepositoryException {
+        if (namespaces.containsKey(prefix)) {
+            throw new NamespaceException("Prefix already registered: " + prefix);
+        } else if (namespaces.containsValue(uri)) {
+            throw new NamespaceException("URI already registered: " + uri);
+        }
+        namespaces.put(prefix, uri);
+    }
+
+    public void unregisterNamespace(String prefix) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+}

Modified: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NodeImpl.java?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NodeImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/NodeImpl.java Mon May 19 01:43:27 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -17,54 +17,69 @@
 package org.apache.jackrabbit.ngp;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
-import java.util.Map;
+import java.util.HashSet;
+import java.util.Set;
 
-import javax.jcr.AccessDeniedException;
-import javax.jcr.InvalidItemStateException;
 import javax.jcr.Item;
-import javax.jcr.ItemExistsException;
 import javax.jcr.ItemNotFoundException;
-import javax.jcr.MergeException;
-import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
 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;
 import javax.jcr.lock.Lock;
-import javax.jcr.lock.LockException;
-import javax.jcr.nodetype.ConstraintViolationException;
-import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeDefinition;
 import javax.jcr.version.Version;
-import javax.jcr.version.VersionException;
 
 import org.apache.jackrabbit.commons.AbstractNode;
 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
-import org.apache.jackrabbit.ngp.node.NodeState;
+import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
+import org.apache.jackrabbit.ngp.nodetype.NodeDefinitionImpl;
+import org.apache.jackrabbit.ngp.state.NodeState;
+import org.apache.jackrabbit.ngp.state.PersistentNodeState;
+import org.apache.jackrabbit.ngp.state.TransientNodeState;
 
 public class NodeImpl extends AbstractNode {
 
-    private final Session session;
+    private final SessionImpl session;
 
-    private final Node parent;
+    private final NodeImpl parent;
 
     private final String name;
 
-    private final NodeState state;
-
-    NodeImpl(Session session, Node parent, String name, NodeState state) {
+    NodeImpl(SessionImpl session, NodeImpl parent, String name) {
         this.session = session;
         this.parent = parent;
         this.name = name;
-        this.state = state;
+    }
+
+    NodeState getNodeState() {
+        if (parent == null) {
+            return session.getRoot();
+        } else {
+            // Guaranteed to exist, but may be PersistentNodeState.DEL
+            return parent.getNodeState().getNodes().get(name);
+        }
+    }
+
+    TransientNodeState getTransientNodeState() {
+        NodeState state = getNodeState();
+        if (!state.isTransient()) {
+            state = new TransientNodeState((PersistentNodeState) state);
+            if (parent == null) {
+                session.setRoot(state);
+            } else {
+                parent.getTransientNodeState().setNode(name, state);
+            }
+        }
+        return (TransientNodeState) state;
     }
 
     /**
@@ -82,259 +97,253 @@
 
     public Node getParent() throws ItemNotFoundException {
         if (parent != null) {
-            // TODO: Support moves
-            return parent;
+            return parent; // TODO: Support moves
         } else {
             throw new ItemNotFoundException("The root node has no parent");
         }
     }
 
     public String getName() {
-        // TODO: Support renames
-        return name;
+        return name; // TODO: Support renames
     }
 
     public int getIndex() throws RepositoryException {
-        // TODO: Support same-name-siblings
-        return 1;
+        return 1; // TODO: Support same-name-siblings
     }
 
     public boolean isModified() {
-        return false;
+        synchronized (session) {
+            return getNodeState().isModified();
+        }
     }
 
     public boolean isNew() {
-        return false;
+        synchronized (session) {
+            return getNodeState().isNew();
+        }
+    }
+
+    public PropertyIterator getProperties() throws RepositoryException {
+        synchronized (session) {
+            Set<String> names = getNodeState().getProperties().keySet();
+            Collection<Property> properties =
+                new ArrayList<Property>(names.size());
+            for (String name : names) {
+                properties.add(new PropertyImpl(session, this, name));
+            }
+            return new PropertyIteratorAdapter(properties);
+        }
+    }
+
+    public Property getProperty(String relPath) throws RepositoryException {
+        // TODO: Support relative paths
+        synchronized (session) {
+            if (getNodeState().getProperties().containsKey(relPath)) {
+                return new PropertyImpl(session, this, relPath);
+            } else {
+                throw new PathNotFoundException(relPath);
+            }
+        }
+    }
+
+    public Property setProperty(String name, Value value)
+            throws RepositoryException {
+        synchronized (session) {
+            getTransientNodeState().setProperty(name, value.getString());
+            return new PropertyImpl(session, this, name);
+        }
+    }
+
+    public Property setProperty(String name, Value[] values)
+            throws RepositoryException {
+        throw new ValueFormatException("Not a multi-valued property");
     }
 
     public NodeIterator getNodes() throws RepositoryException {
         synchronized (session) {
-            Map<String, NodeState> states = state.getNodes();
-            Collection<Node> nodes = new ArrayList<Node>(states.size());
-            for (Map.Entry<String, NodeState> entry : states.entrySet()) {
-                nodes.add(new NodeImpl(
-                        session, this, entry.getKey(), entry.getValue()));
+            Set<String> names = getNodeState().getNodes().keySet();
+            Collection<Node> nodes = new ArrayList<Node>(names.size());
+            for (String name : names) {
+                nodes.add(new NodeImpl(session, this, name));
             }
             return new NodeIteratorAdapter(nodes);
         }
     }
 
     public Node getNode(String relPath) throws RepositoryException {
-        int i = relPath.indexOf('/');
-        if (i > 0) {
-            Node node = getNode(relPath.substring(0, i));
-            return node.getNode(relPath.substring(i + 1));
-        } else if (i == 0) {
-            return getSession().getRootNode().getNode(relPath.substring(1));
-        } else if (relPath.equals("..")) {
-            if (parent != null) {
-                return parent;
+        int slash = relPath.indexOf('/');
+        if (slash != -1) {
+            getNode(relPath.substring(0, slash)).getNode(relPath.substring(slash + 1));
+        }
+        // TODO: Support relative paths
+        synchronized (session) {
+            NodeState state = getNodeState().getNodes().get(relPath);
+            if (state != null && state != PersistentNodeState.DEL) {
+                return new NodeImpl(session, this, relPath);
             } else {
                 throw new PathNotFoundException(relPath);
             }
-        } else if (relPath.equals(".")) {
-            return this;
-        } else {
-            synchronized (session) {
-                NodeState child = state.getNodes().get(relPath);
-                if (child != null) {
-                    return new NodeImpl(session, this, relPath, child);
-                } else {
-                    throw new PathNotFoundException(relPath);
-                }
-            }
         }
     }
 
     public Node addNode(String relPath) throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        // TODO: Support relative paths
+        synchronized (session) {
+            NodeState state = getNodeState().getNodes().get(relPath);
+            if (state != null && state != PersistentNodeState.DEL) {
+                throw new RepositoryException(); // TODO
+            }
+            state = new TransientNodeState(PersistentNodeState.NEW);
+            ((TransientNodeState) state).setProperty(
+                    "jcr:primaryType", "nt:unstructured");
+            getTransientNodeState().setNode(relPath, state);
+            return new NodeImpl(session, this, relPath);
+        }
     }
 
-    public void addMixin(String mixinName) throws NoSuchNodeTypeException,
-            VersionException, ConstraintViolationException, LockException,
-            RepositoryException {
-        // TODO Auto-generated method stub
+    public Node addNode(String relPath, String primaryNodeTypeName)
+            throws RepositoryException {
+        return addNode(relPath); // TODO: Support node types
+    }
 
+    public void remove() throws RepositoryException {
+        if (parent == null) {
+            throw new RepositoryException("Can not remove the root node");
+        }
+        synchronized (session) {
+            parent.getTransientNodeState().setNode(
+                    name, PersistentNodeState.DEL);
+        }
     }
 
-    public Node addNode(String relPath, String primaryNodeTypeName)
-            throws ItemExistsException, PathNotFoundException,
-            NoSuchNodeTypeException, LockException, VersionException,
-            ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+    public void addMixin(String mixinName) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public boolean canAddMixin(String mixinName)
-            throws NoSuchNodeTypeException, RepositoryException {
-        // TODO Auto-generated method stub
+    public boolean canAddMixin(String mixinName) throws RepositoryException {
+        // TODO: Support mixin types
         return false;
     }
 
-    public void cancelMerge(Version version) throws VersionException,
-            InvalidItemStateException, UnsupportedRepositoryOperationException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-
+    public void cancelMerge(Version version) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public Version checkin() throws VersionException,
-            UnsupportedRepositoryOperationException, InvalidItemStateException,
-            LockException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+    public Version checkin() throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public void checkout() throws UnsupportedRepositoryOperationException,
-            LockException, RepositoryException {
-        // TODO Auto-generated method stub
-
+    public void checkout() throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public void doneMerge(Version version) throws VersionException,
-            InvalidItemStateException, UnsupportedRepositoryOperationException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-
+    public void doneMerge(Version version) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public Version getBaseVersion()
-            throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+    public Version getBaseVersion() throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public String getCorrespondingNodePath(String workspaceName)
-            throws ItemNotFoundException, NoSuchWorkspaceException,
-            AccessDeniedException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public NodeDefinition getDefinition() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Lock getLock() throws UnsupportedRepositoryOperationException,
-            LockException, AccessDeniedException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        return new NodeDefinitionImpl();
     }
 
-    public NodeIterator getNodes(String namePattern) throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+    public Lock getLock() throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public Item getPrimaryItem() throws ItemNotFoundException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+    public NodeIterator getNodes(String namePattern)
+            throws RepositoryException {
+        // TODO: Support name patterns
+        if (namePattern.equals("*")) {
+            return getNodes();
+        }
+        Collection<Node> nodes = new ArrayList<Node>();
+        for (String name : new HashSet<String>(Arrays.asList(namePattern.split("\\|")))) {
+            try {
+                nodes.add(getNode(name));
+            } catch (PathNotFoundException e) {
+            }
+        }
+        return new NodeIteratorAdapter(nodes);
     }
 
-    public PropertyIterator getProperties() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+    public Item getPrimaryItem() throws RepositoryException {
+        // TODO: Support primary items
+        throw new ItemNotFoundException();
     }
 
     public PropertyIterator getProperties(String namePattern)
             throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        // TODO: Support name patterns
+        if (namePattern.equals("*")) {
+            return getProperties();
+        }
+        Collection<Property> properties = new ArrayList<Property>(1);
+        for (String name : new HashSet<String>(Arrays.asList(namePattern.split("\\|")))) {
+            try {
+                properties.add(getProperty(name));
+            } catch (PathNotFoundException e) {
+            }
+        }
+        return new PropertyIteratorAdapter(properties);
     }
 
     public PropertyIterator getReferences() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public Lock lock(boolean isDeep, boolean isSessionScoped)
-            throws UnsupportedRepositoryOperationException, LockException,
-            AccessDeniedException, InvalidItemStateException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public NodeIterator merge(String srcWorkspace, boolean bestEffort)
-            throws NoSuchWorkspaceException, AccessDeniedException,
-            MergeException, LockException, InvalidItemStateException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public void orderBefore(String srcChildRelPath, String destChildRelPath)
-            throws UnsupportedRepositoryOperationException, VersionException,
-            ConstraintViolationException, ItemNotFoundException, LockException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public void removeMixin(String mixinName) throws NoSuchNodeTypeException,
-            VersionException, ConstraintViolationException, LockException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-
+    public void removeMixin(String mixinName) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public void restore(Version version, String relPath, boolean removeExisting)
-            throws PathNotFoundException, ItemExistsException,
-            VersionException, ConstraintViolationException,
-            UnsupportedRepositoryOperationException, LockException,
-            InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
-
-    }
-
-    public Property setProperty(String name, Value value)
-            throws ValueFormatException, VersionException, LockException,
-            ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public Property setProperty(String name, Value[] values)
-            throws ValueFormatException, VersionException, LockException,
-            ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public void unlock() throws UnsupportedRepositoryOperationException,
-            LockException, AccessDeniedException, InvalidItemStateException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-
+    public void unlock() throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public void update(String srcWorkspaceName)
-            throws NoSuchWorkspaceException, AccessDeniedException,
-            LockException, InvalidItemStateException, RepositoryException {
-        // TODO Auto-generated method stub
-
+    public void update(String srcWorkspaceName) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public boolean isSame(Item otherItem) throws RepositoryException {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    public void remove() throws VersionException, LockException,
-            ConstraintViolationException, RepositoryException {
-        // TODO Auto-generated method stub
-
+        if (!otherItem.isNode() || !name.equals(otherItem.getName())) {
+            return false;
+        } if (otherItem.getDepth() == 0) {
+            return parent == null;
+        } else {
+            return parent != null && parent.isSame(otherItem.getParent());
+        }
     }
 
-    public void save() throws AccessDeniedException, ItemExistsException,
-            ConstraintViolationException, InvalidItemStateException,
-            ReferentialIntegrityException, VersionException, LockException,
-            NoSuchNodeTypeException, RepositoryException {
-        // TODO Auto-generated method stub
-
+    public void save() throws RepositoryException {
+        // TODO: item saves
+        session.save();
     }
 
 }

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/PropertyImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/PropertyImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/PropertyImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,98 @@
+/*
+ * 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.ngp;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Value;
+import javax.jcr.ValueFormatException;
+import javax.jcr.nodetype.PropertyDefinition;
+
+import org.apache.jackrabbit.commons.AbstractProperty;
+import org.apache.jackrabbit.ngp.nodetype.PropertyDefinitionImpl;
+
+public class PropertyImpl extends AbstractProperty {
+
+    private final SessionImpl session;
+
+    private final NodeImpl parent;
+
+    private final String name;
+
+    public PropertyImpl(SessionImpl session, NodeImpl parent, String name) {
+        this.session = session;
+        this.parent = parent;
+        this.name = name;
+    }
+
+    public Session getSession() {
+        return session;
+    }
+
+    public Node getParent() {
+        return parent;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public boolean isModified() {
+        synchronized (session) {
+            return parent.getNodeState().isModified(name);
+        }
+    }
+
+    public boolean isNew() {
+        synchronized (session) {
+            return parent.getNodeState().isModified(name);
+        }
+    }
+
+    public boolean isSame(Item otherItem) throws RepositoryException {
+        return !otherItem.isNode()
+            && name.equals(otherItem.getName())
+            && parent.isSame(otherItem.getParent());
+    }
+
+    public void refresh(boolean keepChanges) throws RepositoryException {
+        session.refresh(keepChanges);
+    }
+
+    public void save() throws RepositoryException {
+        // TODO: item saves
+        session.save();
+    }
+
+    public PropertyDefinition getDefinition() {
+        return new PropertyDefinitionImpl();
+    }
+
+    public Value getValue() throws RepositoryException {
+        synchronized (session) {
+            return session.getValueFactory().createValue(
+                    parent.getNodeState().getProperties().get(name));
+        }
+    }
+
+    public Value[] getValues() throws RepositoryException {
+        throw new ValueFormatException("Not a multi-valued property: " + name);
+    }
+
+}

Modified: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/RepositoryImpl.java?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/RepositoryImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/RepositoryImpl.java Mon May 19 01:43:27 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -16,18 +16,17 @@
  */
 package org.apache.jackrabbit.ngp;
 
-import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.jcr.Credentials;
+import javax.jcr.NamespaceRegistry;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Workspace;
 
 import org.apache.jackrabbit.commons.AbstractRepository;
-import org.apache.jackrabbit.ngp.journal.FileJournal;
-import org.apache.jackrabbit.ngp.journal.Journal;
+import org.apache.jackrabbit.ngp.state.PersistentNodeState;
 
 public class RepositoryImpl extends AbstractRepository {
 
@@ -46,26 +45,20 @@
         DESCRIPTORS.put(REP_VENDOR_DESC, "Apache Software Foundation");
         DESCRIPTORS.put(REP_VENDOR_URL_DESC, "http://jackrabbit.apache.org/");
 
-        // DESCRIPTORS.put(LEVEL_1_SUPPORTED, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(LEVEL_2_SUPPORTED, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(OPTION_LOCKING_SUPPORTED, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(OPTION_OBSERVATION_SUPPORTED, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(OPTION_QUERY_SQL_SUPPORTED, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(OPTION_TRANSACTIONS_SUPPORTED, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(OPTION_VERSIONING_SUPPORTED, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(QUERY_XPATH_DOC_ORDER, Boolean.TRUE.toString());
-        // DESCRIPTORS.put(QUERY_XPATH_POS_INDEX, Boolean.TRUE.toString());
+        DESCRIPTORS.put(LEVEL_1_SUPPORTED, Boolean.TRUE.toString());
+        DESCRIPTORS.put(LEVEL_2_SUPPORTED, Boolean.TRUE.toString());
+        DESCRIPTORS.put(OPTION_LOCKING_SUPPORTED, Boolean.FALSE.toString());
+        DESCRIPTORS.put(OPTION_OBSERVATION_SUPPORTED, Boolean.FALSE.toString());
+        DESCRIPTORS.put(OPTION_QUERY_SQL_SUPPORTED, Boolean.FALSE.toString());
+        DESCRIPTORS.put(OPTION_TRANSACTIONS_SUPPORTED, Boolean.FALSE.toString());
+        DESCRIPTORS.put(OPTION_VERSIONING_SUPPORTED, Boolean.FALSE.toString());
+        DESCRIPTORS.put(QUERY_XPATH_DOC_ORDER, Boolean.FALSE.toString());
+        DESCRIPTORS.put(QUERY_XPATH_POS_INDEX, Boolean.FALSE.toString());
     }
 
-    private final Journal journal;
+    private final NamespaceRegistry registry = new NamespaceRegistryImpl();
 
-    public RepositoryImpl(Journal journal) {
-        this.journal = journal;
-    }
-
-    public RepositoryImpl(File directory) throws RepositoryException {
-        this(new FileJournal(directory));
-    }
+    private PersistentNodeState root = PersistentNodeState.ROOT;
 
     public String getDescriptor(String key) {
         return DESCRIPTORS.get(key);
@@ -88,7 +81,18 @@
         attributes.put(Credentials.class.getName(), credentials);
         attributes.put(Workspace.class.getName(), workspaceName);
 
-        return new SessionImpl(this, attributes, journal);
+        return new SessionImpl(this, attributes, registry);
+    }
+
+    //----------------------------------------------------< RepositoryImp >--
+
+    PersistentNodeState getRoot() {
+        return root;
+    }
+
+    void setRoot(PersistentNodeState root) {
+        assert root != null;
+        this.root = root;
     }
 
 }

Modified: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/SessionImpl.java?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/SessionImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/SessionImpl.java Mon May 19 01:43:27 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -19,43 +19,50 @@
 import java.util.Map;
 
 import javax.jcr.Credentials;
-import javax.jcr.NamespaceException;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.NamespaceRegistry;
 import javax.jcr.Node;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.SimpleCredentials;
+import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.ValueFactory;
 import javax.jcr.Workspace;
 
 import org.apache.jackrabbit.commons.AbstractSession;
-import org.apache.jackrabbit.ngp.journal.Journal;
-import org.apache.jackrabbit.ngp.session.SessionState;
+import org.apache.jackrabbit.ngp.state.NodeState;
+import org.apache.jackrabbit.ngp.state.TransientNodeState;
+import org.apache.jackrabbit.value.ValueFactoryImpl;
 import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
 
 public class SessionImpl extends AbstractSession {
 
-    private final Repository repository;
+    private final RepositoryImpl repository;
 
     private final Map<String, Object> attributes;
 
-    private SessionState state;
+    private final NamespaceRegistry registry;
+
+    private NodeState root;
+
+    private boolean live = true;
 
     SessionImpl(
-            Repository repository, Map<String, Object> attributes,
-            Journal journal) throws RepositoryException {
+            RepositoryImpl repository, Map<String, Object> attributes,
+            NamespaceRegistry registry)
+            throws RepositoryException {
         this.repository = repository;
         this.attributes = attributes;
-        this.state = new SessionState(journal);
+        this.root = repository.getRoot();
+        this.registry = registry;
     }
 
-    private SessionState getState() throws RepositoryException {
-        SessionState state = this.state;
-        if (state != null) {
-            return state;
-        } else {
-            throw new RepositoryException("This session has been closed");
-        }
+    NodeState getRoot() {
+        return root;
+    }
+
+    void setRoot(NodeState root) {
+        this.root = root;
     }
 
     /**
@@ -67,6 +74,14 @@
         return repository;
     }
 
+    public Workspace getWorkspace() {
+        return new WorkspaceImpl(this, registry);
+    }
+
+    public ValueFactory getValueFactory() {
+        return ValueFactoryImpl.getInstance();
+    }
+
     /**
      * Returns the names of all the attributes associated with this session.
      *
@@ -103,10 +118,11 @@
     }
 
     /**
-     * Closes this session. Any unsaved state is discarded.
+     * Closes this session.
      */
     public void logout() {
-        state = null;
+        live = false;
+        super.logout();
     }
 
     /**
@@ -115,7 +131,7 @@
      * @return state of this session
      */
     public boolean isLive() {
-        return state != null;
+        return live;
     }
 
     /**
@@ -126,108 +142,51 @@
      */
     public synchronized void refresh(boolean keepChanges)
             throws RepositoryException {
-        getState().refresh(keepChanges);
-    }
-
-    public synchronized Node getRootNode() throws RepositoryException {
-        return new NodeImpl(this, null, "", getState().getRootNode());
+        if (!keepChanges || !root.isModified()) {
+            root = repository.getRoot();
+        } else if (
+                ((TransientNodeState) root).getBase() != repository.getRoot()) {
+            throw new UnsupportedRepositoryOperationException();
+        }
     }
 
-    public void addLockToken(String lt) {
-        // TODO Auto-generated method stub
-
+    public Node getRootNode() {
+        return new NodeImpl(this, null, "");
     }
 
     public void checkPermission(String absPath, String actions)
             throws RepositoryException {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void exportDocumentView(
-            String absPath, ContentHandler contentHandler,
-            boolean skipBinary, boolean noRecurse)
-            throws SAXException, RepositoryException {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void exportSystemView(
-            String absPath, ContentHandler contentHandler,
-            boolean skipBinary, boolean noRecurse)
-            throws SAXException, RepositoryException {
-        // TODO Auto-generated method stub
-
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public ContentHandler getImportContentHandler(
             String parentAbsPath, int uuidBehavior)
             throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String[] getLockTokens() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String getNamespacePrefix(String uri) throws NamespaceException,
-            RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String[] getNamespacePrefixes() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String getNamespaceURI(String prefix) throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        throw new UnsupportedRepositoryOperationException();
     }
 
     public Node getNodeByUUID(String uuid) throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public ValueFactory getValueFactory() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        // TODO: Support mix:referenceable
+        throw new ItemNotFoundException();
     }
 
-    public Workspace getWorkspace() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public boolean hasPendingChanges() throws RepositoryException {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean hasPendingChanges() {
+        return root.isTransient();
     }
 
     public void move(String srcAbsPath, String destAbsPath)
             throws RepositoryException {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void removeLockToken(String lt) {
-        // TODO Auto-generated method stub
-
+        throw new UnsupportedRepositoryOperationException();
     }
 
-    public void save() throws RepositoryException {
-        // TODO Auto-generated method stub
-
-    }
-
-    public void setNamespacePrefix(String prefix, String uri)
-            throws RepositoryException {
-        // TODO Auto-generated method stub
-
+    public synchronized void save() throws RepositoryException {
+        synchronized (repository) {
+            refresh(true);
+            if (hasPendingChanges()) {
+                repository.setRoot(root.persist());
+            }
+            refresh(false);
+        }
     }
 
 }

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/WorkspaceImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/WorkspaceImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/WorkspaceImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,104 @@
+/*
+ * 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.ngp;
+
+import javax.jcr.NamespaceRegistry;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.nodetype.NodeTypeManager;
+import javax.jcr.observation.ObservationManager;
+import javax.jcr.query.QueryManager;
+import javax.jcr.version.Version;
+
+import org.apache.jackrabbit.commons.AbstractWorkspace;
+import org.apache.jackrabbit.ngp.nodetype.NodeTypeManagerImpl;
+import org.xml.sax.ContentHandler;
+
+public class WorkspaceImpl extends AbstractWorkspace {
+
+    private final SessionImpl session;
+
+    private final NamespaceRegistry registry;
+
+    public WorkspaceImpl(SessionImpl session, NamespaceRegistry registry) {
+        this.session = session;
+        this.registry = registry;
+    }
+
+    public Session getSession() {
+        return session;
+    }
+
+    public String getName() {
+        return "default";
+    }
+
+    public String[] getAccessibleWorkspaceNames() throws RepositoryException {
+        return new String[] { "default" };
+    }
+
+    public NamespaceRegistry getNamespaceRegistry() {
+        return registry;
+    }
+
+    public void clone(
+            String srcWorkspace, String srcAbsPath,
+            String destAbsPath, boolean removeExisting)
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    public void copy(String srcAbsPath, String destAbsPath)
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    public void copy(String srcWorkspace, String srcAbsPath, String destAbsPath)
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    public ContentHandler getImportContentHandler(
+            String parentAbsPath, int uuidBehavior) throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    public NodeTypeManager getNodeTypeManager() throws RepositoryException {
+        return new NodeTypeManagerImpl();
+    }
+
+    public ObservationManager getObservationManager()
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    public QueryManager getQueryManager() throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    public void move(String srcAbsPath, String destAbsPath)
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    public void restore(Version[] versions, boolean removeExisting)
+            throws RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+}

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeDefinitionImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeDefinitionImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeDefinitionImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,62 @@
+/*
+ * 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.ngp.nodetype;
+
+import javax.jcr.nodetype.NodeDefinition;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.version.OnParentVersionAction;
+
+
+public class NodeDefinitionImpl implements NodeDefinition {
+
+    public boolean allowsSameNameSiblings() {
+        return false;
+    }
+
+    public NodeType getDefaultPrimaryType() {
+        return new NodeTypeImpl();
+    }
+
+    public NodeType[] getRequiredPrimaryTypes() {
+        return new NodeType[] {new NodeTypeImpl() };
+    }
+
+    public NodeType getDeclaringNodeType() {
+        return new NodeTypeImpl();
+    }
+
+    public String getName() {
+        return "*";
+    }
+
+    public int getOnParentVersion() {
+        return OnParentVersionAction.COPY;
+    }
+
+    public boolean isAutoCreated() {
+        return false;
+    }
+
+    public boolean isMandatory() {
+        return false;
+    }
+
+    public boolean isProtected() {
+        return false;
+    }
+
+}

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,91 @@
+/*
+ * 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.ngp.nodetype;
+
+import javax.jcr.Value;
+import javax.jcr.nodetype.NodeDefinition;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.PropertyDefinition;
+
+
+public class NodeTypeImpl implements NodeType {
+
+    public boolean canAddChildNode(String childNodeName) {
+        return true;
+    }
+
+    public boolean canAddChildNode(String childNodeName, String nodeTypeName) {
+        return true;
+    }
+
+    public boolean canRemoveItem(String itemName) {
+        return !itemName.equals("jcr:primaryType");
+    }
+
+    public boolean canSetProperty(String propertyName, Value value) {
+        return !propertyName.equals("jcr:primaryType");
+    }
+
+    public boolean canSetProperty(String propertyName, Value[] values) {
+        return false;
+    }
+
+    public NodeDefinition[] getChildNodeDefinitions() {
+        return new NodeDefinition[] { new NodeDefinitionImpl() };
+    }
+
+    public NodeDefinition[] getDeclaredChildNodeDefinitions() {
+        return new NodeDefinition[] { new NodeDefinitionImpl() };
+    }
+
+    public PropertyDefinition[] getDeclaredPropertyDefinitions() {
+        return new PropertyDefinition[] { new PropertyDefinitionImpl() };
+    }
+
+    public NodeType[] getDeclaredSupertypes() {
+        return new NodeType[0];
+    }
+
+    public String getName() {
+        return "nt:unstructured";
+    }
+
+    public String getPrimaryItemName() {
+        return null;
+    }
+
+    public PropertyDefinition[] getPropertyDefinitions() {
+        return new PropertyDefinition[] { new PropertyDefinitionImpl() };
+    }
+
+    public NodeType[] getSupertypes() {
+        return new NodeType[0];
+    }
+
+    public boolean hasOrderableChildNodes() {
+        return false;
+    }
+
+    public boolean isMixin() {
+        return false;
+    }
+
+    public boolean isNodeType(String nodeTypeName) {
+        return getName().equals(nodeTypeName);
+    }
+
+}

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeManagerImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeManagerImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/NodeTypeManagerImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,52 @@
+/*
+ * 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.ngp.nodetype;
+
+import java.util.Collections;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeIterator;
+import javax.jcr.nodetype.NodeTypeManager;
+
+import org.apache.jackrabbit.commons.iterator.NodeTypeIteratorAdapter;
+
+public class NodeTypeManagerImpl implements NodeTypeManager {
+
+    public NodeTypeIterator getAllNodeTypes() throws RepositoryException {
+        return new NodeTypeIteratorAdapter(Collections.singleton(new NodeTypeImpl()));
+    }
+
+    public NodeTypeIterator getMixinNodeTypes() throws RepositoryException {
+        return new NodeTypeIteratorAdapter(Collections.EMPTY_LIST);
+    }
+
+    public NodeTypeIterator getPrimaryNodeTypes() throws RepositoryException {
+        return new NodeTypeIteratorAdapter(Collections.singleton(new NodeTypeImpl()));
+    }
+
+    public NodeType getNodeType(String nodeTypeName)
+            throws NoSuchNodeTypeException, RepositoryException {
+        if (nodeTypeName.equals("nt:unstructured")) {
+            return new NodeTypeImpl();
+        } else {
+            throw new NoSuchNodeTypeException(nodeTypeName);
+        }
+    }
+
+}

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/PropertyDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/PropertyDefinitionImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/PropertyDefinitionImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/nodetype/PropertyDefinitionImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,67 @@
+/*
+ * 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.ngp.nodetype;
+
+import javax.jcr.PropertyType;
+import javax.jcr.Value;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.PropertyDefinition;
+import javax.jcr.version.OnParentVersionAction;
+
+public class PropertyDefinitionImpl implements PropertyDefinition {
+
+    public Value[] getDefaultValues() {
+        return null;
+    }
+
+    public int getRequiredType() {
+        return PropertyType.STRING;
+    }
+
+    public String[] getValueConstraints() {
+        return null;
+    }
+
+    public boolean isMultiple() {
+        return false;
+    }
+
+    public NodeType getDeclaringNodeType() {
+        return null;
+    }
+
+    public String getName() {
+        return "*";
+    }
+
+    public int getOnParentVersion() {
+        return OnParentVersionAction.COPY;
+    }
+
+    public boolean isAutoCreated() {
+        return false;
+    }
+
+    public boolean isMandatory() {
+        return false;
+    }
+
+    public boolean isProtected() {
+        return false;
+    }
+
+}

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/NodeState.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/NodeState.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/NodeState.java Mon May 19 01:43:27 2008
@@ -0,0 +1,42 @@
+/*
+ * 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.ngp.state;
+
+import java.util.Map;
+
+
+public interface NodeState {
+
+    boolean isTransient();
+
+    boolean isModified();
+
+    boolean isModified(String property);
+
+    boolean isNew();
+
+    boolean isNew(String property);
+
+    PersistentNodeState persist();
+
+    NodeState refresh(PersistentNodeState state);
+
+    Map<String, String> getProperties();
+
+    Map<String, NodeState> getNodes();
+
+}

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/PersistentNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/PersistentNodeState.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/PersistentNodeState.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/PersistentNodeState.java Mon May 19 01:43:27 2008
@@ -0,0 +1,92 @@
+/*
+ * 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.ngp.state;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class PersistentNodeState implements NodeState {
+
+    public static final PersistentNodeState ROOT = new PersistentNodeState(
+            Collections.singletonMap("jcr:primaryType", "nt:unstructured"),
+            new HashMap<String, NodeState>());
+
+    public static final PersistentNodeState NEW = new PersistentNodeState(
+            new HashMap<String, String>(), new HashMap<String, NodeState>());
+
+    public static final PersistentNodeState DEL = new PersistentNodeState(
+            new HashMap<String, String>(), new HashMap<String, NodeState>());
+
+    private final Map<String, String> properties;
+
+    private final Map<String, NodeState> nodes;
+
+    public PersistentNodeState(
+            Map<String, String> properties, Map<String, NodeState> nodes) {
+        assert properties != null;
+        assert nodes != null;
+        for (NodeState node : nodes.values()) {
+            assert !node.isTransient();
+        }
+
+        this.properties = Collections.unmodifiableMap(
+                new HashMap<String, String>(properties));
+        this.nodes = Collections.unmodifiableMap(
+                new HashMap<String, NodeState>(nodes));
+    }
+
+    //---------------------------------------------------------< NodeState >--
+
+    public boolean isTransient() {
+        return false;
+    }
+
+    public boolean isModified() {
+        return false;
+    }
+
+    public boolean isModified(String property) {
+        return false;
+    }
+
+    public boolean isNew() {
+        return false;
+    }
+
+    public boolean isNew(String property) {
+        return false;
+    }
+
+    public PersistentNodeState persist() {
+        return this;
+    }
+
+    public NodeState refresh(PersistentNodeState state) {
+        return state;
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    public Map<String, NodeState> getNodes() {
+        return nodes;
+    }
+
+}

Added: jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/TransientNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/TransientNodeState.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/TransientNodeState.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/main/java/org/apache/jackrabbit/ngp/state/TransientNodeState.java Mon May 19 01:43:27 2008
@@ -0,0 +1,142 @@
+/*
+ * 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.ngp.state;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class TransientNodeState implements NodeState {
+
+    private final PersistentNodeState base;
+
+    private final Map<String, String> properties =
+        new HashMap<String, String>();
+
+    private final Map<String, NodeState> nodes =
+        new HashMap<String, NodeState>();
+
+    public TransientNodeState(PersistentNodeState base) {
+        assert base != null;
+        this.base = base;
+    }
+
+    //---------------------------------------------------------< NodeState >--
+
+    public boolean isTransient() {
+        return true;
+    }
+
+    public boolean isModified() {
+        // TODO: Is this just a transient parent entry?
+        return !properties.isEmpty() || !nodes.isEmpty();
+    }
+
+    public boolean isModified(String property) {
+        return properties.containsKey(property);
+    }
+
+    public boolean isNew() {
+        return base == PersistentNodeState.NEW;
+    }
+
+    public boolean isNew(String property) {
+        return properties.containsKey(property)
+            && !base.getProperties().containsKey(property);
+    }
+
+    public PersistentNodeState persist() {
+        Map<String, NodeState> result = base.getNodes();
+        if (!nodes.isEmpty()) {
+            result = new HashMap<String, NodeState>(result);
+            for (Map.Entry<String, NodeState> entry : nodes.entrySet()) {
+                if (entry.getValue() != null) {
+                    result.put(entry.getKey(), entry.getValue().persist());
+                } else {
+                    result.remove(entry.getKey());
+                }
+            }
+        }
+        return new PersistentNodeState(getProperties(), result);
+    }
+
+    public NodeState refresh(PersistentNodeState state) {
+        if (!state.equals(base)) {
+            for (Map.Entry<String, NodeState> entry : getNodes().entrySet()) {
+                NodeState child = state.getNodes().get(entry.getKey());
+                if (child == null) {
+                    
+                }
+              
+            }
+        }
+        return this;
+    }
+
+    public Map<String, String> getProperties() {
+        Map<String, String> result = base.getProperties();
+        if (!properties.isEmpty()) {
+            result = new HashMap<String, String>(result);
+            for (Map.Entry<String, String> entry : properties.entrySet()) {
+                if (entry.getValue() != null) {
+                    result.put(entry.getKey(), entry.getValue());
+                } else {
+                    result.remove(entry.getKey());
+                }
+            }
+        }
+        return result;
+    }
+
+    public Map<String, NodeState> getNodes() {
+        Map<String, NodeState> result = base.getNodes();
+        if (!nodes.isEmpty()) {
+            result = new HashMap<String, NodeState>(result);
+            for (Map.Entry<String, NodeState> entry : nodes.entrySet()) {
+                if (entry.getValue() != null) {
+                    result.put(entry.getKey(), entry.getValue());
+                } else {
+                    result.remove(entry.getKey());
+                }
+            }
+        }
+        return result;
+    }
+
+    //------------------------------------------------< TransientNodeState >--
+
+    public PersistentNodeState getBase() {
+        return base;
+    }
+
+    public void setProperty(String name, String value) {
+        if (value != null || base.getProperties().containsKey(name)) {
+            properties.put(name, value);
+        } else {
+            properties.remove(value);
+        }
+    }
+
+    public void setNode(String name, NodeState value) {
+        if (value != null || base.getNodes().containsKey(name)) {
+            nodes.put(name, value);
+        } else {
+            nodes.remove(value);
+        }
+    }
+
+}

Modified: jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/AbstractRepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/AbstractRepositoryTest.java?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/AbstractRepositoryTest.java (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/AbstractRepositoryTest.java Mon May 19 01:43:27 2008
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.ngp;
 
-import java.io.File;
-
 import javax.jcr.Repository;
 
 import org.junit.After;
@@ -25,32 +23,15 @@
 
 public class AbstractRepositoryTest {
 
-    private File directory;
-
     protected Repository repository;
 
     @Before
     public void setUp() throws Exception {
-        directory = File.createTempFile("jackrabbit-ngp", "test");
-        directory.delete();
-        directory.mkdir();
-
-        repository = new RepositoryImpl(directory);
+        repository = new RepositoryImpl();
     }
 
     @After
     public void tearDown() {
-        delete(directory);
-    }
-
-    private void delete(File file) {
-        File[] children = file.listFiles();
-        if (children != null) {
-            for (File child : children) {
-                delete(child);
-            }
-        }
-        file.delete();
     }
 
 }

Added: jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/JCRAPITest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/JCRAPITest.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/JCRAPITest.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/JCRAPITest.java Mon May 19 01:43:27 2008
@@ -0,0 +1,32 @@
+/*
+ * 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.ngp;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import org.apache.jackrabbit.test.JCRTestSuite;
+
+/**
+ * Test suite that includes all test suites from jackrabbit-jcr-tests.
+ */
+public class JCRAPITest extends TestCase {
+
+    public static Test suite() {
+        return new JCRTestSuite();
+    }
+
+}

Modified: jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/NodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/NodeTest.java?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/NodeTest.java (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/NodeTest.java Mon May 19 01:43:27 2008
@@ -67,6 +67,8 @@
             fail("Root node has a parent");
         } catch (ItemNotFoundException expected) {
         }
+
+        assertEquals(1, root.getNodes().getSize());
     }
 
 }

Added: jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryStubImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryStubImpl.java?rev=657756&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryStubImpl.java (added)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryStubImpl.java Mon May 19 01:43:27 2008
@@ -0,0 +1,193 @@
+/*
+ * 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.ngp;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Properties;
+
+import javax.jcr.LoginException;
+import javax.jcr.Node;
+import javax.jcr.PropertyType;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+
+import org.apache.jackrabbit.test.RepositoryStub;
+import org.apache.jackrabbit.test.RepositoryStubException;
+
+public class RepositoryStubImpl extends RepositoryStub {
+
+    private final Repository repository = new RepositoryImpl();
+
+    public RepositoryStubImpl(Properties env) throws RepositoryException {
+        super(env);
+
+        Session session = repository.login();
+        try {
+            Node data = session.getRootNode().addNode("testdata");
+            addPropertyTestData(data.addNode("property"));
+            addQueryTestData(data.addNode("query"));
+            addNodeTestData(data.addNode("node"));
+            addExportTestData(data.addNode("docViewTest"));
+            session.save();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            session.logout();
+        }
+    }
+
+    /**
+     * Creates a test node at {@link #TEST_DATA_PATH} with a boolean,
+     * double, long, calendar and a path property.
+     */
+    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));
+        // TODO: node.setProperty("multi", new String[] { "one", "two", "three" });
+    }
+
+    /**
+     * Creates four nodes under the given node. Each node has a String
+     * property named "prop1" with some content set.
+     */
+    private void addQueryTestData(Node node) throws RepositoryException {
+        Node node1 = node.addNode("node1");
+        node1.setProperty(
+                "prop1", "You can have it good, cheap, or fast. Any two.");
+        node1.setProperty("prop1", "foo bar");
+        node1.setProperty("prop1", "Hello world!");
+
+        node.addNode("node2").setProperty("prop1", "Apache Jackrabbit");
+    }
+
+
+    /**
+     * Creates three nodes under the given node: one of type nt:resource
+     * and the other nodes referencing it.
+     */
+    private void addNodeTestData(Node node) throws RepositoryException, IOException {
+        Node resource = node.addNode("myResource", "nt:resource");
+        resource.setProperty("jcr:encoding", "UTF-8");
+        resource.setProperty("jcr:mimeType", "text/plain");
+        resource.setProperty(
+                "jcr:data",
+                new ByteArrayInputStream("Hello w\u00F6rld.".getBytes("UTF-8")));
+        resource.setProperty("jcr:lastModified", Calendar.getInstance());
+
+        Node resReference = node.addNode("reference");
+        // TODO: resReference.setProperty("ref", resource);
+        // make this node itself referenceable
+        // TODO: resReference.addMixin("mix:referenceable");
+
+        Node multiReference = node.addNode("multiReference");
+        ValueFactory factory = node.getSession().getValueFactory();
+        // TODO: multiReference.setProperty("ref", new Value[] {
+        //        factory.createValue(resource),
+        //        factory.createValue(resReference)
+        // });
+    }
+
+    private void addExportTestData(Node node) throws RepositoryException, IOException {
+        node.addNode("invalidXmlName").setProperty("propName", "some text");
+
+        // three nodes which should be serialized as xml text in docView export
+        // separated with spaces
+        /* TODO:
+        node.addNode("jcr:xmltext").setProperty(
+                "jcr:xmlcharacters", "A text without any special character.");
+        node.addNode("some-element");
+        node.addNode("jcr:xmltext").setProperty(
+                "jcr:xmlcharacters",
+                " The entity reference characters: <, ', ,&, >,  \" should"
+                + " be escaped in xml export. ");
+        node.addNode("some-element");
+        node.addNode("jcr:xmltext").setProperty(
+                "jcr:xmlcharacters", "A text without any special character.");
+        */
+
+        Node big = node.addNode("bigNode");
+        // TODO: big.setProperty(
+        //         "propName0",
+        //         "SGVsbG8gd8O2cmxkLg==;SGVsbG8gd8O2cmxkLg==".split(";"),
+        //         PropertyType.BINARY);
+        big.setProperty("propName1", "text 1");
+        // TODO: big.setProperty(
+        //         "propName2",
+        //         "multival text 1;multival text 2;multival text 3".split(";"));
+        big.setProperty("propName3", "text 1");
+
+        addExportValues(node, "propName");
+        addExportValues(node, "Prop<>prop");
+    }
+
+    /**
+     * create nodes with following properties
+     * binary & single
+     * binary & multival
+     * notbinary & single
+     * notbinary & multival
+     */
+    private void addExportValues(Node node, String name)
+            throws RepositoryException, IOException {
+        String prefix = "valid";
+        if (name.indexOf('<') != -1) {
+            prefix = "invalid";
+        }
+        node = node.addNode(prefix + "Names");
+
+        /* TODO:
+        String[] texts = new String[] {
+                "multival text 1", "multival text 2", "multival text 3" };
+        node.addNode(prefix + "MultiNoBin").setProperty(name, texts);
+        */
+
+        /* TODO:
+        Node resource = node.addNode(prefix + "MultiBin");
+        resource.setProperty("jcr:encoding", "UTF-8");
+        resource.setProperty("jcr:mimeType", "text/plain");
+        String[] values =
+            new String[] { "SGVsbG8gd8O2cmxkLg==", "SGVsbG8gd8O2cmxkLg==" };
+        resource.setProperty(name, values, PropertyType.BINARY);
+        resource.setProperty("jcr:lastModified", Calendar.getInstance());
+        */
+
+        node.addNode(prefix + "NoBin").setProperty(name,  "text 1");
+
+        Node resource = node.addNode("invalidBin");
+        resource.setProperty("jcr:encoding", "UTF-8");
+        resource.setProperty("jcr:mimeType", "text/plain");
+        byte[] bytes = "Hello w\u00F6rld.".getBytes("UTF-8");
+        resource.setProperty(name, new ByteArrayInputStream(bytes));
+        resource.setProperty("jcr:lastModified", Calendar.getInstance());
+    }
+
+    public Repository getRepository() throws RepositoryStubException {
+        return repository;
+    }
+
+}

Modified: jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryTest.java?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryTest.java (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/RepositoryTest.java Mon May 19 01:43:27 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/SessionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/SessionTest.java?rev=657756&r1=657755&r2=657756&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/SessionTest.java (original)
+++ jackrabbit/sandbox/jackrabbit-ngp/src/test/java/org/apache/jackrabbit/ngp/SessionTest.java Mon May 19 01:43:27 2008
@@ -67,6 +67,8 @@
             fail("Root node has a parent");
         } catch (ItemNotFoundException expected) {
         }
+
+        assertEquals(0, root.getNodes().getSize());
     }
 
 }