This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resource-editor.git

commit 12b1c743fca2b0527d0eb6584564761afc7ef762
Author: Bertrand Delacretaz <[email protected]>
AuthorDate: Fri Nov 21 14:55:30 2014 +0000

    SLING-4173 - switch to ResourceProvider - patch contributed by Sandro 
Boehme, thanks!
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1640927 
13f79535-47bb-0310-9956-ffa450edef68
---
 .../resource/ResEditorResourceProvider.java        | 80 ++++++++++++++++++++
 .../resource/ResourceIteratorWrapper.java          | 30 ++++++++
 .../ResourceProviderBasedResourceDecorator.java    | 85 ++++++++++++++++++++++
 .../resource/ResourceTypeResourceWrapper.java      | 32 ++++++++
 4 files changed, 227 insertions(+)

diff --git 
a/src/main/java/org/apache/sling/reseditor/resource/ResEditorResourceProvider.java
 
b/src/main/java/org/apache/sling/reseditor/resource/ResEditorResourceProvider.java
new file mode 100644
index 0000000..edc4b42
--- /dev/null
+++ 
b/src/main/java/org/apache/sling/reseditor/resource/ResEditorResourceProvider.java
@@ -0,0 +1,80 @@
+/*
+ * 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.reseditor.resource;
+
+import java.util.Iterator;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+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.SyntheticResource;
+
+/**
+ * The Resource Provider that wraps all Resources under {@link 
ROOT_PATHELEMENT_NAME} with the {@link ResourceTypeResourceWrapper}.
+ *
+ */
+@Component
+@Service
+@Properties({
+    @Property(name=ResourceProvider.ROOTS, 
value=ResEditorResourceProvider.ROOT_PATHELEMENT_NAME)
+})
+public class ResEditorResourceProvider implements ResourceProvider{
+    public static final String ROOT_PATHELEMENT_NAME = "reseditor";
+    public static final String ABS_ROOT = "/" + ROOT_PATHELEMENT_NAME;
+    public static final String RESOURCE_EDITOR_PROVIDER_RESOURCE = 
"resource-editor.RESOURCE_EDITOR_PROVIDER_RESOURCE";
+    public static final String RESEDITOR_RESOURCE_TYPE = 
"sling/resource-editor";
+
+    
+    /** ResourceProvider interface */
+    public Resource getResource(ResourceResolver resolver, HttpServletRequest 
req, String path) {
+        // Synthetic resource for the root, so that /reseditor works
+        if((ABS_ROOT).equals(path)) {
+            return new SyntheticResource(resolver, path, 
ROOT_PATHELEMENT_NAME);
+        }
+        Resource originalResource = resolver.resolve(req, 
path.substring(ROOT_PATHELEMENT_NAME.length()));
+        Resource newResource = new 
ResourceTypeResourceWrapper(originalResource);
+        return newResource;
+    }
+
+    /** ResourceProvider interface */
+    public Resource getResource(ResourceResolver resolver, String path) {
+        // Synthetic resource for the root, so that /reseditor works
+        if((ABS_ROOT).equals(path)) {
+            return new SyntheticResource(resolver, path, 
ROOT_PATHELEMENT_NAME);
+        }
+        Resource originalResource = 
resolver.resolve(path.substring(ROOT_PATHELEMENT_NAME.length()+1));
+        Resource newResource = new 
ResourceTypeResourceWrapper(originalResource);
+        return newResource;
+    }
+
+    /** ResourceProvider interface */
+    public Iterator<Resource> listChildren(Resource parent) {
+       ResourceResolver resourceResolver = parent.getResourceResolver();
+       Resource originalResource = resourceResolver.resolve("/");
+        Resource newResource = new 
ResourceTypeResourceWrapper(originalResource);
+       return newResource.listChildren();
+    }
+    
+}
diff --git 
a/src/main/java/org/apache/sling/reseditor/resource/ResourceIteratorWrapper.java
 
b/src/main/java/org/apache/sling/reseditor/resource/ResourceIteratorWrapper.java
new file mode 100644
index 0000000..393a896
--- /dev/null
+++ 
b/src/main/java/org/apache/sling/reseditor/resource/ResourceIteratorWrapper.java
@@ -0,0 +1,30 @@
+package org.apache.sling.reseditor.resource;
+import java.util.Iterator;
+
+import org.apache.sling.api.resource.Resource;
+
+/**
+ * It wraps the resources with the {@link ResourceTypeResourceWrapper} on 
+ * {@code next()}.
+ */
+public class ResourceIteratorWrapper implements Iterator<Resource>{
+
+       private Iterator<Resource> iterator;
+
+       public ResourceIteratorWrapper(Iterator<Resource> iterator){
+               this.iterator = iterator;
+       }
+       
+       public boolean hasNext() {
+               return iterator.hasNext();
+       }
+
+       public Resource next() {
+               return new ResourceTypeResourceWrapper(iterator.next());
+       }
+
+       public void remove() {
+               iterator.remove();
+       }
+
+}
diff --git 
a/src/main/java/org/apache/sling/reseditor/resource/ResourceProviderBasedResourceDecorator.java
 
b/src/main/java/org/apache/sling/reseditor/resource/ResourceProviderBasedResourceDecorator.java
new file mode 100644
index 0000000..6ca9ebf
--- /dev/null
+++ 
b/src/main/java/org/apache/sling/reseditor/resource/ResourceProviderBasedResourceDecorator.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.reseditor.resource;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceDecorator;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceWrapper;
+
+/**
+ * Decorates resources that have been called with the {@link 
ResEditorResourceProvider} with the resource-editor resource type.
+ * 
+ */
+
+@Component
+@Service(ResourceDecorator.class)
+@Properties({
+ @Property(name = "service.description", value = "Decorates resources that 
have been called with the ResEditorResourceProvider with the resource-editor 
resource type."),
+ @Property(name = "service.vendor", value = "The Apache Software Foundation")
+})
+public class ResourceProviderBasedResourceDecorator implements 
ResourceDecorator {
+
+       /**
+        * @see 
org.apache.sling.api.resource.ResourceDecorator#decorate(org.apache.sling.api.resource.Resource,
+        *      javax.servlet.http.HttpServletRequest)
+        */
+       public Resource decorate(Resource resource, HttpServletRequest request) 
{
+               String pathInfo = request.getPathInfo();
+               return getResourceEditorResourceWrapper(resource,
+                               pathInfo);
+       }
+
+       /**
+        * @see 
org.apache.sling.api.resource.ResourceDecorator#decorate(org.apache.sling.api.resource.Resource)
+        */
+       public Resource decorate(Resource resource) {
+               Resource result = null;
+               if (resource != null) {
+                       ResourceMetadata resourceMetadata = 
resource.getResourceMetadata();
+                       if (resourceMetadata != null) {
+                               String resolutionPathInfo = 
resourceMetadata.getResolutionPathInfo();
+                               result = 
getResourceEditorResourceWrapper(resource,resolutionPathInfo);
+                       }
+               }
+               return result;
+       }
+
+       private Resource getResourceEditorResourceWrapper(Resource resource, 
String resolutionPathInfo) {
+               Resource result = null;
+               ResourceMetadata resourceMetadata = 
resource.getResourceMetadata();
+               boolean isResourceEditorProviderResource = resourceMetadata != 
null ? 
resourceMetadata.containsKey(ResEditorResourceProvider.RESOURCE_EDITOR_PROVIDER_RESOURCE)
 : false;  
+               if (resolutionPathInfo != null && 
isResourceEditorProviderResource) {
+                       result = new ResourceWrapper(resource) {
+                               @Override
+                               public String getResourceType() {
+                                       return 
ResEditorResourceProvider.RESEDITOR_RESOURCE_TYPE;
+                               }
+
+                       };
+               }
+               return result;
+       }
+}
\ No newline at end of file
diff --git 
a/src/main/java/org/apache/sling/reseditor/resource/ResourceTypeResourceWrapper.java
 
b/src/main/java/org/apache/sling/reseditor/resource/ResourceTypeResourceWrapper.java
new file mode 100644
index 0000000..68c6225
--- /dev/null
+++ 
b/src/main/java/org/apache/sling/reseditor/resource/ResourceTypeResourceWrapper.java
@@ -0,0 +1,32 @@
+package org.apache.sling.reseditor.resource;
+
+import java.util.Iterator;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceWrapper;
+
+/**
+ * This ResourceWrapper adds a marker to the ResourceMetadata object that the 
{@link ResourceProviderBasedResourceDecorator}
+ * uses.
+ */
+public class ResourceTypeResourceWrapper extends ResourceWrapper {
+
+       public ResourceTypeResourceWrapper(Resource resource) {
+               super(resource);
+       }
+
+       @Override
+       public ResourceMetadata getResourceMetadata() {
+               ResourceMetadata newResourceMetadata = new ResourceMetadata();
+               newResourceMetadata.putAll(getResource().getResourceMetadata());
+               
newResourceMetadata.put(ResEditorResourceProvider.RESOURCE_EDITOR_PROVIDER_RESOURCE,
 null);
+               return newResourceMetadata;
+       }
+
+       @Override
+    public Iterator<Resource> listChildren() {
+               Iterator<Resource> originalIterator = 
this.getResource().listChildren();
+               return new ResourceIteratorWrapper(originalIterator);
+       }
+}

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to