You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2017/05/30 22:56:33 UTC
svn commit: r1796955 - in /sling/whiteboard/pauls/gush/servlet: pom.xml
src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResource.java
src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResourceProvider.java
Author: pauls
Date: Tue May 30 22:56:33 2017
New Revision: 1796955
URL: http://svn.apache.org/viewvc?rev=1796955&view=rev
Log:
Start fleshing out the ResourceProvider
Modified:
sling/whiteboard/pauls/gush/servlet/pom.xml
sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResource.java
sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResourceProvider.java
Modified: sling/whiteboard/pauls/gush/servlet/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/gush/servlet/pom.xml?rev=1796955&r1=1796954&r2=1796955&view=diff
==============================================================================
--- sling/whiteboard/pauls/gush/servlet/pom.xml (original)
+++ sling/whiteboard/pauls/gush/servlet/pom.xml Tue May 30 22:56:33 2017
@@ -90,6 +90,11 @@
<version>1.3.26</version>
</dependency>
<dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>adapter-annotations</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
Modified: sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResource.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResource.java?rev=1796955&r1=1796954&r2=1796955&view=diff
==============================================================================
--- sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResource.java (original)
+++ sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResource.java Tue May 30 22:56:33 2017
@@ -19,23 +19,33 @@
package org.apache.sling.whiteboard.pauls.gush.servlet;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.sling.adapter.annotations.Adaptable;
+import org.apache.sling.adapter.annotations.Adapter;
import org.apache.sling.api.resource.AbstractResource;
import org.apache.sling.api.resource.Resource;
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.ValueMapDecorator;
+@Adaptable(adaptableClass=Resource.class, adapters={
+ @Adapter({ValueMap.class})
+ })
public class GushResource extends AbstractResource implements Resource {
private final ResourceResolver m_resolver;
private final String m_path;
- private final ValueMap m_data;
+ private final Map<String, Object> m_data;
private final ResourceMetadata m_metadata;
- public GushResource(ResourceResolver resourceResolver, String path, ValueMap data) {
+ public GushResource(ResourceResolver resourceResolver, String path, String userID) {
m_resolver = resourceResolver;
m_path = path;
- m_data = data;
+ m_data = new HashMap<>();
+ m_data.put("user", userID);
m_metadata = new ResourceMetadata();
m_metadata.setResolutionPath(m_path);
}
@@ -68,7 +78,7 @@ public class GushResource extends Abstra
@Override
public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
if(type == ValueMap.class) {
- return type.cast(m_data);
+ return type.cast(new ValueMapDecorator(m_data));
}
return super.adaptTo(type);
}
Modified: sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResourceProvider.java?rev=1796955&r1=1796954&r2=1796955&view=diff
==============================================================================
--- sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResourceProvider.java (original)
+++ sling/whiteboard/pauls/gush/servlet/src/main/java/org/apache/sling/whiteboard/pauls/gush/servlet/GushResourceProvider.java Tue May 30 22:56:33 2017
@@ -18,25 +18,36 @@
*/
package org.apache.sling.whiteboard.pauls.gush.servlet;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.SyntheticResource;
-import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.resource.observation.ExternalResourceChangeListener;
import org.apache.sling.api.resource.observation.ResourceChange;
+import org.apache.sling.api.resource.observation.ResourceChange.ChangeType;
import org.apache.sling.api.resource.observation.ResourceChangeListener;
import org.apache.sling.spi.resource.provider.ResolveContext;
import org.apache.sling.spi.resource.provider.ResourceContext;
import org.apache.sling.spi.resource.provider.ResourceProvider;
+import org.osgi.service.component.annotations.Component;
-
-public class GushResourceProvider extends ResourceProvider<Void> implements ResourceChangeListener {
- private static final String ROOT = "/var/gush/connections";
-
- private final ConcurrentHashMap<String, ValueMap> m_resources = new ConcurrentHashMap<>();
+@Component(
+ service= {ResourceProvider.class, ResourceChangeListener.class, ExternalResourceChangeListener.class},
+ property = {
+ ResourceProvider.PROPERTY_NAME + "=" + "GUSH",
+ ResourceProvider.PROPERTY_ROOT + "=" + GushResourceProvider.ROOT,
+ ResourceChangeListener.PATHS + "=" + GushResourceProvider.ROOT,
+ ResourceChangeListener.CHANGES + "=" + "ADDED",
+ ResourceChangeListener.CHANGES + "=" + "REMOVED"
+ }
+)
+public class GushResourceProvider extends ResourceProvider<Void> implements ResourceChangeListener, ExternalResourceChangeListener {
+ public static final String ROOT = "/var/gush/connections";
+ private final ConcurrentHashMap<String, String> m_resources = new ConcurrentHashMap<>();
@Override
public Resource getResource(ResolveContext<Void> ctx, String path, ResourceContext resourceContext,
@@ -44,28 +55,56 @@ public class GushResourceProvider extend
if (ROOT.equals(path)) {
return new SyntheticResource(ctx.getResourceResolver(), path, "gush/connections");
}
- final ValueMap data = m_resources.get(path);
- return data == null ? null : new GushResource(ctx.getResourceResolver(), path, data);
+ final String userId = m_resources.get(path);
+ return userId == null ? null : new GushResource(ctx.getResourceResolver(), path, userId);
}
@Override
public Iterator<Resource> listChildren(ResolveContext<Void> ctx, Resource parent) {
- if(parent.getPath().startsWith(ROOT)) {
- return m_resources.entrySet().stream().filter(entry -> parent.getPath().equals(parentPath(entry.getKey())))
- .map(entry -> (Resource) new GushResource(parent.getResourceResolver(), entry.getKey(), entry.getValue()))
- .iterator();
- } else {
- return null;
- }
+ return
+ parent.getPath().startsWith(ROOT)
+ ?
+ m_resources.entrySet().stream()
+ .filter(entry -> parent.getPath().equals(parentPath(entry.getKey())))
+ .map(entry -> (Resource) new GushResource(parent.getResourceResolver(), entry.getKey(), entry.getValue()))
+ .iterator()
+ :
+ null;
}
@Override
public void onChange(List<ResourceChange> changes) {
-
+ changes.stream().filter(ResourceChange::isExternal).forEach(change -> {
+ switch (change.getType()) {
+ case ADDED:
+ m_resources.put(change.getPath(), userIDFromPath(change.getPath()));
+ break;
+ case REMOVED:
+ m_resources.remove(change.getPath());
+ break;
+ default:
+ break;
+ }
+ });
+ }
+
+ void addResource(String path, String userId) {
+ m_resources.put(path, userId);
+ getProviderContext().getObservationReporter().reportChanges(Arrays.asList(new ResourceChange(ChangeType.ADDED, path, false)), true);
+ }
+
+ void removeResource(String path) {
+ m_resources.remove(path);
+ getProviderContext().getObservationReporter().reportChanges(Arrays.asList(new ResourceChange(ChangeType.REMOVED, path, false)), true);
}
private static String parentPath(String path) {
- final int lastSlash = path.lastIndexOf("/");
+ final int lastSlash = path.lastIndexOf('/');
return lastSlash > 0 ? path.substring(0, lastSlash) : "";
}
+
+ private static String userIDFromPath(String path) {
+ final int lastSlash = path.lastIndexOf('/');
+ return lastSlash > 0 ? path.substring(lastSlash + 1) : "";
+ }
}