You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2008/01/21 08:47:45 UTC

svn commit: r613783 - in /incubator/abdera/java/branches/server_refactor/src: main/java/org/apache/abdera/protocol/server/ main/java/org/apache/abdera/protocol/server/impl/ main/java/org/apache/abdera/protocol/server/servlet/ test/java/org/apache/abder...

Author: jmsnell
Date: Sun Jan 20 23:47:42 2008
New Revision: 613783

URL: http://svn.apache.org/viewvc?rev=613783&view=rev
Log:
Additional simplifications designed to make it easier to implement providers. Look at the Simple test case for an example

Added:
    incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCombinedProvider.java
Removed:
    incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleProvider.java
    incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleTargetResolver.java
Modified:
    incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ProviderHelper.java
    incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ServiceContext.java
    incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/DefaultServiceContext.java
    incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/EmptyResponseContext.java
    incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java
    incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleServiceContext.java
    incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleTest.java

Modified: incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ProviderHelper.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ProviderHelper.java?rev=613783&r1=613782&r2=613783&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ProviderHelper.java (original)
+++ incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ProviderHelper.java Sun Jan 20 23:47:42 2008
@@ -13,17 +13,20 @@
 import org.apache.abdera.i18n.iri.IRI;
 import org.apache.abdera.i18n.text.Localizer;
 import org.apache.abdera.i18n.text.Sanitizer;
+import org.apache.abdera.model.AtomDate;
 import org.apache.abdera.model.Base;
 import org.apache.abdera.model.Content;
 import org.apache.abdera.model.Document;
 import org.apache.abdera.model.Element;
 import org.apache.abdera.model.Entry;
 import org.apache.abdera.model.ExtensibleElement;
+import org.apache.abdera.model.Feed;
 import org.apache.abdera.protocol.error.Error;
 import org.apache.abdera.protocol.server.impl.AbstractResponseContext;
 import org.apache.abdera.protocol.server.impl.BaseResponseContext;
 import org.apache.abdera.protocol.server.impl.EmptyResponseContext;
 import org.apache.abdera.protocol.server.impl.StreamWriterResponseContext;
+import org.apache.abdera.util.EntityTag;
 import org.apache.abdera.util.MimeTypeHelper;
 import org.apache.abdera.writer.NamedWriter;
 import org.apache.abdera.writer.StreamWriter;
@@ -115,6 +118,15 @@
   }
 
   /**
+   * Return a server error
+   */
+  public static ResponseContext servererror(
+    RequestContext request,
+    Throwable t) {
+      return servererror(request,"Server Error",t);
+  }
+  
+  /**
    * Return an unauthorized error
    */
   public static ResponseContext unauthorized(
@@ -124,6 +136,11 @@
       return createErrorResponse(request.getAbdera(),401,reason);
   }
 
+  public static ResponseContext unauthorized(
+    RequestContext request) {
+      return unauthorized(request, "Unauthorized");
+  }
+  
   /**
    * Return an unauthorized error
    */
@@ -134,12 +151,21 @@
       return createErrorResponse(request.getAbdera(),403,reason);
   }
 
+  public static ResponseContext forbidden(
+    RequestContext request) {
+      return forbidden(request, "Forbidden");
+  }
+  
   /**
    * Return a 204 No Content response
    */
   public static ResponseContext nocontent(String reason) {
     return new EmptyResponseContext(204,reason);
   }
+
+  public static ResponseContext nocontent() {
+    return nocontent("Not Content");
+  }
   
   /**
    * Return a 404 not found error
@@ -151,6 +177,11 @@
     return createErrorResponse(request.getAbdera(),404,reason);
   }
 
+  public static ResponseContext notfound(
+    RequestContext request) {
+      return notfound(request, "Not Found");
+  }
+  
   /**
    * Return a 405 method not allowed error
    */
@@ -164,6 +195,17 @@
       resp.setAllow(methods);
       return resp;
   }
+  
+  public static ResponseContext notallowed( 
+      RequestContext request,
+      String... methods) {
+   return notallowed(request, "Method Not Allowed", methods); 
+  }
+  
+  public static ResponseContext notallowed(
+    RequestContext request) {
+      return notallowed(request, getDefaultMethods(request));
+  }
 
   /**
    * Return a 400 bad request error
@@ -175,6 +217,11 @@
       return createErrorResponse(request.getAbdera(),400,reason);
   }
 
+  public static ResponseContext badrequest(
+    RequestContext request) {
+      return badrequest(request, "Bad Request");
+  }
+  
   /**
    * Return a 409 conflict error
    */
@@ -185,6 +232,11 @@
     return createErrorResponse(request.getAbdera(),409,reason);
   }
 
+  public static ResponseContext conflict(
+    RequestContext request) {
+      return conflict(request, "Conflict");
+  }
+  
   /**
    * Return a service unavailable error
    */
@@ -195,6 +247,11 @@
       return createErrorResponse(request.getAbdera(),503,reason);
   }
 
+  public static ResponseContext unavailable(
+    RequestContext request) {
+      return unavailable(request, "Service Unavailable");
+  }
+  
   public static ResponseContext notmodified( 
     RequestContext request,
     String reason) {
@@ -202,6 +259,11 @@
       return new EmptyResponseContext(304,reason);
   }
 
+  public static ResponseContext notmodified(
+    RequestContext request) {
+      return notmodified(request, "Not Modified");
+  }
+  
   public static ResponseContext preconditionfailed(
     RequestContext request,
     String reason) {
@@ -209,6 +271,11 @@
       return createErrorResponse(request.getAbdera(),412,reason);
   }
 
+  public static ResponseContext preconditionfailed(
+    RequestContext request) {
+      return preconditionfailed(request, "Precondition Failed");
+  }
+  
   /**
    * Return a 415 media type not-supported error
    */
@@ -219,6 +286,11 @@
       return createErrorResponse(request.getAbdera(),415,reason);
   }
 
+  public static ResponseContext notsupported(
+    RequestContext request) {
+      return notsupported(request, "Media Type Not Supported");
+  }
+  
   /**
    * Return a 423 locked error
    */
@@ -229,6 +301,11 @@
       return createErrorResponse(request.getAbdera(),423,reason);
     }
 
+  public static ResponseContext locked(
+    RequestContext request) {
+      return locked(request, "Locked");
+  }
+  
   /**
    * Return a document
    */
@@ -456,4 +533,25 @@
     return writer;
   }
 
+  public static EntityTag calculateEntityTag(Base base) {
+    String id = null;
+    String modified = null;
+    if (base instanceof Entry) {
+      Entry entry = (Entry) base;
+      id = entry.getId().toString();
+      modified = 
+        AtomDate.format(
+          entry.getEdited() != null ?
+            entry.getEdited() :
+            entry.getUpdated()
+        );
+    } else if (base instanceof Feed) {
+      Feed feed = (Feed) base;
+      id = feed.getId().toString();
+      modified = AtomDate.format(feed.getUpdated());
+    } else if (base instanceof Document) {
+      return calculateEntityTag(((Document<?>)base).getRoot());
+    }
+    return EntityTag.generate(id, modified);      
+  }
 }

Modified: incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ServiceContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ServiceContext.java?rev=613783&r1=613782&r2=613783&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ServiceContext.java (original)
+++ incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/ServiceContext.java Sun Jan 20 23:47:42 2008
@@ -34,7 +34,7 @@
   
   Resolver<Subject> getSubjectResolver();
   
-  Resolver<Target> getTargetResolver(String contextPath);
+  Resolver<Target> getTargetResolver();
   
   String getProperty(String name);
   

Added: incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCombinedProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCombinedProvider.java?rev=613783&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCombinedProvider.java (added)
+++ incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCombinedProvider.java Sun Jan 20 23:47:42 2008
@@ -0,0 +1,40 @@
+/*
+* 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 org.apache.abdera.protocol.server.CollectionAdapter;
+import org.apache.abdera.protocol.server.ProviderHelper;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.ResponseContext;
+
+public abstract class AbstractCombinedProvider 
+  extends AbstractWorkspaceManagerProvider 
+  implements CollectionAdapter {
+  
+  public CollectionAdapter getCollectionAdapter(
+    RequestContext request) {
+      return this;
+  }
+  
+  public ResponseContext extensionRequest(RequestContext request) {
+    return ProviderHelper.notallowed(
+      request, 
+      "Method Not Allowed", 
+      this.getMethods(request));
+  }
+}

Modified: incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/DefaultServiceContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/DefaultServiceContext.java?rev=613783&r1=613782&r2=613783&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/DefaultServiceContext.java (original)
+++ incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/DefaultServiceContext.java Sun Jan 20 23:47:42 2008
@@ -74,7 +74,7 @@
   }
 
   @SuppressWarnings("unchecked")
-  public Resolver<Target> getTargetResolver(String contextPath) {
+  public Resolver<Target> getTargetResolver() {
     if (targetResolver == null) {
       targetResolver = (Resolver<Target>) instance(
         ServiceManager.TARGET_RESOLVER, getDefaultTargetResolver());

Modified: incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/EmptyResponseContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/EmptyResponseContext.java?rev=613783&r1=613782&r2=613783&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/EmptyResponseContext.java (original)
+++ incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/impl/EmptyResponseContext.java Sun Jan 20 23:47:42 2008
@@ -30,6 +30,7 @@
   }
   
   public EmptyResponseContext(int status, String text) {
+    setStatus(status);
     setStatusText(text);
   }
   

Modified: incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java?rev=613783&r1=613782&r2=613783&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java (original)
+++ incubator/abdera/java/branches/server_refactor/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java Sun Jan 20 23:47:42 2008
@@ -63,8 +63,7 @@
         subjectResolver.resolve(this) : null;
       
       Resolver<Target> targetResolver = 
-        context.getTargetResolver(
-          request.getContextPath());
+        context.getTargetResolver();
       target = (targetResolver != null) ? 
         targetResolver.resolve(this) : null;
   }

Modified: incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleServiceContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleServiceContext.java?rev=613783&r1=613782&r2=613783&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleServiceContext.java (original)
+++ incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleServiceContext.java Sun Jan 20 23:47:42 2008
@@ -17,14 +17,282 @@
 */
 package org.apache.abdera.protocol.server.test.simple;
 
+import java.io.IOException;
+import java.util.Date;
+
+import javax.activation.MimeType;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.factory.Factory;
+import org.apache.abdera.i18n.text.UrlEncoding;
+import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Entry;
+import org.apache.abdera.model.Feed;
+import org.apache.abdera.parser.ParseException;
+import org.apache.abdera.protocol.Resolver;
+import org.apache.abdera.protocol.server.Provider;
+import org.apache.abdera.protocol.server.ProviderHelper;
+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.RequestContext.Scope;
+import org.apache.abdera.protocol.server.impl.AbstractCombinedProvider;
+import org.apache.abdera.protocol.server.impl.BaseResponseContext;
 import org.apache.abdera.protocol.server.impl.DefaultServiceContext;
+import org.apache.abdera.protocol.server.impl.RegexTargetResolver;
+import org.apache.abdera.protocol.server.impl.StreamWriterResponseContext;
+import org.apache.abdera.util.Constants;
+import org.apache.abdera.util.EntityTag;
+import org.apache.abdera.util.MimeTypeHelper;
+import org.apache.abdera.writer.StreamWriter;
 
+@SuppressWarnings("unchecked")
 public class SimpleServiceContext 
   extends DefaultServiceContext {
 
-  public SimpleServiceContext() {
-    this.defaultprovider = SimpleProvider.class.getName();
-    this.defaulttargetresolver = SimpleTargetResolver.class.getName();
+  public synchronized Provider getProvider(
+    RequestContext request) {
+      if (provider == null)
+        provider = new SimpleProvider();
+      return provider;
+  }
+
+  public Resolver<Target> getTargetResolver() {
+    return new RegexTargetResolver()
+      .setPattern("/atom(\\?[^#]*)?", TargetType.TYPE_SERVICE)
+      .setPattern("/atom/feed(\\?[^#]*)?", TargetType.TYPE_COLLECTION)
+      .setPattern("/atom/feed/([^/#?]+)(\\?[^#]*)?", TargetType.TYPE_ENTRY);
   }
+
+  public static class SimpleProvider 
+    extends AbstractCombinedProvider {
+      
+    private EntityTag service_etag = new EntityTag("simple");
+    private Document<Feed> feed_doc;
+    
+    private Document<Feed> init_feed_doc(
+      Abdera abdera, 
+      RequestContext context) {
+        Feed feed = 
+          (Feed) context.getAttribute(
+            Scope.SESSION, 
+            "feed");
+        if (feed == null) {
+          Factory factory = abdera.getFactory();
+          feed = factory.newFeed();
+          try {
+            feed.setId("tag:example.org,2006:feed");
+            feed.setTitle("Simple");
+            feed.setUpdated(new Date());
+            feed.addLink("");
+            feed.addLink("","self");
+            feed.addAuthor("Simple");
+          } catch (Exception e) {}
+          context.setAttribute(
+            Scope.SESSION, 
+            "feed", 
+            feed);
+        } 
+        return feed.getDocument();
+    }
+    
+    private synchronized Document<Feed> get_feed_doc(
+      RequestContext context) {
+        if (feed_doc == null)
+          feed_doc = 
+            init_feed_doc(
+              context.getAbdera(), 
+              context);
+      return feed_doc;
+    }
+  
+    
+    protected ResponseContext getServiceDocument(
+      RequestContext request) {
+        return 
+          new StreamWriterResponseContext(request.getAbdera()) {
+            protected void writeTo(
+              StreamWriter sw) 
+                throws IOException {
+              sw.startDocument()
+                .startService()
+                .startWorkspace()
+                .writeTitle("Simple")
+                .startCollection("atom/feed")
+                .writeTitle("Simple")
+                .writeAcceptsEntry()
+                .startCategories(false)
+                .endCategories()
+                .endCollection()
+                .endWorkspace()
+                .endService()
+                .endDocument();
+            }
+          }
+          .setStatus(200)
+          .setEntityTag(service_etag)
+          .setContentType(Constants.APP_MEDIA_TYPE);
+    }
   
+    public ResponseContext getFeed(
+      RequestContext request) {
+        Document<Feed> feed = get_feed_doc(request); 
+        return ProviderHelper.returnBase(
+          feed, 
+          200, 
+          feed.getRoot().getUpdated())
+            .setEntityTag(
+              ProviderHelper.calculateEntityTag(
+                feed.getRoot()));
+    }
+  
+    
+    public ResponseContext deleteEntry(
+      RequestContext request) {
+        Entry entry = getAbderaEntry(request);
+        if (entry != null)
+          entry.discard();
+        return ProviderHelper.nocontent();
+    }
+  
+    public ResponseContext getEntry(
+      RequestContext request) {
+        Entry entry = (Entry) getAbderaEntry(request);
+        if (entry != null) {
+          Feed feed = entry.getParentElement();
+          entry = (Entry) entry.clone();
+          entry.setSource(feed.getAsSource());
+          Document<Entry> entry_doc = entry.getDocument();
+          return 
+            ProviderHelper.returnBase(
+              entry_doc, 
+              200, 
+              entry.getEdited())
+                .setEntityTag(
+                  ProviderHelper.calculateEntityTag(
+                    entry));
+        } else {
+          return ProviderHelper.notfound(request);
+        }
+    }
+  
+    public ResponseContext postEntry(
+      RequestContext request) {
+        Abdera abdera = request.getAbdera();
+        try {
+          if (!checkMediaType(request))
+            return ProviderHelper.notsupported(request);
+          Document<Entry> entry_doc = 
+            (Document<Entry>) request.getDocument(
+              abdera.getParser()).clone();
+          if (entry_doc != null) {
+            Entry entry = entry_doc.getRoot();
+            if (!ProviderHelper.isValidEntry(entry))
+              return ProviderHelper.badrequest(request);
+            setEntryDetails(entry, abdera.getFactory().newUuidUri());
+            Feed feed = get_feed_doc(request).getRoot();
+            feed.insertEntry(entry);
+            feed.setUpdated(new Date());
+            BaseResponseContext rc = 
+              (BaseResponseContext) ProviderHelper.returnBase(
+                entry_doc, 201, entry.getEdited());
+            return 
+              rc.setLocation(
+                  ProviderHelper.resolveBase(request).resolve(
+                    entry.getEditLinkResolvedHref()).toString())
+                .setContentLocation(rc.getLocation().toString())
+                .setEntityTag(ProviderHelper.calculateEntityTag(entry));
+          } else {
+            return ProviderHelper.badrequest(request);
+          }
+        } catch (ParseException pe) {
+          return ProviderHelper.notsupported(request);
+        } catch (ClassCastException cce) {
+          return ProviderHelper.notsupported(request);
+        } catch (Exception e) {
+          return ProviderHelper.badrequest(request);
+      }
+    }
+  
+    private boolean checkMediaType(RequestContext request) {
+      MimeType contentType = request.getContentType();
+      String ctype = 
+        contentType != null ? 
+          contentType.toString() : 
+            null;
+      return ctype != null && MimeTypeHelper.isAtom(ctype);
+    }
+    
+    private void setEntryDetails(
+      Entry entry, 
+      String id) {
+        entry.setUpdated(new Date());
+        entry.setEdited(entry.getUpdated());
+        entry.getIdElement().setValue(id);
+        entry.addLink(
+          "atom/feed/" + entry.getId().toString(), 
+          "edit");
+    }
+    
+    public ResponseContext putEntry(
+      RequestContext request) {
+        Abdera abdera = request.getAbdera();
+        Entry orig_entry = getAbderaEntry(request);
+        if (orig_entry != null) {
+          try {
+            if (!checkMediaType(request))
+              return ProviderHelper.notsupported(
+                request);
+            Document<Entry> entry_doc = 
+              (Document<Entry>) request.getDocument(
+                abdera.getParser()).clone();
+            if (entry_doc != null) {
+              Entry entry = entry_doc.getRoot();
+              if (!entry.getId().equals(orig_entry.getId()))
+                return ProviderHelper.conflict(request);
+              if (!ProviderHelper.isValidEntry(entry))
+                return ProviderHelper.badrequest(request);
+              setEntryDetails(entry, orig_entry.getId().toString());
+              orig_entry.discard();
+              Feed feed = get_feed_doc(request).getRoot();
+              feed.insertEntry(entry);
+              feed.setUpdated(new Date());
+              return ProviderHelper.nocontent();
+            } else {
+              return ProviderHelper.badrequest(request);
+            }
+          } catch (ParseException pe) {
+            return ProviderHelper.notsupported(request);
+          } catch (ClassCastException cce) {
+            return ProviderHelper.notsupported(request);
+          } catch (Exception e) {
+            return ProviderHelper.badrequest(request);
+          }
+        } else {
+          return ProviderHelper.notfound(request);
+        }
+    }
+    
+    private Entry getAbderaEntry(
+      RequestContext request) {
+        try { 
+          return get_feed_doc( 
+            request)
+              .getRoot()
+              .getEntry(
+                getEntryID(request)); 
+        } catch (Exception e) {}
+        return null;
+    }
+    
+    private String getEntryID(
+      RequestContext request) {
+        if (request.getTarget().getType() != TargetType.TYPE_ENTRY) 
+          return null;
+        String[] segments = request.getUri().toString().split("/");
+        return UrlEncoding.decode(segments[segments.length-1]);
+    }
+    
+  }
 }

Modified: incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleTest.java?rev=613783&r1=613782&r2=613783&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleTest.java (original)
+++ incubator/abdera/java/branches/server_refactor/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleTest.java Sun Jan 20 23:47:42 2008
@@ -53,10 +53,11 @@
     } catch (Exception e) {}
   }
   
-  private int count = 5;
+  private int count = 6;
   
   @Override protected void tearDown() throws Exception {
-    if (--count == 0) server.stop();
+    if (--count == 0) 
+      server.stop();
   }
   
   public void testGetService() {