Merge branch 'master' into feature/update-to-parent40
diff --git a/pom.xml b/pom.xml
index ca7f3ac..ef4c393 100644
--- a/pom.xml
+++ b/pom.xml
@@ -194,18 +194,18 @@
 
         <!-- Testing -->
         <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.testing</artifactId>
-            <version>2.0.24</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <version>1.9.5</version>
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <version>2.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.testing.sling-mock.junit4</artifactId>
             <version>2.6.2</version>
@@ -222,6 +222,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-junit4</artifactId>
+            <version>2.12.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>junit-addons</groupId>
             <artifactId>junit-addons</artifactId>
             <version>1.4</version>
@@ -233,6 +239,11 @@
             <version>2.1.10-1.16.0</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
 
diff --git a/src/main/java/org/apache/sling/jcr/resource/internal/JcrModifiableValueMap.java b/src/main/java/org/apache/sling/jcr/resource/internal/JcrModifiableValueMap.java
index a6d3734..37467ab 100644
--- a/src/main/java/org/apache/sling/jcr/resource/internal/JcrModifiableValueMap.java
+++ b/src/main/java/org/apache/sling/jcr/resource/internal/JcrModifiableValueMap.java
@@ -455,13 +455,21 @@
                 node.setProperty(name, entry.convertToType(Value.class, node, this.helper.getDynamicClassLoader()));
             }
         } catch (final RepositoryException re) {
-            throw new IllegalArgumentException("Value for key " + key + " can't be put into node: " + value, re);
+            throw new IllegalArgumentException("Value '"+ value + "' for property '" + key + "' can't be put into node '" + getNodePath(node) + "'.", re);
         }
         this.valueCache.put(key, value);
 
         return oldValue;
     }
 
+    static String getNodePath(Node node) {
+        try {
+            return node.getPath();
+        } catch (RepositoryException e) {
+            return "Could not get node path: "+ e.getMessage();
+        }
+    }
+
     /**
      * @see java.util.Map#putAll(java.util.Map)
      */
@@ -492,7 +500,7 @@
                 node.getProperty(name).remove();
             }
         } catch (final RepositoryException re) {
-            throw new IllegalArgumentException("Value for key " + key + " can't be removed from node.", re);
+            throw new IllegalArgumentException("Property '" + key + "' can't be removed from node '" + getNodePath(node) + "'.", re);
         }
 
         return oldValue;
diff --git a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
index aff00e2..eb31c37 100644
--- a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
+++ b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
@@ -97,7 +97,7 @@
             final Bundle bundle = extractCallingBundle(authenticationInfo);
             if (bundle != null) {
                 bc = bundle.getBundleContext();
-                final SlingRepository repo = bc.getService(repositoryReference);
+                final SlingRepository repo = bc == null ? null : bc.getService(repositoryReference);
                 if (repo == null) {
                     logger.warn("Cannot login {} because cannot get SlingRepository on behalf of bundle {} ({})",
                             isLoginAdministrative ? "admin" : "service",
diff --git a/src/test/java/org/apache/sling/jcr/resource/internal/helper/JcrNodeResourceIteratorTest.java b/src/test/java/org/apache/sling/jcr/resource/internal/helper/JcrNodeResourceIteratorTest.java
index 700d47a..1e93ed8 100644
--- a/src/test/java/org/apache/sling/jcr/resource/internal/helper/JcrNodeResourceIteratorTest.java
+++ b/src/test/java/org/apache/sling/jcr/resource/internal/helper/JcrNodeResourceIteratorTest.java
@@ -18,20 +18,24 @@
  */
 package org.apache.sling.jcr.resource.internal.helper;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.external.URIProvider;
 import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
-import org.apache.sling.commons.testing.jcr.MockNode;
-import org.apache.sling.commons.testing.jcr.MockNodeIterator;
 import org.apache.sling.jcr.resource.internal.HelperData;
 import org.apache.sling.jcr.resource.internal.helper.jcr.JcrNodeResourceIterator;
+import org.apache.sling.testing.mock.jcr.MockJcr;
 
 import junit.framework.TestCase;
 
@@ -42,7 +46,8 @@
     }
 
     public void testEmpty() {
-        NodeIterator ni = new MockNodeIterator(null);
+        NodeIterator ni = new NodeIteratorAdapter(Collections.emptyIterator());
+
         JcrNodeResourceIterator ri = new JcrNodeResourceIterator(null, null, null, ni, getHelperData(), null);
 
         assertFalse(ri.hasNext());
@@ -57,8 +62,9 @@
 
     public void testSingle() throws RepositoryException {
         String path = "/parent/path/node";
-        Node node = new MockNode(path);
-        NodeIterator ni = new MockNodeIterator(new Node[] { node });
+        Session session = MockJcr.newSession();
+        Node node = JcrUtils.getOrCreateByPath(path, "nt:folder", session);
+        NodeIterator ni = new NodeIteratorAdapter(Collections.singleton(node));
         JcrNodeResourceIterator ri = new JcrNodeResourceIterator(null, null, null, ni, getHelperData(), null);
 
         assertTrue(ri.hasNext());
@@ -79,11 +85,12 @@
     public void testMulti() throws RepositoryException {
         int numNodes = 10;
         String pathBase = "/parent/path/node/";
+        Session session = MockJcr.newSession();
         Node[] nodes = new Node[numNodes];
         for (int i=0; i < nodes.length; i++) {
-            nodes[i] = new MockNode(pathBase + i, "some:type" + i);
+            nodes[i] = JcrUtils.getOrCreateByPath(pathBase + i, "nt:folder", session);
         }
-        NodeIterator ni = new MockNodeIterator(nodes);
+        NodeIterator ni = new NodeIteratorAdapter(Arrays.asList(nodes));
         JcrNodeResourceIterator ri = new JcrNodeResourceIterator(null, null, null, ni, getHelperData(), null);
 
         for (int i=0; i < nodes.length; i++) {
@@ -105,8 +112,9 @@
 
     public void testRoot() throws RepositoryException {
         String path = "/child";
-        Node node = new MockNode(path);
-        NodeIterator ni = new MockNodeIterator(new Node[] { node });
+        Session session = MockJcr.newSession();
+        Node node = session.getRootNode().addNode("child");
+        NodeIterator ni = new NodeIteratorAdapter(Collections.singleton(node));
         JcrNodeResourceIterator ri = new JcrNodeResourceIterator(null, "/", null, ni, getHelperData(), null);
 
         assertTrue(ri.hasNext());