You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2015/05/15 18:40:22 UTC
svn commit: r1679602 - in
/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic: ./
src/main/java/org/apache/sling/nosql/generic/adapter/
src/main/java/org/apache/sling/nosql/generic/impl/
src/main/java/org/apache/sling/nosql/generic/resource/ src/...
Author: sseifert
Date: Fri May 15 16:40:21 2015
New Revision: 1679602
URL: http://svn.apache.org/r1679602
Log:
new approach
Added:
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java (with props)
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml (with props)
Removed:
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/impl/
Modified:
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml
Modified: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml?rev=1679602&r1=1679601&r2=1679602&view=diff
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml (original)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml Fri May 15 16:40:21 2015
@@ -55,32 +55,55 @@
<dependencies>
<dependency>
- <groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.api</artifactId>
- <version>2.7.0</version>
- <scope>provided</scope>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.api</artifactId>
+ <version>2.9.0</version>
+ <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.osgi</artifactId>
- <version>2.1.0</version>
+ <version>2.2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.scr.annotations</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr.annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.testing.sling-mock</artifactId>
+ <version>1.2.0</version>
</dependency>
+
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>1.10.19</version>
+ <scope>test</scope>
</dependency>
+
</dependencies>
+
</project>
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java Fri May 15 16:40:21 2015
@@ -0,0 +1,64 @@
+/*
+ * 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.nosql.generic.adapter;
+
+import java.util.Iterator;
+
+/**
+ * Adapter for NoSQL databases to be hooked into the Generic NoSQL resource provider.
+ */
+public interface NoSqlAdapter {
+
+ /**
+ * Get data for a single resource from NoSQL database.
+ * @param path Path
+ * @return Data or null if non exists
+ */
+ NoSqlData get(String path);
+
+ /**
+ * Get data for all children of a resource from NoSQL database.
+ * @param parentPath Parent path
+ * @return List if child data or empty iterator
+ */
+ Iterator<NoSqlData> getChildren(String parentPath);
+
+ /**
+ * Store data with the given path in NoSQL database.
+ * @param data Data with path
+ * @return true if a new entry was created, false if an existing was overridden.
+ */
+ boolean store(NoSqlData data);
+
+ /**
+ * Remove data including all path-related children from NoSQL database.
+ * @param path Path to remove
+ * @return true if anything was removed
+ */
+ boolean deleteRecursive(String path);
+
+ /**
+ * Query for data.
+ * @param query Query
+ * @param language Query language
+ * @return Query result or null if query not supported
+ */
+ Iterator<NoSqlData> query(String query, String language);
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlAdapter.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java Fri May 15 16:40:21 2015
@@ -0,0 +1,41 @@
+/*
+ * 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.nosql.generic.adapter;
+
+import java.util.Map;
+
+public final class NoSqlData {
+
+ private final String path;
+ private final Map<String,Object> properties;
+
+ public NoSqlData(String path, Map<String, Object> properties) {
+ this.path = path;
+ this.properties = properties;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java Fri May 15 16:40:21 2015
@@ -0,0 +1,44 @@
+/*
+ * 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.nosql.generic.resource;
+
+import java.util.Map;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceProviderFactory;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.resource.impl.NoSqlResourceProvider;
+import org.osgi.service.event.EventAdmin;
+
+public abstract class AbstractNoSqlResourceProviderFactory implements ResourceProviderFactory {
+
+ public final ResourceProvider getResourceProvider(Map<String, Object> authenticationInfo) throws LoginException {
+ return new NoSqlResourceProvider(getNoSqlAdapter(), getEventAdmin());
+ }
+
+ public final ResourceProvider getAdministrativeResourceProvider(Map<String, Object> authenticationInfo) throws LoginException {
+ return getResourceProvider(authenticationInfo);
+ }
+
+ protected abstract NoSqlAdapter getNoSqlAdapter();
+
+ protected abstract EventAdmin getEventAdmin();
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/AbstractNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,147 @@
+/*
+ * 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.nosql.generic.resource.impl;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.apache.sling.api.SlingConstants;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+class NoSqlModifyingResourceProvider {
+
+ private final NoSqlAdapter adapter;
+ private final EventAdmin eventAdmin;
+ private final Map<String, NoSqlData> changedResources;
+ private final Set<String> deletedResources;
+
+ public NoSqlModifyingResourceProvider(NoSqlAdapter adapter, EventAdmin eventAdmin,
+ Map<String, NoSqlData> changedResources, Set<String> deletedResources) {
+ this.adapter = adapter;
+ this.eventAdmin = eventAdmin;
+ this.changedResources = changedResources;
+ this.deletedResources = deletedResources;
+ }
+
+ public Resource create(ResourceResolver resolver, String path, Map<String, Object> properties)
+ throws PersistenceException {
+
+ // check if already exists
+ boolean deleted = this.deletedResources.remove(path);
+ boolean exists = changedResources.containsKey(path) || this.adapter.get(path) != null;
+ if (!deleted && exists) {
+ throw new PersistenceException("Resource already exists at " + path, null, path, null);
+ }
+
+ // create new resource in changeset
+ NoSqlData data = new NoSqlData(path, properties);
+ changedResources.put(path, data);
+ return new NoSqlResource(data, resolver);
+ }
+
+ public void delete(ResourceResolver resolver, String path) throws PersistenceException {
+ Pattern pathsToDeletePattern = PathUtil.getSameOrDescendantPathPattern(path);
+
+ // remove all existing path and probably descendant paths from list of deleted paths
+ Iterator<String> deletedResourcesIterator = deletedResources.iterator();
+ while (deletedResourcesIterator.hasNext()) {
+ String deletedPath = deletedResourcesIterator.next();
+ if (pathsToDeletePattern.matcher(deletedPath).matches()) {
+ deletedResourcesIterator.remove();
+ }
+ }
+
+ // remove all changed descendant items from changeset
+ Iterator<Map.Entry<String, NoSqlData>> changeResourcesIterator = changedResources.entrySet().iterator();
+ while (changeResourcesIterator.hasNext()) {
+ Map.Entry<String, NoSqlData> entry = changeResourcesIterator.next();
+ if (pathsToDeletePattern.matcher(entry.getKey()).matches()) {
+ changeResourcesIterator.remove();
+ }
+ }
+
+ // add path to delete
+ deletedResources.add(path);
+ }
+
+ public void revert(ResourceResolver resolver) {
+ changedResources.clear();
+ deletedResources.clear();
+ }
+
+ public void commit(ResourceResolver resolver) throws PersistenceException {
+ try {
+ for (String path : deletedResources) {
+ adapter.deleteRecursive(path);
+ notifyRemoved(path);
+ }
+ for (NoSqlData item : changedResources.values()) {
+ boolean created = adapter.store(item);
+ if (created) {
+ notifyAdded(item.getPath());
+ }
+ else {
+ notifyUpdated(item.getPath());
+ }
+ }
+ }
+ finally {
+ this.revert(resolver);
+ }
+ }
+
+ public boolean hasChanges(ResourceResolver resolver) {
+ return !(changedResources.isEmpty() && deletedResources.isEmpty());
+ }
+
+ private void notifyAdded(String path) {
+ final Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(SlingConstants.PROPERTY_PATH, path);
+ props.put("event.distribute", "");
+ final Event event = new Event(SlingConstants.TOPIC_RESOURCE_ADDED, props);
+ this.eventAdmin.postEvent(event);
+ }
+
+ private void notifyUpdated(String path) {
+ final Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(SlingConstants.PROPERTY_PATH, path);
+ props.put("event.distribute", "");
+ final Event event = new Event(SlingConstants.TOPIC_RESOURCE_CHANGED, props);
+ this.eventAdmin.postEvent(event);
+ }
+
+ private void notifyRemoved(String path) {
+ final Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(SlingConstants.PROPERTY_PATH, path);
+ props.put("event.distribute", "");
+ final Event event = new Event(SlingConstants.TOPIC_RESOURCE_REMOVED, props);
+ this.eventAdmin.postEvent(event);
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlModifyingResourceProvider.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,73 @@
+/*
+ * 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.nosql.generic.resource.impl;
+
+import java.util.Iterator;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+
+class NoSqlQueriableResourceProvider {
+
+ private final NoSqlAdapter adapter;
+
+ public NoSqlQueriableResourceProvider(NoSqlAdapter adapter) {
+ this.adapter = adapter;
+ }
+
+ public Iterator<Resource> findResources(final ResourceResolver resolver, final String query, final String language) {
+ final Iterator<NoSqlData> result = adapter.query(query, language);
+ if (result == null) {
+ return null;
+ }
+ return new Iterator<Resource>() {
+ public boolean hasNext() {
+ return result.hasNext();
+ }
+ public Resource next() {
+ return new NoSqlResource(result.next(), resolver);
+ }
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+
+ public Iterator<ValueMap> queryResources(final ResourceResolver resolver, final String query, final String language) {
+ final Iterator<Resource> result = findResources(resolver, query, language);
+ if (result == null) {
+ return null;
+ }
+ return new Iterator<ValueMap>() {
+ public boolean hasNext() {
+ return result.hasNext();
+ }
+ public ValueMap next() {
+ return result.next().getValueMap();
+ }
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlQueriableResourceProvider.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,99 @@
+/*
+ * 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.nosql.generic.resource.impl;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+
+class NoSqlReadonlyResourceProvider implements ResourceProvider {
+
+ private final NoSqlAdapter adapter;
+ private final Map<String, NoSqlData> changedResources;
+ private final Set<String> deletedResources;
+
+ public NoSqlReadonlyResourceProvider(NoSqlAdapter adapter, Map<String, NoSqlData> changedResources, Set<String> deletedResources) {
+ this.adapter = adapter;
+ this.changedResources = changedResources;
+ this.deletedResources = deletedResources;
+ }
+
+ public Resource getResource(ResourceResolver resourceResolver, String path) {
+ if (this.deletedResources.contains(path)) {
+ return null;
+ }
+ if (this.changedResources.containsKey(path)) {
+ return new NoSqlResource(this.changedResources.get(path), resourceResolver);
+ }
+ NoSqlData data = adapter.get(path);
+ if (data != null) {
+ return new NoSqlResource(data, resourceResolver);
+ }
+ return null;
+ }
+
+ public Resource getResource(ResourceResolver resourceResolver, HttpServletRequest request, String path) {
+ return getResource(resourceResolver, path);
+ }
+
+ public Iterator<Resource> listChildren(Resource parent) {
+
+ // use map to consolidate data from adapter minus deleted plus changed resources
+ // always sorty result alphabetically to have a consistent ordering - the nosql data source does not support ordering
+ SortedMap<String, Resource> children = new TreeMap<String, Resource>();
+
+ Iterator<NoSqlData> fromAdapter = adapter.getChildren(parent.getPath());
+ while (fromAdapter.hasNext()) {
+ NoSqlData item = fromAdapter.next();
+ if (isDeleted(item.getPath()) || changedResources.containsKey(item.getPath())) {
+ continue;
+ }
+ children.put(item.getPath(), new NoSqlResource(item, parent.getResourceResolver()));
+ }
+
+ Pattern childPathPattern = PathUtil.getChildPathPattern(parent.getPath());
+ for (NoSqlData item : changedResources.values()) {
+ if (childPathPattern.matcher(item.getPath()).matches()) {
+ children.put(item.getPath(), new NoSqlResource(item, parent.getResourceResolver()));
+ }
+ }
+
+ return children.values().iterator();
+ }
+
+ private boolean isDeleted(String path) {
+ for (String deletedPath : deletedResources) {
+ return StringUtils.equals(path, deletedPath) || StringUtils.startsWith(path, deletedPath + "/");
+ }
+ return false;
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlReadonlyResourceProvider.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java Fri May 15 16:40:21 2015
@@ -0,0 +1,74 @@
+/*
+ * 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.nosql.generic.resource.impl;
+
+import java.util.Map;
+
+import org.apache.sling.api.SlingConstants;
+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.nosql.generic.adapter.NoSqlData;
+
+public class NoSqlResource extends AbstractResource {
+
+ private final NoSqlData data;
+ private final ResourceResolver resourceResolver;
+ private final ResourceMetadata metadata;
+
+ public NoSqlResource(NoSqlData data, ResourceResolver resourceResolver) {
+ this.data = data;
+ this.resourceResolver = resourceResolver;
+ this.metadata = new ResourceMetadata();
+ }
+
+ public ResourceResolver getResourceResolver() {
+ return resourceResolver;
+ }
+
+ public String getPath() {
+ return data.getPath();
+ }
+
+ public String getResourceType() {
+ return getValueMap().get(ResourceResolver.PROPERTY_RESOURCE_TYPE, String.class);
+ }
+
+ public String getResourceSuperType() {
+ return getValueMap().get(SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, String.class);
+ }
+
+ public ResourceMetadata getResourceMetadata() {
+ return metadata;
+ }
+
+ @Override
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+ if (type == ValueMap.class || type == Map.class) {
+ // TODO: implement value map adaption
+ }
+ if (type == ModifiableValueMap.class) {
+ // TODO: implement value map adaption
+ }
+ return super.adaptTo(type);
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java Fri May 15 16:40:21 2015
@@ -0,0 +1,95 @@
+/*
+ * 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.nosql.generic.resource.impl;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.sling.api.resource.ModifyingResourceProvider;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.QueriableResourceProvider;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+import org.osgi.service.event.EventAdmin;
+
+public class NoSqlResourceProvider implements ResourceProvider, ModifyingResourceProvider, QueriableResourceProvider {
+
+ private final NoSqlReadonlyResourceProvider readonlyDelegate;
+ private final NoSqlModifyingResourceProvider modifyingDelegate;
+ private final NoSqlQueriableResourceProvider queriableDelegate;
+
+ private final Map<String, NoSqlData> changedResources = new HashMap<String, NoSqlData>();
+ private final Set<String> deletedResources = new HashSet<String>();
+
+ public NoSqlResourceProvider(NoSqlAdapter adapter, EventAdmin eventAdmin) {
+ this.readonlyDelegate = new NoSqlReadonlyResourceProvider(adapter, changedResources, deletedResources);
+ this.modifyingDelegate = new NoSqlModifyingResourceProvider(adapter, eventAdmin, changedResources, deletedResources);
+ this.queriableDelegate = new NoSqlQueriableResourceProvider(adapter);
+ }
+
+ public Resource getResource(ResourceResolver resourceResolver, String path) {
+ return readonlyDelegate.getResource(resourceResolver, path);
+ }
+
+ public Resource getResource(ResourceResolver resourceResolver, HttpServletRequest request, String path) {
+ return readonlyDelegate.getResource(resourceResolver, request, path);
+ }
+
+ public Iterator<Resource> listChildren(Resource parent) {
+ return readonlyDelegate.listChildren(parent);
+ }
+
+ public Resource create(ResourceResolver resolver, String path, Map<String, Object> properties) throws PersistenceException {
+ return modifyingDelegate.create(resolver, path, properties);
+ }
+
+ public void delete(ResourceResolver resolver, String path) throws PersistenceException {
+ modifyingDelegate.delete(resolver, path);
+ }
+
+ public void revert(ResourceResolver resolver) {
+ modifyingDelegate.revert(resolver);
+ }
+
+ public void commit(ResourceResolver resolver) throws PersistenceException {
+ modifyingDelegate.commit(resolver);
+ }
+
+ public boolean hasChanges(ResourceResolver resolver) {
+ return modifyingDelegate.hasChanges(resolver);
+ }
+
+ public Iterator<Resource> findResources(ResourceResolver resolver, String query, String language) {
+ return queriableDelegate.findResources(resolver, query, language);
+ }
+
+ public Iterator<ValueMap> queryResources(ResourceResolver resolver, String query, String language) {
+ return queryResources(resolver, query, language);
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java Fri May 15 16:40:21 2015
@@ -0,0 +1,47 @@
+/*
+ * 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.nosql.generic.resource.impl;
+
+import java.util.regex.Pattern;
+
+public final class PathUtil {
+
+ private PathUtil() {
+ // static methods only
+ }
+
+ /**
+ * Generated a regex pattern that accepts all paths that are direct children of the given parent path.
+ * @param parentPath Parent path
+ * @return Regex pattern
+ */
+ public static Pattern getChildPathPattern(String parentPath) {
+ return Pattern.compile("^" + Pattern.quote(parentPath) + "/[^/]+$");
+ }
+
+ /**
+ * Generated a regex pattern that accepts all paths that are same or descendants of the given parent path.
+ * @param path Path
+ * @return Regex pattern
+ */
+ public static Pattern getSameOrDescendantPathPattern(String path) {
+ return Pattern.compile("^" + Pattern.quote(path) + "(/.*)?$");
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/PathUtil.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java Fri May 15 16:40:21 2015
@@ -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.nosql.generic.resource;
+
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.service.event.EventAdmin;
+
+import com.google.common.collect.ImmutableMap;
+
+@RunWith(MockitoJUnitRunner.class)
+public class NoSqlResourceProviderFactoryTest {
+
+ @Rule
+ public SlingContext context = new SlingContext();
+
+ @Mock
+ private EventAdmin eventAdmin;
+
+ @Before
+ public void setUp() {
+ context.registerService(EventAdmin.class, eventAdmin);
+ context.registerInjectActivateService(new SimpleNoSqlResourceProviderFactory(), ImmutableMap.<String, Object>builder()
+ .put(ResourceProvider.ROOTS, "/nosql/simple")
+ .build());
+ }
+
+ @Test
+ public void testGetResourceProvider() {
+ // TODO: implement simple test
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderFactoryTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java Fri May 15 16:40:21 2015
@@ -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.nosql.generic.resource.impl;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+public class PathUtilTest {
+
+ @Test
+ public void testGetChildPathPattern() {
+ Pattern pattern = PathUtil.getChildPathPattern("/my/path");
+
+ assertFalse(pattern.matcher("/my/path").matches());
+ assertTrue(pattern.matcher("/my/path/child1").matches());
+ assertTrue(pattern.matcher("/my/path/child2").matches());
+ assertFalse(pattern.matcher("/my/path/child1/subchild1").matches());
+ assertFalse(pattern.matcher("/my/path/child1/subchild1/subchild2").matches());
+ assertFalse(pattern.matcher("/my/sibling").matches());
+ assertFalse(pattern.matcher("/other").matches());
+ }
+
+ @Test
+ public void testGetDescendantPathPattern() {
+ Pattern pattern = PathUtil.getSameOrDescendantPathPattern("/my/path");
+
+ assertTrue(pattern.matcher("/my/path").matches());
+ assertTrue(pattern.matcher("/my/path/child1").matches());
+ assertTrue(pattern.matcher("/my/path/child2").matches());
+ assertTrue(pattern.matcher("/my/path/child1/subchild1").matches());
+ assertTrue(pattern.matcher("/my/path/child1/subchild1/subchild2").matches());
+ assertFalse(pattern.matcher("/my/sibling").matches());
+ assertFalse(pattern.matcher("/other").matches());
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/PathUtilTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java Fri May 15 16:40:21 2015
@@ -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.sling.nosql.generic.simple;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
+
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.adapter.NoSqlData;
+import org.apache.sling.nosql.generic.resource.impl.PathUtil;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterators;
+
+public class SimpleNoSqlAdapter implements NoSqlAdapter {
+
+ private final Map<String, Map<String,Object>> store = new HashMap<String, Map<String,Object>>();
+
+ public NoSqlData get(String path) {
+ Map<String,Object> properties = store.get(path);
+ if (properties != null) {
+ return new NoSqlData(path, properties);
+ }
+ else {
+ return null;
+ }
+ }
+
+ public Iterator<NoSqlData> getChildren(String parentPath) {
+ Iterator<String> keys = store.keySet().iterator();
+
+ final Pattern childKeyPattern = PathUtil.getChildPathPattern(parentPath);
+ Iterator<String> childKeys = Iterators.filter(keys, new Predicate<String>() {
+ public boolean apply(String path) {
+ return childKeyPattern.matcher(path).matches();
+ }
+ });
+
+ return Iterators.transform(childKeys, new Function<String, NoSqlData>() {
+ public NoSqlData apply(String path) {
+ return get(path);
+ }
+ });
+ }
+
+ public boolean store(NoSqlData data) {
+ boolean exists = store.containsKey(data.getPath());
+ store.put(data.getPath(), data.getProperties());
+ return !exists;
+ }
+
+ public boolean deleteRecursive(String path) {
+ boolean deletedAnything = false;
+ final Pattern pathToDeletePattern = PathUtil.getSameOrDescendantPathPattern(path);
+ Iterator<Entry<String, Map<String,Object>>> entries = store.entrySet().iterator();
+ while (entries.hasNext()) {
+ Entry<String, Map<String,Object>> entry = entries.next();
+ if (pathToDeletePattern.matcher(entry.getKey()).matches()) {
+ entries.remove();
+ deletedAnything = true;
+ }
+ }
+ return deletedAnything;
+ }
+
+ public Iterator<NoSqlData> query(String query, String language) {
+ // not supported
+ return null;
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlAdapter.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java Fri May 15 16:40:21 2015
@@ -0,0 +1,68 @@
+/*
+ * 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.nosql.generic.simple;
+
+import java.util.Map;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceProviderFactory;
+import org.apache.sling.nosql.generic.adapter.NoSqlAdapter;
+import org.apache.sling.nosql.generic.resource.AbstractNoSqlResourceProviderFactory;
+import org.osgi.service.event.EventAdmin;
+
+@Component(configurationFactory = true, policy = ConfigurationPolicy.REQUIRE, metatype = true)
+@Service(value = ResourceProviderFactory.class)
+@Property(name = ResourceProvider.ROOTS, value = "")
+public class SimpleNoSqlResourceProviderFactory extends AbstractNoSqlResourceProviderFactory {
+
+ @Reference
+ private EventAdmin eventAdmin;
+
+ private NoSqlAdapter noSqlAdapter;
+
+ @Activate
+ protected void activate(final Map<String, Object> props) {
+ noSqlAdapter = new SimpleNoSqlAdapter();
+ }
+
+ @Override
+ protected NoSqlAdapter getNoSqlAdapter() {
+ return noSqlAdapter;
+ }
+
+ @Override
+ protected EventAdmin getEventAdmin() {
+ return eventAdmin;
+ }
+
+ protected void bindEventAdmin(EventAdmin eventAdmin) {
+ this.eventAdmin = eventAdmin;
+ }
+
+ protected void unbindEventAdmin(EventAdmin eventAdmin) {
+ this.eventAdmin = null;
+ }
+
+}
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/simple/SimpleNoSqlResourceProviderFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml?rev=1679602&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml Fri May 15 16:40:21 2015
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+ <scr:component name="org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory" configuration-policy="require" activate="activate">
+ <implementation class="org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory"/>
+ <service servicefactory="false">
+ <provide interface="org.apache.sling.api.resource.ResourceProviderFactory"/>
+ </service>
+ <property name="provider.roots" value=""/>
+ <property name="service.vendor" value="The Apache Software Foundation"/>
+ <property name="service.pid" value="org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory"/>
+ <reference name="eventAdmin" interface="org.osgi.service.event.EventAdmin" cardinality="1..1" policy="static" bind="bindEventAdmin" unbind="unbindEventAdmin"/>
+ </scr:component>
+</components>
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri May 15 16:40:21 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author
Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/resources/OSGI-INF/org.apache.sling.nosql.generic.simple.SimpleNoSqlResourceProviderFactory.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain