You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by da...@apache.org on 2008/01/15 22:37:31 UTC

svn commit: r612235 - in /incubator/abdera/java/trunk: extensions/html/ jcr/src/main/java/org/apache/abdera/jcr/ server/src/main/java/org/apache/abdera/protocol/server/ server/src/main/java/org/apache/abdera/protocol/server/impl/ server/src/test/java/o...

Author: dandiep
Date: Tue Jan 15 13:37:27 2008
New Revision: 612235

URL: http://svn.apache.org/viewvc?rev=612235&view=rev
Log:
ABDERA-85: Add RequestContext to AbstractCollectionProvider.getId()
ABDERA-86: Use a regex inside ServiceProvider to determine the path

Thanks to Jim Ancona for these patches!!


Modified:
    incubator/abdera/java/trunk/extensions/html/   (props changed)
    incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/CollectionProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractServiceProvider.java
    incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CollectionProviderTest.java
    incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerCollectionProvider.java

Propchange: incubator/abdera/java/trunk/extensions/html/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Tue Jan 15 13:37:27 2008
@@ -1,3 +1,4 @@
-.classpath
-.project
-.settings
+.classpath
+.project
+.settings
+target

Modified: incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java?rev=612235&r1=612234&r2=612235&view=diff
==============================================================================
--- incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java (original)
+++ incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java Tue Jan 15 13:37:27 2008
@@ -446,7 +446,7 @@
   }
 
   @Override
-  public String getId() {
+  public String getId(RequestContext request) {
     return id;
   }
 

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/CollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/CollectionProvider.java?rev=612235&r1=612234&r2=612235&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/CollectionProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/CollectionProvider.java Tue Jan 15 13:37:27 2008
@@ -34,9 +34,7 @@
   void end(RequestContext request, ResponseContext response);
   
   String getTitle(RequestContext request);
-
-  ResponseContext getFeed(Feed feed, RequestContext request);
-
+  
   ResponseContext createEntry(RequestContext request);
 
   ResponseContext getMedia(RequestContext request);

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java?rev=612235&r1=612234&r2=612235&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java Tue Jan 15 13:37:27 2008
@@ -205,7 +205,7 @@
     return e.getResponseContext();
   }
 
-  public abstract String getId();
+  public abstract String getId(RequestContext request);
   
   /**
    * Gets the UUID for the specified entry.
@@ -379,7 +379,7 @@
     Factory factory = request.getAbdera().getFactory();
     Feed feed = factory.newFeed();
     try {
-      feed.setId(getId());
+      feed.setId(getId(request));
       feed.setTitle(getTitle(request));
       feed.addLink("");
       feed.addLink("", "self");

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractServiceProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractServiceProvider.java?rev=612235&r1=612234&r2=612235&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractServiceProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractServiceProvider.java Tue Jan 15 13:37:27 2008
@@ -1,331 +1,344 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  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.  For additional information regarding
-* copyright in this work, please see the NOTICE file in the top level
-* directory of this distribution.
-*/
-package org.apache.abdera.protocol.server.impl;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.abdera.Abdera;
-import org.apache.abdera.i18n.iri.IRI;
-import org.apache.abdera.i18n.text.UrlEncoding;
-import org.apache.abdera.i18n.text.CharUtils.Profile;
-import org.apache.abdera.protocol.Request;
-import org.apache.abdera.protocol.Resolver;
-import org.apache.abdera.protocol.server.CollectionProvider;
-import org.apache.abdera.protocol.server.RequestContext;
-import org.apache.abdera.protocol.server.ResponseContext;
-import org.apache.abdera.protocol.server.Target;
-import org.apache.abdera.protocol.server.TargetType;
-import org.apache.abdera.protocol.server.WorkspaceInfo;
-import org.apache.abdera.protocol.server.RequestContext.Scope;
-import org.apache.abdera.util.EntityTag;
-import org.apache.abdera.writer.StreamWriter;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Represents an Atom service which is backed by various workspaces and CollectionProviders.
- * This class can be extended to provide a dynamic list of workspaces or ServiceProvider can
- * be used to use a static list.
- * 
- */
-public abstract class AbstractServiceProvider extends AbstractProvider implements Resolver<Target> {
-  private static final Log log = LogFactory.getLog(AbstractServiceProvider.class);
-  public static final String COLLECTION_PROVIDER_ATTRIBUTE = "collectionProvider";
-  
-    private String servicesPath = "/";
-    
-    protected AbstractServiceProvider(int count) {
-      super(count);
-    }
-
-    public Target resolve(Request request) {
-      RequestContext context = (RequestContext) request;
-      String uri = context.getTargetPath();
-      
-      if (servicesPath == null) {
-        throw new RuntimeException("You must set the servicesPath property on the ServiceProvider.");
-      }
-      
-      TargetType tt = null;
-      if (uri.equals(servicesPath)) {
-        tt = TargetType.TYPE_SERVICE;
-      } else if (uri.startsWith(servicesPath)) {
-        String path = uri.substring(servicesPath.length());
-        int q = path.indexOf("?");
-        if (q != -1) {
-          path = path.substring(0, q);
-        }
-        
-        path = UrlEncoding.decode(path);
-
-        CollectionProvider provider = null;
-        String providerHref = null;
-        for (WorkspaceInfo wi : getWorkspaces()) {
-          for (Map.Entry<String, CollectionProvider> e : wi.getCollectionProviders().entrySet()) {
-            if (path.startsWith(e.getKey())) {
-              provider = e.getValue();
-              providerHref = e.getKey();
-              break;
-            }
-          }
-        }
-        
-        if (provider != null) {
-          context.setAttribute(Scope.REQUEST, COLLECTION_PROVIDER_ATTRIBUTE, provider);
-          
-          if (providerHref.equals(path)) {
-            tt = TargetType.TYPE_COLLECTION;
-          } else {
-            tt = getOtherTargetType(context, path, providerHref, provider);
-          }
-        }
-      } 
-      
-      if (tt == null) {
-        tt = TargetType.TYPE_UNKNOWN;
-      }
-      
-      return new DefaultTarget(tt, context);
-    }
-
-    protected TargetType getOtherTargetType(RequestContext context, 
-                                            String path, 
-                                            String providerHref, 
-                                            CollectionProvider provider) {
-      String baseMedia = null;
-      if (provider instanceof AbstractCollectionProvider) {
-        baseMedia = ((AbstractCollectionProvider) provider).getBaseMediaIri();
-      }
-      
-      if (providerHref.startsWith("/")) {
-        providerHref = providerHref.substring(1);
-      }
-      
-      if (providerHref.startsWith(baseMedia)) {
-        return TargetType.TYPE_MEDIA;
-      } else {
-        return TargetType.TYPE_ENTRY;
-      }
-    }
-
-    public ResponseContext getService(RequestContext request) {
-      Abdera abdera = request.getAbdera();
-      AbstractResponseContext rc = getServicesDocument(abdera, request);
-      rc.setStatus(200);
-      return rc;
-    }
-
-    private String getEncoding(RequestContext request) {
-      return "utf-8";
-    }
-
-    private AbstractResponseContext getServicesDocument(final Abdera abdera, 
-                                                        final RequestContext request) {
-      final String enc = getEncoding(request);
-      
-      return new StreamWriterResponseContext(abdera) {
-
-        @SuppressWarnings( {"serial", "unchecked"})
-        protected void writeTo(StreamWriter sw) throws IOException {
-          sw.startDocument().startService();
-  
-          for (WorkspaceInfo wp : getWorkspaces()) {
-            sw.startWorkspace().writeTitle(wp.getName());
-            Set<Map.Entry<String, CollectionProvider>> entrySet = (Set<Map.Entry<String, CollectionProvider>>)(wp
-              .getCollectionProviders().entrySet());
-  
-            for (Map.Entry<String, CollectionProvider> entry : entrySet) {
-              CollectionProvider cp = entry.getValue();
-  
-              String href;
-              try {
-                href = UrlEncoding.encode(entry.getKey(), enc, Profile.PATH.filter());
-              } catch (UnsupportedEncodingException e) {
-                throw new RuntimeException(e);
-              }
-  
-              try {
-                sw.startCollection(href)
-                  .writeTitle(cp.getTitle(request))
-                  .writeAcceptsEntry()
-                  .endCollection();
-              } catch (RuntimeException e) {
-              }
-            }
-  
-            sw.endWorkspace();
-          }
-  
-          sw.endService().endDocument();
-  
-        }
-      };
-    }
-    
-    public abstract java.util.Collection<WorkspaceInfo> getWorkspaces();
-
-    public ResponseContext getFeed(RequestContext request) {
-      CollectionProvider provider = null;
-      ResponseContext res = null;
-      try {
-        provider = getCollectionProvider(request);
-        
-        provider.begin(request);
-        
-        res = provider.getFeed(request);
-        return res;
-      } catch (ResponseContextException e) {
-        res = createErrorResponse(e);
-        return res;
-      } finally {
-        end(provider, request, res);
-      }
-    }
-
-    @SuppressWarnings("unchecked")
-    private CollectionProvider getCollectionProvider(RequestContext request) {
-      return (CollectionProvider) request.getAttribute(Scope.REQUEST, COLLECTION_PROVIDER_ATTRIBUTE);
-    }
-
-    /**
-     * Create a ResponseContext (or take it from the Exception) for an
-     * exception that occurred in the application.
-     * @param e
-     * @return
-     */
-    protected ResponseContext createErrorResponse(ResponseContextException e) {
-      if (log.isInfoEnabled()) {
-        log.info("A ResponseException was thrown.", e);
-      } else if (e.getResponseContext() instanceof EmptyResponseContext 
-        && ((EmptyResponseContext) e.getResponseContext()).getStatus() >= 500) {
-        log.warn("A ResponseException was thrown.", e);
-      }
-      
-      return e.getResponseContext();
-    }
-
-    public ResponseContext createEntry(RequestContext request) {
-      CollectionProvider provider = null;
-      ResponseContext response = null;
-      try {
-        provider = getCollectionProvider(request);
-        provider.begin(request);
-        
-        return provider.createEntry(request);
-      } catch (ResponseContextException e) {
-        response = createErrorResponse(e);
-        return response;
-      } finally {
-        end(provider, request, response);
-      }
-    }
-
-    protected void end(CollectionProvider provider, RequestContext request, ResponseContext response) {
-      if (provider != null) {
-        try {
-          provider.end(request, response);
-        } catch (Throwable t) {
-          log.warn("Could not end() CollectionProvider.", t);
-        }
-      }
-    }
-
-    @Override
-    public ResponseContext getMedia(RequestContext request) {
-      CollectionProvider provider = null;
-      ResponseContext response = null;
-      try {
-        provider = getCollectionProvider(request);
-        provider.begin(request);
-        
-        return provider.getMedia(request);
-      } catch (ResponseContextException e) {
-        response = createErrorResponse(e);
-        return response;
-      } finally {
-        end(provider, request, response);
-      }
-    }
-
-
-    @Override
-    public ResponseContext updateMedia(RequestContext request) {
-      // TODO Auto-generated method stub
-      return super.updateMedia(request);
-    }
-
-    public ResponseContext deleteEntry(RequestContext request) {
-      CollectionProvider provider = null;
-      ResponseContext response = null;
-      try {
-        provider = getCollectionProvider(request);
-      
-        return provider.deleteEntry(request);
-      } finally {
-        end(provider, request, response);
-      }
-    }
-
-    
-    public ResponseContext getEntry(RequestContext request) {
-      CollectionProvider provider = null;
-      ResponseContext response = null;
-      try {
-        IRI entryBaseIri = resolveBase(request).resolve("./");
-        provider = getCollectionProvider(request);
-        provider.begin(request);
-        
-        return provider.getEntry(request, entryBaseIri);
-      } catch (ResponseContextException e) {
-        response = createErrorResponse(e);
-        return response;
-      } finally {
-        end(provider, request, response);
-      }
-    }
-
-    @SuppressWarnings("unchecked")
-    public ResponseContext updateEntry(RequestContext request) {
-      CollectionProvider provider = null;
-      ResponseContext response = null;
-      try {
-        IRI entryBaseIri = resolveBase(request).resolve("./");
-        provider = getCollectionProvider(request);
-        provider.begin(request);
-        
-        return provider.updateEntry(request, entryBaseIri);
-      } catch (ResponseContextException e) {
-        response = createErrorResponse(e);
-        return response;
-      } finally {
-        end(provider, request, response);
-      }
-    }
-
-    public String getServicesPath() {
-      return servicesPath;
-    }
-
-    public void setServicesPath(String servicesPath) {
-      this.servicesPath = servicesPath;
-    }
-
-}
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  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.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.protocol.server.impl;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.i18n.text.UrlEncoding;
+import org.apache.abdera.i18n.text.CharUtils.Profile;
+import org.apache.abdera.protocol.Request;
+import org.apache.abdera.protocol.Resolver;
+import org.apache.abdera.protocol.server.CollectionProvider;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.ResponseContext;
+import org.apache.abdera.protocol.server.Target;
+import org.apache.abdera.protocol.server.TargetType;
+import org.apache.abdera.protocol.server.WorkspaceInfo;
+import org.apache.abdera.protocol.server.RequestContext.Scope;
+import org.apache.abdera.writer.StreamWriter;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Represents an Atom service which is backed by various workspaces and CollectionProviders.
+ * This class can be extended to provide a dynamic list of workspaces or ServiceProvider can
+ * be used to use a static list.
+ * 
+ */
+public abstract class AbstractServiceProvider extends AbstractProvider implements Resolver<Target> {
+  private static final Log log = LogFactory.getLog(AbstractServiceProvider.class);
+  public static final String COLLECTION_PROVIDER_ATTRIBUTE = "collectionProvider";
+  public static final String URI_PARAMETER_ATTRIBUTE_PREFIX = "uriParameter";
+  
+    private Pattern servicesPattern = Pattern.compile("^/");
+    
+    protected AbstractServiceProvider(int count) {
+      super(count);
+    }
+
+    public Target resolve(Request request) {
+      RequestContext context = (RequestContext) request;
+      String uri = context.getTargetPath();
+      
+      if (servicesPattern == null) {
+        throw new RuntimeException("You must set the servicesPattern property on the ServiceProvider.");
+      }
+      
+      Matcher uriMatcher = servicesPattern.matcher(uri);
+      TargetType tt = null;
+      if (uriMatcher.matches()) {
+        tt = TargetType.TYPE_SERVICE;
+      } else {
+        uriMatcher.reset();
+        if (uriMatcher.find()) {
+          String path = uri.substring(uriMatcher.end());
+          int q = path.indexOf("?");
+          if (q != -1) {
+            path = path.substring(0, q);
+          }
+          
+          path = UrlEncoding.decode(path);
+  
+          CollectionProvider provider = null;
+          String providerHref = null;
+          for (WorkspaceInfo wi : getWorkspaces()) {
+            for (Map.Entry<String, CollectionProvider> e : wi.getCollectionProviders().entrySet()) {
+              if (path.startsWith(e.getKey())) {
+                provider = e.getValue();
+                providerHref = e.getKey();
+                break;
+              }
+            }
+          }
+          
+          if (provider != null) {
+            context.setAttribute(Scope.REQUEST, COLLECTION_PROVIDER_ATTRIBUTE, provider);
+            
+            if (providerHref.equals(path)) {
+              tt = TargetType.TYPE_COLLECTION;
+            } else {
+              tt = getOtherTargetType(context, path, providerHref, provider);
+            }
+          }
+        } 
+      }
+      
+      if (tt == null) {
+        tt = TargetType.TYPE_UNKNOWN;
+      } else {
+        for (int i = 1; i <= uriMatcher.groupCount(); i++) {
+          if (uriMatcher.group(i) != null) {
+            context.setAttribute(
+              Scope.REQUEST, 
+              URI_PARAMETER_ATTRIBUTE_PREFIX + Integer.toString(i), 
+              uriMatcher.group(i));
+          }
+        }
+      }
+      
+      return new DefaultTarget(tt, context);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected TargetType getOtherTargetType(RequestContext context, 
+                                            String path, 
+                                            String providerHref, 
+                                            CollectionProvider provider) {
+      String baseMedia = null;
+      if (provider instanceof AbstractCollectionProvider) {
+        baseMedia = ((AbstractCollectionProvider) provider).getBaseMediaIri();
+      }
+      
+      if (providerHref.startsWith("/")) {
+        providerHref = providerHref.substring(1);
+      }
+      
+      if (providerHref.startsWith(baseMedia)) {
+        return TargetType.TYPE_MEDIA;
+      } else {
+        return TargetType.TYPE_ENTRY;
+      }
+    }
+
+    public ResponseContext getService(RequestContext request) {
+      Abdera abdera = request.getAbdera();
+      AbstractResponseContext rc = getServicesDocument(abdera, request);
+      rc.setStatus(200);
+      return rc;
+    }
+
+    private String getEncoding(RequestContext request) {
+      return "utf-8";
+    }
+
+    private AbstractResponseContext getServicesDocument(final Abdera abdera, 
+                                                        final RequestContext request) {
+      final String enc = getEncoding(request);
+      
+      return new StreamWriterResponseContext(abdera) {
+
+        protected void writeTo(StreamWriter sw) throws IOException {
+          sw.startDocument().startService();
+  
+          for (WorkspaceInfo wp : getWorkspaces()) {
+            sw.startWorkspace().writeTitle(wp.getName());
+            Set<Map.Entry<String, CollectionProvider>> entrySet = (Set<Map.Entry<String, CollectionProvider>>)(wp
+              .getCollectionProviders().entrySet());
+  
+            for (Map.Entry<String, CollectionProvider> entry : entrySet) {
+              CollectionProvider cp = entry.getValue();
+  
+              String href;
+              try {
+                href = UrlEncoding.encode(entry.getKey(), enc, Profile.PATH.filter());
+              } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException(e);
+              }
+  
+              try {
+                sw.startCollection(href)
+                  .writeTitle(cp.getTitle(request))
+                  .writeAcceptsEntry()
+                  .endCollection();
+              } catch (RuntimeException e) {
+              }
+            }
+  
+            sw.endWorkspace();
+          }
+  
+          sw.endService().endDocument();
+  
+        }
+      };
+    }
+    
+    public abstract java.util.Collection<WorkspaceInfo> getWorkspaces();
+
+    public ResponseContext getFeed(RequestContext request) {
+      CollectionProvider provider = null;
+      ResponseContext res = null;
+      try {
+        provider = getCollectionProvider(request);
+        
+        provider.begin(request);
+        
+        res = provider.getFeed(request);
+      } catch (ResponseContextException e) {
+        res = createErrorResponse(e);
+      } finally {
+        end(provider, request, res);
+      }
+      return res;
+    }
+
+    private CollectionProvider getCollectionProvider(RequestContext request) {
+      return (CollectionProvider) request.getAttribute(Scope.REQUEST, COLLECTION_PROVIDER_ATTRIBUTE);
+    }
+
+    /**
+     * Create a ResponseContext (or take it from the Exception) for an
+     * exception that occurred in the application.
+     * @param e
+     * @return
+     */
+    protected ResponseContext createErrorResponse(ResponseContextException e) {
+      if (log.isInfoEnabled()) {
+        log.info("A ResponseException was thrown.", e);
+      } else if (e.getResponseContext() instanceof EmptyResponseContext 
+        && ((EmptyResponseContext) e.getResponseContext()).getStatus() >= 500) {
+        log.warn("A ResponseException was thrown.", e);
+      }
+      
+      return e.getResponseContext();
+    }
+
+    public ResponseContext createEntry(RequestContext request) {
+      CollectionProvider provider = null;
+      ResponseContext response = null;
+      try {
+        provider = getCollectionProvider(request);
+        provider.begin(request);
+        
+        response =  provider.createEntry(request);
+      } catch (ResponseContextException e) {
+        response = createErrorResponse(e);
+      } finally {
+        end(provider, request, response);
+      }
+      return response;
+    }
+
+    protected void end(CollectionProvider provider, RequestContext request, ResponseContext response) {
+      if (provider != null) {
+        try {
+          provider.end(request, response);
+        } catch (Throwable t) {
+          log.warn("Could not end() CollectionProvider.", t);
+        }
+      }
+    }
+
+    @Override
+    public ResponseContext getMedia(RequestContext request) {
+      CollectionProvider provider = null;
+      ResponseContext response = null;
+      try {
+        provider = getCollectionProvider(request);
+        provider.begin(request);
+        
+        response = provider.getMedia(request);
+      } catch (ResponseContextException e) {
+        response = createErrorResponse(e);
+      } finally {
+        end(provider, request, response);
+      }
+      return response;
+    }
+
+
+    @Override
+    public ResponseContext updateMedia(RequestContext request) {
+      // TODO Auto-generated method stub
+      return super.updateMedia(request);
+    }
+
+    public ResponseContext deleteEntry(RequestContext request) {
+      CollectionProvider provider = null;
+      ResponseContext response = null;
+      try {
+        provider = getCollectionProvider(request);
+      
+        response = provider.deleteEntry(request);
+      } finally {
+        end(provider, request, response);
+      }
+      return response;
+    }
+
+    
+    public ResponseContext getEntry(RequestContext request) {
+      CollectionProvider provider = null;
+      ResponseContext response = null;
+      try {
+        IRI entryBaseIri = resolveBase(request).resolve("./");
+        provider = getCollectionProvider(request);
+        provider.begin(request);
+        
+        response = provider.getEntry(request, entryBaseIri);
+      } catch (ResponseContextException e) {
+        response = createErrorResponse(e);
+      } finally {
+        end(provider, request, response);
+      }
+      return response;
+    }
+
+    public ResponseContext updateEntry(RequestContext request) {
+      CollectionProvider provider = null;
+      ResponseContext response = null;
+      try {
+        IRI entryBaseIri = resolveBase(request).resolve("./");
+        provider = getCollectionProvider(request);
+        provider.begin(request);
+        
+        response = provider.updateEntry(request, entryBaseIri);
+      } catch (ResponseContextException e) {
+        response = createErrorResponse(e);
+      } finally {
+        end(provider, request, response);
+      }
+      return response;
+    }
+
+    public String getServicesPattern() {
+      return servicesPattern.pattern();
+    }
+
+    public void setServicesPattern(String servicesPattern) {
+      this.servicesPattern = Pattern.compile(servicesPattern);
+    }
+
+}

Modified: incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CollectionProviderTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CollectionProviderTest.java?rev=612235&r1=612234&r2=612235&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CollectionProviderTest.java (original)
+++ incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CollectionProviderTest.java Tue Jan 15 13:37:27 2008
@@ -1,145 +1,142 @@
-package org.apache.abdera.protocol.server;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
-import junit.framework.TestCase;
-import org.apache.abdera.Abdera;
-import org.apache.abdera.factory.Factory;
-import org.apache.abdera.i18n.iri.IRI;
-import org.apache.abdera.model.Base;
-import org.apache.abdera.model.Element;
-import org.apache.abdera.model.Entry;
-import org.apache.abdera.protocol.client.AbderaClient;
-import org.apache.abdera.protocol.client.ClientResponse;
-import org.apache.abdera.protocol.client.RequestOptions;
-import org.apache.abdera.protocol.server.CollectionProvider;
-import org.apache.abdera.protocol.server.ServiceContext;
-import org.apache.abdera.protocol.server.TargetType;
-import org.apache.abdera.protocol.server.WorkspaceInfo;
-import org.apache.abdera.protocol.server.impl.DefaultServiceContext;
-import org.apache.abdera.protocol.server.impl.RegexTargetResolver;
-import org.apache.abdera.protocol.server.impl.SimpleWorkspaceInfo;
-import org.apache.abdera.protocol.server.impl.SingletonProviderManager;
-import org.apache.abdera.protocol.server.impl.ServiceProvider;
-import org.apache.abdera.protocol.server.servlet.AbderaServlet;
-import org.apache.abdera.writer.Writer;
-import org.apache.abdera.writer.WriterFactory;
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.servlet.Context;
-import org.mortbay.jetty.servlet.ServletHolder;
-
-public class CollectionProviderTest extends TestCase {
-
-  private Server server;
-  private DefaultServiceContext abderaServiceContext;
-
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-    
-    abderaServiceContext = new DefaultServiceContext();
-
-    
-    SingletonProviderManager pm = new SingletonProviderManager();
-    abderaServiceContext.setProviderManager(pm);
-
-    ServiceProvider sp = new ServiceProvider();
-    
-    SimpleWorkspaceInfo wi = new SimpleWorkspaceInfo();
-    CustomerCollectionProvider cp = new CustomerCollectionProvider();
-    Map<String, CollectionProvider> contentProviders = new HashMap<String, CollectionProvider>();
-    contentProviders.put("acme/customers", cp);
-    
-    wi.setCollectionProviders(contentProviders);
-
-    List<WorkspaceInfo> workspaces = new ArrayList<WorkspaceInfo>();
-    workspaces.add(wi);
-    sp.setWorkspaces(workspaces);
-    
-    pm.setProvider(sp);
-    abderaServiceContext.setTargetResolver(sp);
-    
-    initializeJetty();
-  }
-
-  public void testCustomerProvider() throws Exception {
-
-    Abdera abdera = new Abdera();
-    Factory factory = abdera.getFactory();
-
-    AbderaClient client = new AbderaClient(abdera);
-
-    String base = "http://localhost:9002/";
-
-    // Testing of entry creation
-    IRI colUri = new IRI(base).resolve("acme/customers"); // base +
-                                                          // docCollection.getHref().toString();
-    Entry entry = factory.newEntry();
-    entry.setTitle("Hmmm this is ignored right now");
-    entry.setUpdated(new Date());
-    entry.addAuthor("Acme Industries");
-    entry.setId(factory.newUuidUri());
-    entry.setSummary("Customer document");
-    
-    Element customerEl = factory.newElement(new QName("customer"));
-    customerEl.setAttributeValue(new QName("name"), "Dan Diephouse");
-    entry.setContent(customerEl);
-
-    RequestOptions opts = new RequestOptions();
-    opts.setContentType("application/atom+xml;type=entry");
-    ClientResponse res = client.post(colUri.toString(), entry, opts);
-    assertEquals(201, res.getStatus());
-
-    // prettyPrint(abdera, res.getDocument());
-
-    IRI location = res.getLocation();
-    assertEquals(colUri + "/1001-Dan_Diephouse", 
-                 location.toString());
-
-    // GET the entry
-    res = client.get(location.toString());
-    assertEquals(200, res.getStatus());
-
-    // prettyPrint(abdera, res.getDocument());
-    org.apache.abdera.model.Document<Entry> entry_doc = res.getDocument();
-    entry = entry_doc.getRoot();
-
-    res = client.get(colUri + "/foobar");
-    assertEquals(404, res.getStatus());
-  }
-
-  protected void prettyPrint(Abdera abdera, Base doc) throws IOException {
-    WriterFactory factory = abdera.getWriterFactory();
-    Writer writer = factory.getWriter("prettyxml");
-    writer.writeTo(doc, System.out);
-    System.out.println();
-  }
-
-  private void initializeJetty() throws Exception {
-
-    server = new Server(9002);
-    Context root = new Context(server, "/", Context.NO_SESSIONS);
-    root.addServlet(new ServletHolder(new AbderaServlet() {
-
-      @Override
-      protected ServiceContext createServiceContext() {
-        abderaServiceContext.init(getAbdera(), getProperties(getServletConfig()));
-        return abderaServiceContext;
-      }
-    }), "/*");
-    server.start();
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    if (server != null) server.stop();
-  }
-
-}
+package org.apache.abdera.protocol.server;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.factory.Factory;
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.model.Base;
+import org.apache.abdera.model.Element;
+import org.apache.abdera.model.Entry;
+import org.apache.abdera.protocol.client.AbderaClient;
+import org.apache.abdera.protocol.client.ClientResponse;
+import org.apache.abdera.protocol.client.RequestOptions;
+import org.apache.abdera.protocol.server.impl.DefaultServiceContext;
+import org.apache.abdera.protocol.server.impl.ServiceProvider;
+import org.apache.abdera.protocol.server.impl.SimpleWorkspaceInfo;
+import org.apache.abdera.protocol.server.impl.SingletonProviderManager;
+import org.apache.abdera.protocol.server.servlet.AbderaServlet;
+import org.apache.abdera.writer.Writer;
+import org.apache.abdera.writer.WriterFactory;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.servlet.Context;
+import org.mortbay.jetty.servlet.ServletHolder;
+
+public class CollectionProviderTest extends TestCase {
+
+  private Server server;
+  private DefaultServiceContext abderaServiceContext;
+
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+    
+    abderaServiceContext = new DefaultServiceContext();
+
+    
+    SingletonProviderManager pm = new SingletonProviderManager();
+    abderaServiceContext.setProviderManager(pm);
+
+    ServiceProvider sp = new ServiceProvider();
+    sp.setServicesPattern("^/([^\\/])+/");
+    
+    SimpleWorkspaceInfo wi = new SimpleWorkspaceInfo();
+    CustomerCollectionProvider cp = new CustomerCollectionProvider();
+    Map<String, CollectionProvider> contentProviders = new HashMap<String, CollectionProvider>();
+    contentProviders.put("acme/customers", cp);
+    
+    wi.setCollectionProviders(contentProviders);
+
+    List<WorkspaceInfo> workspaces = new ArrayList<WorkspaceInfo>();
+    workspaces.add(wi);
+    sp.setWorkspaces(workspaces);
+    
+    pm.setProvider(sp);
+    abderaServiceContext.setTargetResolver(sp);
+    
+    initializeJetty();
+  }
+
+  public void testCustomerProvider() throws Exception {
+
+    Abdera abdera = new Abdera();
+    Factory factory = abdera.getFactory();
+
+    AbderaClient client = new AbderaClient(abdera);
+
+    String base = "http://localhost:9002/";
+
+    // Testing of entry creation
+    IRI colUri = new IRI(base).resolve("foo/acme/customers"); // base +
+                                                          // docCollection.getHref().toString();
+    Entry entry = factory.newEntry();
+    entry.setTitle("Hmmm this is ignored right now");
+    entry.setUpdated(new Date());
+    entry.addAuthor("Acme Industries");
+    entry.setId(factory.newUuidUri());
+    entry.setSummary("Customer document");
+    
+    Element customerEl = factory.newElement(new QName("customer"));
+    customerEl.setAttributeValue(new QName("name"), "Dan Diephouse");
+    entry.setContent(customerEl);
+
+    RequestOptions opts = new RequestOptions();
+    opts.setContentType("application/atom+xml;type=entry");
+    ClientResponse res = client.post(colUri.toString(), entry, opts);
+    assertEquals(201, res.getStatus());
+
+    // prettyPrint(abdera, res.getDocument());
+
+    IRI location = res.getLocation();
+    assertEquals(colUri + "/1001-Dan_Diephouse", 
+                 location.toString());
+
+    // GET the entry
+    res = client.get(location.toString());
+    assertEquals(200, res.getStatus());
+
+    // prettyPrint(abdera, res.getDocument());
+    org.apache.abdera.model.Document<Entry> entry_doc = res.getDocument();
+    entry = entry_doc.getRoot();
+
+    res = client.get(colUri + "/foobar");
+    assertEquals(404, res.getStatus());
+  }
+
+  protected void prettyPrint(Abdera abdera, Base doc) throws IOException {
+    WriterFactory factory = abdera.getWriterFactory();
+    Writer writer = factory.getWriter("prettyxml");
+    writer.writeTo(doc, System.out);
+    System.out.println();
+  }
+
+  private void initializeJetty() throws Exception {
+
+    server = new Server(9002);
+    Context root = new Context(server, "/", Context.NO_SESSIONS);
+    root.addServlet(new ServletHolder(new AbderaServlet() {
+
+      @Override
+      protected ServiceContext createServiceContext() {
+        abderaServiceContext.init(getAbdera(), getProperties(getServletConfig()));
+        return abderaServiceContext;
+      }
+    }), "/*");
+    server.start();
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    if (server != null) server.stop();
+  }
+
+}

Modified: incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerCollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerCollectionProvider.java?rev=612235&r1=612234&r2=612235&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerCollectionProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerCollectionProvider.java Tue Jan 15 13:37:27 2008
@@ -25,7 +25,7 @@
   private Map<Integer, Customer> customers = new HashMap<Integer, Customer>();
   private Factory factory = new Abdera().getFactory();
   
-  public String getId() {
+  public String getId(RequestContext request) {
     return "tag:example.org,2007:feed";
   }