abdera-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jmsn...@apache.org
Subject svn commit: r584318 - in /incubator/abdera/java/trunk/server/src: main/java/org/apache/abdera/protocol/server/ main/java/org/apache/abdera/protocol/server/content/ test/java/org/apache/abdera/server/protocol/server/content/
Date Fri, 12 Oct 2007 23:21:51 GMT
Author: jmsnell
Date: Fri Oct 12 16:21:49 2007
New Revision: 584318

URL: http://svn.apache.org/viewvc?rev=584318&view=rev
Log:
Commit https://issues.apache.org/jira/browse/ABDERA-73. There was one change to FOMEntry included
in the patch that I omitted from this as it did not appear to be directly relevant.

Added:
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/ResponseContextException.java
Modified:
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/HttpResponse.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractCollectionProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractWorkspaceProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/CollectionProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/SimpleWorkspaceInfo.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceInfo.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceProvider.java
    incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/ContentProviderTest.java
    incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/CustomerContentProvider.java

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/HttpResponse.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/HttpResponse.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/HttpResponse.java
(original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/HttpResponse.java
Fri Oct 12 16:21:49 2007
@@ -1,3 +1,20 @@
+/*
+* 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;
 
 import java.io.IOException;

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractCollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractCollectionProvider.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractCollectionProvider.java
(original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractCollectionProvider.java
Fri Oct 12 16:21:49 2007
@@ -1,3 +1,20 @@
+/*
+* 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.content;
 
 import java.io.IOException;
@@ -14,6 +31,7 @@
 import org.apache.abdera.model.Document;
 import org.apache.abdera.model.Entry;
 import org.apache.abdera.model.Feed;
+import org.apache.abdera.model.Text;
 import org.apache.abdera.parser.ParseException;
 import org.apache.abdera.parser.Parser;
 import org.apache.abdera.protocol.server.RequestContext;
@@ -25,10 +43,13 @@
 import org.apache.abdera.protocol.server.impl.ProviderSupport;
 import org.apache.abdera.util.EntityTag;
 import org.apache.abdera.util.MimeTypeHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 public abstract class AbstractCollectionProvider<T> extends ProviderSupport
   implements CollectionProvider<T> {
-
+  private final static Log log = LogFactory.getLog(AbstractCollectionProvider.class);
+  
   private String baseMediaIri = "media/";
   
   public ResponseContext createEntry(RequestContext request) {
@@ -53,9 +74,9 @@
     return ctype != null && !MimeTypeHelper.isAtom(ctype) /*&& !MimeTypeHelper.isXml(ctype)*/;
   }
   
-  public abstract T createEntry(String title, String summary, Content content);
+  public abstract T createEntry(String title, String summary, Content content) throws ResponseContextException;
   
-  public T createMediaEntry(MimeType mimeType, String slug, InputStream inputStream) {
+  public T createMediaEntry(MimeType mimeType, String slug, InputStream inputStream) throws
ResponseContextException {
     throw new UnsupportedOperationException();
   }
   
@@ -63,8 +84,12 @@
     String id = getEntryID(request);
     if (id != null) {
 
-      deleteEntry(id);
-
+      try {
+        deleteEntry(id);
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
+      
       return new EmptyResponseContext(204);
     } else {
       // TODO: is this right?
@@ -72,15 +97,15 @@
     }
   }
 
-  public abstract void deleteEntry(String resourceName);
+  public abstract void deleteEntry(String resourceName) throws ResponseContextException;
 
-  public abstract String getAuthor();
+  public abstract String getAuthor() throws ResponseContextException;
 
   public String getBaseMediaIri() {
     return baseMediaIri;
   }
   
-  public abstract Object getContent(T entry);
+  public abstract Object getContent(T entry) throws ResponseContextException;
   
   // GET, POST, PUT, DELETE
   
@@ -88,31 +113,35 @@
     throw new UnsupportedOperationException();
   }
   
-  public abstract Iterable<T> getEntries();
+  public abstract Iterable<T> getEntries() throws ResponseContextException;
   
   public ResponseContext getEntry(RequestContext request, IRI entryBaseIri) {
-    Entry entry = getEntryFromCollectionProvider(entryBaseIri,
-                                                 request);
-    if (entry != null) {
-      Feed feed = createDocumentsFeed(request.getAbdera());
-      entry.setSource(feed.getAsSource());
-      Document<Entry> entry_doc = entry.getDocument();
-      AbstractResponseContext rc = new BaseResponseContext<Document<Entry>>(entry_doc);
-      rc.setEntityTag(calculateEntityTag(entry));
-      return rc;
-    } else {
-      return new EmptyResponseContext(404);
+    try {
+      Entry entry = getEntryFromCollectionProvider(entryBaseIri,
+                                                   request);
+      if (entry != null) {
+        Feed feed = createFeed(request.getAbdera());
+        entry.setSource(feed.getAsSource());
+        Document<Entry> entry_doc = entry.getDocument();
+        AbstractResponseContext rc = new BaseResponseContext<Document<Entry>>(entry_doc);
+        rc.setEntityTag(calculateEntityTag(entry));
+        return rc;
+      } else {
+        return new EmptyResponseContext(404);
+      }
+    } catch (ResponseContextException e) {
+      return createErrorResponse(e);
     }
   }
   
-  public abstract T getEntry(String resourceName);
+  public abstract T getEntry(String resourceName) throws ResponseContextException;
   
-  public abstract T getEntryFromId(String id);
+  public abstract T getEntryFromId(String id) throws ResponseContextException;
 
 
   public ResponseContext getFeed(RequestContext request) {
     Abdera abdera = request.getAbdera();
-    Feed feed = createDocumentsFeed(abdera);
+    Feed feed = createFeed(abdera);
     
     return getFeed(request, feed);
   }
@@ -120,26 +149,60 @@
   public ResponseContext getFeed(RequestContext request, Feed feed) {
     feed.setUpdated(new Date());
 
-    for (T entryObj : getEntries()) {
-      Entry e = feed.addEntry();
+    IRI baseIri = resolveBase(request);
+    IRI entryIri = getEntryBaseFromFeedIRI(baseIri);
+    
+    try {
+      Iterable<T> entries = getEntries();
+      if (entries != null) {
+        for (T entryObj : entries) {
+          Entry e = feed.addEntry();
+    
+          addEntryDetails(request, e, entryIri, entryObj);
 
-      addEntryDetails(request, e, resolveBase(request), entryObj);
-      addContent(e, entryObj);
+          if (isMediaEntry(entryObj)) {
+            addMediaContent(entryIri, e, entryObj);
+          } else {
+            addContent(e, entryObj);
+          }
+        }
+      }
+  
+      Document<Feed> document = feed.getDocument();
+      AbstractResponseContext rc = new BaseResponseContext<Document<Feed>>(document);
+      rc.setEntityTag(calculateEntityTag(document.getRoot()));
+      return rc;
+    } catch (ResponseContextException e) {
+      return createErrorResponse(e);
     }
+    
+  }
 
-    Document<Feed> document = feed.getDocument();
-    AbstractResponseContext rc = new BaseResponseContext<Document<Feed>>(document);
-    rc.setEntityTag(calculateEntityTag(document.getRoot()));
-    return rc;
+  /**
+   * 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.isDebugEnabled()) {
+      log.debug("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 abstract String getId();
+  
   /**
    * Gets the UUID for the specified entry.
    * @param entry
    * @return
    */
-  public abstract String getId(T entry);
+  public abstract String getId(T entry) throws ResponseContextException;
 
   public ResponseContext getMedia(RequestContext request) {
     try {
@@ -172,13 +235,13 @@
     throw new UnsupportedOperationException();
   }
   
-  public abstract String getName(T entry);
+  public abstract String getName(T entry) throws ResponseContextException;
 
   public abstract String getTitle();
 
-  public abstract String getTitle(T entry);
+  public abstract String getTitle(T entry) throws ResponseContextException;
 
-  public abstract Date getUpdated(T entry);
+  public abstract Date getUpdated(T entry) throws ResponseContextException;
 
   public boolean isMediaEntry(T entry) {
     return false;
@@ -190,9 +253,10 @@
 
   public ResponseContext updateEntry(RequestContext request, IRI feedUri) {
     Abdera abdera = request.getAbdera();
-    Entry orig_entry = getEntryFromCollectionProvider(feedUri, request);
-    if (orig_entry != null) {
-      try {
+    try {
+      Entry orig_entry = getEntryFromCollectionProvider(feedUri, request);
+      if (orig_entry != null) {
+
         MimeType contentType = request.getContentType();
         if (contentType != null && !MimeTypeHelper.isAtom(contentType.toString()))
           return new EmptyResponseContext(415);
@@ -212,28 +276,31 @@
 
           // entryObjProvider.updateEntry(entry)
 
-          Feed feed = createDocumentsFeed(abdera);
+          Feed feed = createFeed(abdera);
           feed.insertEntry(entry);
           feed.setUpdated(new Date());
           return new EmptyResponseContext(204);
         } else {
           return new EmptyResponseContext(400);
         }
-      } catch (ParseException pe) {
-        return new EmptyResponseContext(415);
-      } catch (ClassCastException cce) {
-        return new EmptyResponseContext(415);
-      } catch (Exception e) {
-        return new EmptyResponseContext(400);
+      } else {
+        return new EmptyResponseContext(404);
       }
-    } else {
-      return new EmptyResponseContext(404);
+    } catch (ResponseContextException e) {
+      return createErrorResponse(e);
+    } catch (ParseException pe) {
+      return new EmptyResponseContext(415);
+    } catch (ClassCastException cce) {
+      return new EmptyResponseContext(415);
+    } catch (Exception e) {
+      return new EmptyResponseContext(400);
     }
+    
   }
 
   public abstract T updateEntry(T entry, Content content);
 
-  protected void addContent(Entry e, T doc) {
+  protected void addContent(Entry e, T doc) throws ResponseContextException {
     Object content = getContent(doc);
 
     if (content instanceof Content) {
@@ -244,12 +311,20 @@
   }
 
   protected void addEntryDetails(RequestContext request, Entry e, 
-                               IRI entryBaseIri, T entryObj) {
+                               IRI entryBaseIri, T entryObj) throws ResponseContextException
{
     IRI entryIri = entryBaseIri.resolve(getName(entryObj));
-    e.addLink(entryIri.toString(), "edit");
+    e.addLink(entryIri.toASCIIString(), "edit");
     e.setId(getId(entryObj));
     e.setTitle(getTitle(entryObj));
     e.setUpdated(getUpdated(entryObj));
+    Text t = getSummary(entryObj);
+    if (t != null) {
+      e.setSummaryElement(t);
+    }
+  }
+
+  public Text getSummary(T entry) {
+    return null;
   }
 
   protected void addMediaContent(IRI entryBaseIri, Entry entry, T doc) {
@@ -258,7 +333,7 @@
     mediaIri = entryBaseIri.resolve(mediaIri);
 
     entry.setContent(mediaIri, getContentType(doc));
-    entry.addLink(mediaIri.toString(), "edit-media");
+    entry.addLink(mediaIri.toASCIIString(), "edit-media");
   }
 
   protected EntityTag calculateEntityTag(Base base) {
@@ -273,7 +348,7 @@
     }
     return EntityTag.generate(id, modified);
   }
-  protected Feed createDocumentsFeed(Abdera abdera) {
+  protected Feed createFeed(Abdera abdera) {
     Factory factory = abdera.getFactory();
     Feed feed = factory.newFeed();
     try {
@@ -308,6 +383,8 @@
       return rc;
     } catch (IOException e) {
       return new EmptyResponseContext(500);
+    } catch (ResponseContextException e) {
+      return createErrorResponse(e);
     }
   }
 
@@ -320,31 +397,35 @@
 
       entry.setUpdated(new Date());
       
-      T entryObj = createEntry(entry.getTitle(), entry.getSummary(), 
-                                        entry.getContentElement());
-      entry.getIdElement().setValue(getId(entryObj));
-      
-      IRI entryBaseUri = getEntryBaseFromFeedIRI(resolveBase(request));
+      try {
+        T entryObj = createEntry(entry.getTitle(), entry.getSummary(), 
+                                          entry.getContentElement());
+        entry.getIdElement().setValue(getId(entryObj));
       
-      IRI entryIri = entryBaseUri.resolve(getName(entryObj));
-      entry.addLink(entryIri.toString(), "edit");
-
-      BaseResponseContext<Entry> rc = new BaseResponseContext<Entry>(entry);
-      rc.setLocation(entryIri.resolve(entry.getEditLinkResolvedHref()).toString());
-      rc.setContentLocation(rc.getLocation().toString());
-      rc.setEntityTag(calculateEntityTag(entry));
-      rc.setStatus(201);
-      return rc;
+        IRI entryBaseUri = getEntryBaseFromFeedIRI(resolveBase(request));
+        
+        IRI entryIri = entryBaseUri.resolve(getName(entryObj));
+        entry.addLink(entryIri.toASCIIString(), "edit");
+  
+        BaseResponseContext<Entry> rc = new BaseResponseContext<Entry>(entry);
+        rc.setLocation(entryIri.resolve(entry.getEditLinkResolvedHref()).toString());
+        rc.setContentLocation(rc.getLocation().toString());
+        rc.setEntityTag(calculateEntityTag(entry));
+        rc.setStatus(201);
+        return rc;
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
     } else {
       return new EmptyResponseContext(400);
     }
   }
 
   protected IRI getEntryBaseFromFeedIRI(IRI baseIri) {
-    return new IRI(baseIri + "/");
+    return new IRI(baseIri.toASCIIString() + "/");
   }
 
-  protected Entry getEntryFromCollectionProvider(IRI feedIri, RequestContext request) {
+  protected Entry getEntryFromCollectionProvider(IRI feedIri, RequestContext request) throws
ResponseContextException {
 
     String id = getEntryID(request);
     T entryObj = getEntry(id);

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractWorkspaceProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractWorkspaceProvider.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractWorkspaceProvider.java
(original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/AbstractWorkspaceProvider.java
Fri Oct 12 16:21:49 2007
@@ -1,10 +1,30 @@
+/*
+* 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.content;
 
+import java.io.UnsupportedEncodingException;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.abdera.Abdera;
 import org.apache.abdera.factory.Factory;
+import org.apache.abdera.i18n.iri.Constants;
+import org.apache.abdera.i18n.iri.Escaping;
 import org.apache.abdera.i18n.iri.IRI;
 import org.apache.abdera.model.Collection;
 import org.apache.abdera.model.Document;
@@ -15,10 +35,14 @@
 import org.apache.abdera.protocol.server.impl.AbstractProvider;
 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.util.EntityTag;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 public abstract class AbstractWorkspaceProvider extends AbstractProvider {
-
+  private final static Log log = LogFactory.getLog(AbstractWorkspaceProvider.class);
+  
     private EntityTag service_etag = new EntityTag("simple");
     
     protected AbstractWorkspaceProvider(int count) {
@@ -27,14 +51,22 @@
 
     public ResponseContext getService(RequestContext request) {
       Abdera abdera = request.getAbdera();
-      Document<Service> service = getServicesDocument(abdera);
+      Document<Service> service = getServicesDocument(abdera, getEncoding(request));
       AbstractResponseContext rc = new BaseResponseContext<Document<Service>>(service);
       rc.setEntityTag(service_etag);
       return rc;
     }
 
+    private String getEncoding(RequestContext request) {
+      return "utf-8";
+    }
+    
     @SuppressWarnings("unchecked")
-    private Document<Service> getServicesDocument(Abdera abdera) {
+    private Document<Service> getServicesDocument(Abdera abdera, String enc) {    
     
+      if (enc == null) {
+        enc = "utf-8";
+      }
+      
       Factory factory = abdera.getFactory();
       Service service = factory.newService();
       for (WorkspaceInfo wp : getWorkspaces()) {
@@ -43,8 +75,17 @@
           (Set<Map.Entry<String, CollectionProvider>>) (wp.getCollectionProviders().entrySet());
         for (Map.Entry<String, CollectionProvider> entry : entrySet) {
           CollectionProvider<?> cp = entry.getValue();
+
+          String id;
+          String workspaceKey;
+          try {
+            id = Escaping.encode(wp.getId(), enc, Constants.PATH);
+            workspaceKey = Escaping.encode(entry.getKey(), enc, Constants.PATH);
+          } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+          }
           Collection collection = workspace.addCollection(cp.getTitle(), 
-                                                          wp.getId() + "/" + entry.getKey());
+                                                          id + "/" + workspaceKey);
           collection.setAccept("entry");
           // collection.addCategories().setFixed(false);
         }
@@ -55,14 +96,18 @@
     public abstract java.util.Collection<WorkspaceInfo> getWorkspaces();
 
     public ResponseContext getFeed(RequestContext request) {
-      CollectionProvider provider = getCollectionProvider(resolveBase(request), request);
-      
-      return provider.getFeed(request);
+      try {
+        CollectionProvider provider = getCollectionProvider(resolveBase(request), request);
+        
+        return provider.getFeed(request);
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
     }
 
     @SuppressWarnings("unchecked")
     private <T> CollectionProvider<T> getCollectionProvider(IRI resolveBase,

-                                                      RequestContext request) {
+                                                            RequestContext request) throws
ResponseContextException {
       String path = resolveBase.getPath();
       String[] paths = path.split("/");
       if (paths.length < 1) {
@@ -85,20 +130,44 @@
       }
     }
 
+    /**
+     * 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.isDebugEnabled()) {
+        log.debug("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();
+    }
     protected abstract WorkspaceInfo<?> getWorkspaceInfo(String string);
 
     public ResponseContext createEntry(RequestContext request) {
-      CollectionProvider provider = getCollectionProvider(request.getUri(), request);
-      
-      return provider.createEntry(request);
+      try {
+        CollectionProvider provider = getCollectionProvider(request.getUri(), request);
+        
+        return provider.createEntry(request);
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
     }
 
     @Override
     public ResponseContext getMedia(RequestContext request) {
-      IRI entryBaseIri = resolveBase(request).resolve("../");
-      CollectionProvider provider = getCollectionProvider(entryBaseIri, request);
-
-      return provider.getMedia(request);
+      try {
+        IRI entryBaseIri = resolveBase(request).resolve("../");
+        CollectionProvider provider = getCollectionProvider(entryBaseIri, request);
+  
+        return provider.getMedia(request);
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
     }
 
 
@@ -109,25 +178,37 @@
     }
 
     public ResponseContext deleteEntry(RequestContext request) {
-      CollectionProvider<?> provider = getCollectionProvider(resolveBase(request).resolve("./"),
request);
-
-      return provider.deleteEntry(request);
+      try {
+        CollectionProvider<?> provider = getCollectionProvider(resolveBase(request).resolve("./"),
request);
+      
+        return provider.deleteEntry(request);
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
     }
 
     
     public ResponseContext getEntry(RequestContext request) {
-      IRI entryBaseIri = resolveBase(request).resolve("./");
-      CollectionProvider provider = getCollectionProvider(entryBaseIri, request);
-
-      return provider.getEntry(request, entryBaseIri);
+      try {
+        IRI entryBaseIri = resolveBase(request).resolve("./");
+        CollectionProvider provider = getCollectionProvider(entryBaseIri, request);
+  
+        return provider.getEntry(request, entryBaseIri);
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
     }
 
     @SuppressWarnings("unchecked")
     public ResponseContext updateEntry(RequestContext request) {
-      IRI entryBaseIri = resolveBase(request).resolve("./");
-      CollectionProvider provider = getCollectionProvider(entryBaseIri, request);
-
-      return provider.updateEntry(request, entryBaseIri);
+      try {
+        IRI entryBaseIri = resolveBase(request).resolve("./");
+        CollectionProvider provider = getCollectionProvider(entryBaseIri, request);
+  
+        return provider.updateEntry(request, entryBaseIri);
+      } catch (ResponseContextException e) {
+        return createErrorResponse(e);
+      }
     }
 
 

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/CollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/CollectionProvider.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/CollectionProvider.java
(original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/CollectionProvider.java
Fri Oct 12 16:21:49 2007
@@ -1,3 +1,20 @@
+/*
+* 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.content;
 
 import java.io.InputStream;

Added: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/ResponseContextException.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/ResponseContextException.java?rev=584318&view=auto
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/ResponseContextException.java
(added)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/ResponseContextException.java
Fri Oct 12 16:21:49 2007
@@ -0,0 +1,47 @@
+/*
+* 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.content;
+
+import org.apache.abdera.protocol.server.impl.AbstractResponseContext;
+import org.apache.abdera.protocol.server.impl.EmptyResponseContext;
+
+public class ResponseContextException extends Exception {
+  private AbstractResponseContext responseContext;
+
+  public ResponseContextException(AbstractResponseContext responseContext, Throwable t) {
+    super(t);
+    this.responseContext = responseContext;
+  }
+
+  public ResponseContextException(AbstractResponseContext responseContext) {
+    super();
+    this.responseContext = responseContext;
+  }
+
+  public ResponseContextException(int responseCode) {
+    this(new EmptyResponseContext(responseCode));
+  }
+
+  public ResponseContextException(int responseCode, Throwable t) {
+    this(new EmptyResponseContext(responseCode), t);
+  }
+
+  public AbstractResponseContext getResponseContext() {
+    return responseContext;
+  }
+}

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/SimpleWorkspaceInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/SimpleWorkspaceInfo.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/SimpleWorkspaceInfo.java
(original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/SimpleWorkspaceInfo.java
Fri Oct 12 16:21:49 2007
@@ -1,3 +1,20 @@
+/*
+* 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.content;
 
 import java.util.Collection;

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceInfo.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceInfo.java
(original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceInfo.java
Fri Oct 12 16:21:49 2007
@@ -1,3 +1,20 @@
+/*
+* 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.content;
 
 import java.util.Map;
@@ -10,6 +27,6 @@
 
   Map<String, CollectionProvider<T>> getCollectionProviders();
 
-  CollectionProvider<T> getCollectionProvider(String id);
+  CollectionProvider<T> getCollectionProvider(String id) throws ResponseContextException;
 
 }

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceProvider.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceProvider.java
(original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/content/WorkspaceProvider.java
Fri Oct 12 16:21:49 2007
@@ -1,3 +1,20 @@
+/*
+* 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.content;
 
 import java.util.Collection;

Modified: incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/ContentProviderTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/ContentProviderTest.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/ContentProviderTest.java
(original)
+++ incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/ContentProviderTest.java
Fri Oct 12 16:21:49 2007
@@ -113,6 +113,8 @@
     org.apache.abdera.model.Document<Entry> entry_doc = res.getDocument();
     entry = entry_doc.getRoot();
 
+    res = client.get(colUri + "/foobar");
+    assertEquals(404, res.getStatus());
   }
 
   private void prettyPrint(Abdera abdera, Base doc) throws IOException {

Modified: incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/CustomerContentProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/CustomerContentProvider.java?rev=584318&r1=584317&r2=584318&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/CustomerContentProvider.java
(original)
+++ incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/server/protocol/server/content/CustomerContentProvider.java
Fri Oct 12 16:21:49 2007
@@ -12,6 +12,7 @@
 import org.apache.abdera.model.Content;
 import org.apache.abdera.model.Element;
 import org.apache.abdera.protocol.server.content.AbstractCollectionProvider;
+import org.apache.abdera.protocol.server.content.ResponseContextException;
 import sun.security.pkcs.ContentInfo;
 
 public class CustomerContentProvider extends AbstractCollectionProvider<Customer> {
@@ -45,7 +46,7 @@
     return customer;
   }
 
-  public void deleteEntry(String resourceName) {
+  public void deleteEntry(String resourceName) throws ResponseContextException {
     Integer id = getIdFromResourceName(resourceName);
     customers.remove(id);
   }
@@ -67,15 +68,15 @@
     return customers.values();
   }
 
-  public Customer getEntry(String resourceName) {
+  public Customer getEntry(String resourceName) throws ResponseContextException {
     Integer id = getIdFromResourceName(resourceName);
     return customers.get(id);
   }
 
-  private Integer getIdFromResourceName(String resourceName) {
+  private Integer getIdFromResourceName(String resourceName) throws ResponseContextException
{
     int idx = resourceName.indexOf("-");
     if (idx == -1) {
-      // TODO: exception handling for 404 Not found
+      throw new ResponseContextException(404);
     }
     Integer id = new Integer(resourceName.substring(0, idx));
     return id;



Mime
View raw message