Author: cziegeler
Date: Wed Apr 17 07:39:28 2013
New Revision: 1468784
URL: http://svn.apache.org/r1468784
Log:
Add new testing module for easy mocking of a resource resolver
Added:
sling/trunk/testing/resourceresolver-mock/ (with props)
sling/trunk/testing/resourceresolver-mock/pom.xml (with props)
sling/trunk/testing/resourceresolver-mock/src/
sling/trunk/testing/resourceresolver-mock/src/main/
sling/trunk/testing/resourceresolver-mock/src/main/java/
sling/trunk/testing/resourceresolver-mock/src/main/java/org/
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResource.java
(with props)
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
(with props)
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolverFactory.java
(with props)
Modified:
sling/trunk/pom.xml
Modified: sling/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/pom.xml?rev=1468784&r1=1468783&r2=1468784&view=diff
==============================================================================
--- sling/trunk/pom.xml (original)
+++ sling/trunk/pom.xml Wed Apr 17 07:39:28 2013
@@ -182,6 +182,7 @@
<module>testing/junit/core</module>
<module>testing/junit/scriptable</module>
<module>testing/junit/remote</module>
+ <module>testing/resourceresolver-mock</module>
<!-- Installer -->
<module>installer/api</module>
Propchange: sling/trunk/testing/resourceresolver-mock/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Apr 17 07:39:28 2013
@@ -0,0 +1,10 @@
+target
+bin
+*.iml
+*.ipr
+*.iws
+.settings
+.project
+.classpath
+.externalToolBuilders
+maven-eclipse.xml
Added: sling/trunk/testing/resourceresolver-mock/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/testing/resourceresolver-mock/pom.xml?rev=1468784&view=auto
==============================================================================
--- sling/trunk/testing/resourceresolver-mock/pom.xml (added)
+++ sling/trunk/testing/resourceresolver-mock/pom.xml Wed Apr 17 07:39:28 2013
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>sling</artifactId>
+ <version>15</version>
+ <relativePath>../../parent/pom.xml</relativePath>
+ </parent>
+
+ <artifactId>org.apache.sling.testing.resourceresolver-mock</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+
+ <name>Apache Sling Testing Resource Resolver Mock</name>
+ <description>
+ Mock for the resource resolver / factory for easier testing.
+ </description>
+
+ <scm>
+
<connection>scm:svn:http://svn.apache.org/repos/asf/sling/trunk/testing/resourceresolver-mock</connection>
+
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/testing/resourceresolver-mock</developerConnection>
+
<url>http://svn.apache.org/viewvc/sling/trunk/testing/resourceresolver-mock</url>
+ </scm>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <excludePackageNames>
+ org.apache.sling.testing.resourceresolver
+ </excludePackageNames>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.api</artifactId>
+ <version>2.4.1-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>4.3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+ </dependencies>
+</project>
Propchange: sling/trunk/testing/resourceresolver-mock/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/testing/resourceresolver-mock/pom.xml
------------------------------------------------------------------------------
svn:keywords = Id
Added:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResource.java
URL:
http://svn.apache.org/viewvc/sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResource.java?rev=1468784&view=auto
==============================================================================
---
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResource.java
(added)
+++
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResource.java
Wed Apr 17 07:39:28 2013
@@ -0,0 +1,90 @@
+/*
+ * 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.sling.testing.resourceresolver;
+
+import java.util.Map;
+
+import org.apache.sling.api.resource.AbstractResource;
+import org.apache.sling.api.resource.ModifiableValueMap;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.wrappers.ModifiableValueMapDecorator;
+import org.apache.sling.api.wrappers.ValueMapDecorator;
+
+public class MockResource extends AbstractResource {
+
+ private final String path;
+
+ private final Map<String, Object> props;
+
+ private final ResourceMetadata rm = new ResourceMetadata();
+
+ private final ResourceResolver resolver;
+
+ public MockResource(final String path,
+ final Map<String, Object> props,
+ final ResourceResolver resolver) {
+ this.path = path;
+ this.props = props;
+ this.resolver = resolver;
+ }
+
+ @Override
+ public String getPath() {
+ return this.path;
+ }
+
+ @Override
+ public String getResourceType() {
+ return (String)this.props.get(ResourceResolver.PROPERTY_RESOURCE_TYPE);
+ }
+
+ @Override
+ public String getResourceSuperType() {
+ return (String)this.props.get("sling:resourceSuperType");
+ }
+
+ @Override
+ public ResourceMetadata getResourceMetadata() {
+ return rm;
+ }
+
+ @Override
+ public ResourceResolver getResourceResolver() {
+ return this.resolver;
+ }
+
+ @Override
+ public <AdapterType> AdapterType adaptTo(final Class<AdapterType> type) {
+ if ( type == ValueMap.class ) {
+ return (AdapterType)new ValueMapDecorator(this.props);
+ } else if ( type == ModifiableValueMap.class ) {
+ ((MockResourceResolver)this.resolver).addChanged(this.path,
this.props);
+ return (AdapterType)new ModifiableValueMapDecorator(this.props);
+ }
+ return super.adaptTo(type);
+ }
+
+ @Override
+ public String toString() {
+ return "MockResource [path=" + path + ", props=" + props + "]";
+ }
+
+}
Propchange:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResource.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Added:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
URL:
http://svn.apache.org/viewvc/sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java?rev=1468784&view=auto
==============================================================================
---
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
(added)
+++
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
Wed Apr 17 07:39:28 2013
@@ -0,0 +1,325 @@
+/*
+ * 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.sling.testing.resourceresolver;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.sling.api.SlingConstants;
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+public class MockResourceResolver implements ResourceResolver {
+
+ private final Map<String, Map<String, Object>> resources;
+
+ private final Map<String, Map<String, Object>> temporaryResources = new
HashMap<String, Map<String,Object>>();
+
+ private final Set<String> deletedResources = new HashSet<String>();
+
+ private final EventAdmin eventAdmin;
+
+ public MockResourceResolver(final EventAdmin eventAdmin,
+ final Map<String, Map<String, Object>> resources) {
+ this.eventAdmin = eventAdmin;
+ this.resources = resources;
+ }
+
+ @Override
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+ return null;
+ }
+
+ @Override
+ public Resource resolve(final HttpServletRequest request, final String
absPath) {
+ return this.getResource(absPath);
+ }
+
+ @Override
+ public Resource resolve(final String absPath) {
+ return this.getResource(absPath);
+ }
+
+ @Override
+ @Deprecated
+ public Resource resolve(final HttpServletRequest request) {
+ return null;
+ }
+
+ @Override
+ public String map(final String resourcePath) {
+ return resourcePath;
+ }
+
+ @Override
+ public String map(final HttpServletRequest request, final String
resourcePath) {
+ return resourcePath;
+ }
+
+ @Override
+ public Resource getResource(final String path) {
+ if ( path.startsWith("/") ) {
+ if ( this.deletedResources.contains(path) ) {
+ return null;
+ }
+ final Map<String, Object> tempProps =
this.temporaryResources.get(path);
+ if ( tempProps != null ) {
+ final Resource rsrc = new MockResource(path, tempProps, this);
+ return rsrc;
+ }
+ synchronized ( this.resources ) {
+ final Map<String, Object> props = this.resources.get(path);
+ if ( props != null ) {
+ final Resource rsrc = new MockResource(path, props, this);
+ return rsrc;
+ }
+ }
+ } else {
+ for(final String s : this.getSearchPath() ) {
+ final Resource rsrc = this.getResource(s + '/' + path);
+ if ( rsrc != null ) {
+ return rsrc;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Resource getResource(Resource base, String path) {
+ if ( path == null || path.length() == 0 ) {
+ path = "/";
+ }
+ if ( path.startsWith("/") ) {
+ return getResource(path);
+ }
+ if ( base.getPath().equals("/") ) {
+ return getResource(base.getPath() + path);
+ }
+ return getResource(base.getPath() + '/' + path);
+ }
+
+ @Override
+ public String[] getSearchPath() {
+ return new String[] {"/libs", "/apps"};
+ }
+
+ @Override
+ public Iterator<Resource> listChildren(final Resource parent) {
+ final String prefixPath = parent.getPath() + "/";
+ final Map<String, Map<String, Object>> candidates = new
HashMap<String, Map<String,Object>>();
+ synchronized ( this.resources ) {
+ for(final Map.Entry<String, Map<String, Object>> e :
this.resources.entrySet()) {
+ if (e.getKey().startsWith(prefixPath) &&
e.getKey().lastIndexOf('/') < prefixPath.length() ) {
+ if ( !this.deletedResources.contains(e.getKey()) ) {
+ candidates.put(e.getKey(), e.getValue());
+ }
+ }
+ }
+ for(final Map.Entry<String, Map<String, Object>> e :
this.temporaryResources.entrySet()) {
+ if (e.getKey().startsWith(prefixPath) &&
e.getKey().lastIndexOf('/') < prefixPath.length() ) {
+ if ( !this.deletedResources.contains(e.getKey()) ) {
+ candidates.put(e.getKey(), e.getValue());
+ }
+ }
+ }
+ }
+ final List<Resource> children = new ArrayList<Resource>();
+ for(final Map.Entry<String, Map<String, Object>> e :
candidates.entrySet()) {
+ children.add(new MockResource(e.getKey(), e.getValue(), this));
+ }
+ return children.iterator();
+ }
+
+ @Override
+ public Iterable<Resource> getChildren(final Resource parent) {
+ return new Iterable<Resource>() {
+
+ @Override
+ public Iterator<Resource> iterator() {
+ return listChildren(parent);
+ }
+ };
+ }
+
+ @Override
+ public Iterator<Resource> findResources(final String query, final String
language) {
+ final List<Resource> emptyList = Collections.emptyList();
+ return emptyList.iterator();
+ }
+
+ @Override
+ public Iterator<Map<String, Object>> queryResources(String query,
+ String language) {
+ final List<Map<String, Object>> emptyList = Collections.emptyList();
+ return emptyList.iterator();
+ }
+
+ @Override
+ public ResourceResolver clone(Map<String, Object> authenticationInfo)
+ throws LoginException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isLive() {
+ return true;
+ }
+
+ @Override
+ public void close() {
+ // nothing to do
+ }
+
+ @Override
+ public String getUserID() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Iterator<String> getAttributeNames() {
+ final List<String> emptyList = Collections.emptyList();
+ return emptyList.iterator();
+ }
+
+ @Override
+ public Object getAttribute(final String name) {
+ return null;
+ }
+
+ @Override
+ public void delete(final Resource resource) throws PersistenceException {
+ this.deletedResources.add(resource.getPath());
+ this.temporaryResources.remove(resource.getPath());
+ final String prefixPath = resource.getPath() + '/';
+ synchronized ( this.resources ) {
+ for(final Map.Entry<String, Map<String, Object>> e :
this.resources.entrySet()) {
+ if (e.getKey().startsWith(prefixPath)) {
+ this.deletedResources.add(e.getKey());
+ }
+ }
+ final Iterator<Map.Entry<String, Map<String, Object>>> i =
this.temporaryResources.entrySet().iterator();
+ while ( i.hasNext() ) {
+ final Map.Entry<String, Map<String, Object>> e = i.next();
+ if (e.getKey().startsWith(prefixPath) ) {
+ i.remove();
+ }
+ }
+ }
+ }
+
+ @Override
+ public Resource create(Resource parent, String name,
+ Map<String, Object> properties) throws PersistenceException {
+ final String path = (parent.getPath().equals("/") ? parent.getPath() +
name : parent.getPath() + '/' + name);
+ if ( this.temporaryResources.containsKey(path) ) {
+ throw new PersistenceException("Path already exists: " + path);
+ }
+ synchronized ( this.resources ) {
+ if ( this.resources.containsKey(path) ) {
+ throw new PersistenceException("Path already exists: " + path);
+ }
+ }
+ this.deletedResources.remove(path);
+ if ( properties == null ) {
+ properties = new HashMap<String, Object>();
+ }
+ this.temporaryResources.put(path, properties);
+
+ return new MockResource(path, properties, this);
+ }
+
+ @Override
+ public void revert() {
+ this.deletedResources.clear();
+ this.temporaryResources.clear();
+ }
+
+ @Override
+ public void commit() throws PersistenceException {
+ synchronized ( this.resources ) {
+ for(final String path : this.deletedResources ) {
+ if ( this.resources.remove(path) != null && this.eventAdmin !=
null ) {
+ final Map<String, Object> props = new HashMap<String,
Object>();
+ props.put(SlingConstants.PROPERTY_PATH, path);
+ final Event e = new
Event(SlingConstants.TOPIC_RESOURCE_REMOVED, props);
+ this.eventAdmin.sendEvent(e);
+ }
+ this.temporaryResources.remove(path);
+ }
+ for(final String path : this.temporaryResources.keySet() ) {
+ final boolean changed = this.resources.containsKey(path);
+ this.resources.put(path, this.temporaryResources.get(path));
+ if ( this.eventAdmin != null ) {
+ final Map<String, Object> props = new HashMap<String,
Object>();
+ props.put(SlingConstants.PROPERTY_PATH, path);
+ if (
this.resources.get(path).get(ResourceResolver.PROPERTY_RESOURCE_TYPE) != null )
{
+ props.put(SlingConstants.PROPERTY_RESOURCE_TYPE,
this.resources.get(path).get(ResourceResolver.PROPERTY_RESOURCE_TYPE));
+ }
+ final Event e = new Event(changed ?
SlingConstants.TOPIC_RESOURCE_CHANGED : SlingConstants.TOPIC_RESOURCE_ADDED,
props);
+ this.eventAdmin.sendEvent(e);
+ }
+ }
+ }
+ this.revert();
+ }
+
+ @Override
+ public boolean hasChanges() {
+ return this.temporaryResources.size() > 0 ||
this.deletedResources.size() > 0;
+ }
+
+ @Override
+ public String getParentResourceType(Resource resource) {
+ return null;
+ }
+
+ @Override
+ public String getParentResourceType(String resourceType) {
+ return null;
+ }
+
+ @Override
+ public boolean isResourceType(Resource resource, String resourceType) {
+ return resource.getResourceType().equals(resourceType);
+ }
+
+ @Override
+ public void refresh() {
+ // nothing to do
+ }
+
+ public void addChanged(final String path, final Map<String, Object> props)
{
+ this.temporaryResources.put(path, props);
+ }
+}
Propchange:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Added:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolverFactory.java
URL:
http://svn.apache.org/viewvc/sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolverFactory.java?rev=1468784&view=auto
==============================================================================
---
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolverFactory.java
(added)
+++
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolverFactory.java
Wed Apr 17 07:39:28 2013
@@ -0,0 +1,56 @@
+/*
+ * 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.sling.testing.resourceresolver;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.osgi.service.event.EventAdmin;
+
+public class MockResourceResolverFactory implements ResourceResolverFactory {
+
+ private final Map<String, Map<String, Object>> resources = new
HashMap<String, Map<String, Object>>();
+
+ private final EventAdmin eventAdmin;
+
+ public MockResourceResolverFactory(final EventAdmin eventAdmin) {
+ this.eventAdmin = eventAdmin;
+ resources.put("/", new HashMap<String, Object>());
+ }
+
+ public MockResourceResolverFactory() {
+ this(null);
+ }
+
+ @Override
+ public ResourceResolver getResourceResolver(
+ final Map<String, Object> authenticationInfo) throws
LoginException {
+ return new MockResourceResolver(this.eventAdmin, resources);
+ }
+
+ @Override
+ public ResourceResolver getAdministrativeResourceResolver(
+ final Map<String, Object> authenticationInfo) throws
LoginException {
+ return new MockResourceResolver(this.eventAdmin, resources);
+ }
+
+}
Propchange:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolverFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/trunk/testing/resourceresolver-mock/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolverFactory.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url