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/04/15 01:47:17 UTC

svn commit: r648063 - in /incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server: context/ResponseContextException.java impl/AbstractProvider.java

Author: jmsnell
Date: Mon Apr 14 16:47:16 2008
New Revision: 648063

URL: http://svn.apache.org/viewvc?rev=648063&view=rev
Log:
https://issues.apache.org/jira/browse/ABDERA-137 -- minor refactoring of AbstractProvider so 
subclasses can easily override the dispatching for individual target types.

Modified:
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java?rev=648063&r1=648062&r2=648063&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java Mon Apr 14 16:47:16 2008
@@ -58,4 +58,7 @@
     return responseContext.getStatusText();
   }
   
+  public int getStatusCode() {
+    return responseContext.getStatus();
+  }
 }

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java?rev=648063&r1=648062&r2=648063&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java Mon Apr 14 16:47:16 2008
@@ -43,6 +43,7 @@
 import org.apache.abdera.protocol.server.Transactional;
 import org.apache.abdera.protocol.server.WorkspaceInfo;
 import org.apache.abdera.protocol.server.WorkspaceManager;
+import org.apache.abdera.protocol.server.context.ResponseContextException;
 import org.apache.abdera.protocol.server.context.StreamWriterResponseContext;
 import org.apache.abdera.util.Constants;
 import org.apache.abdera.writer.StreamWriter;
@@ -116,20 +117,14 @@
       if (target == null || 
           target.getType() == TargetType.TYPE_NOT_FOUND)
         return ProviderHelper.notfound(request);
-      String method = request.getMethod();
       TargetType type = target.getType();
-      if (type == TargetType.TYPE_SERVICE && 
-          method.equalsIgnoreCase("GET")) {
-          return getServiceDocument(request);
-      }
-      WorkspaceManager wm = getWorkspaceManager(request);
-      
+      if (type == TargetType.TYPE_SERVICE)
+        return processService(request);
+      WorkspaceManager wm = getWorkspaceManager(request);      
       CollectionAdapter adapter = 
         wm.getCollectionAdapter(request);
-      if (adapter == null) {
-        return ProviderHelper.notfound(
-          request);
-      }
+      if (adapter == null)
+        return ProviderHelper.notfound(request);
       
       Transactional transaction = 
         adapter instanceof Transactional ? 
@@ -137,67 +132,144 @@
       ResponseContext response = null;
       try {
         if (transaction != null) transaction.start(request);
-        if (type == TargetType.TYPE_CATEGORIES) {
-          if (method.equalsIgnoreCase("GET"))
-            response = adapter.getCategories(request);
-        } else if (type == TargetType.TYPE_COLLECTION) {
-          if (method.equalsIgnoreCase("GET")) 
-            response = adapter.getFeed(request);
-          else if (method.equalsIgnoreCase("POST")) {
-            response = ProviderHelper.isAtom(request) ?
-              adapter.postEntry(request) :
-              adapter instanceof MediaCollectionAdapter ?
-                ((MediaCollectionAdapter)adapter).postMedia(request) :
-                ProviderHelper.notsupported(request);
-          }
-        } else if (type == TargetType.TYPE_ENTRY) {
-          if (method.equalsIgnoreCase("GET")) 
-            response = adapter.getEntry(request);
-          else if (method.equalsIgnoreCase("PUT")) 
-            response = adapter.putEntry(request);
-          else if (method.equalsIgnoreCase("DELETE")) 
-            response = adapter.deleteEntry(request);
-          else if (method.equalsIgnoreCase("HEAD")) 
-            response = adapter.headEntry(request);
-          else if (method.equalsIgnoreCase("OPTIONS")) 
-            response = adapter.optionsEntry(request);
-        } else if (type == TargetType.TYPE_MEDIA) {
-          if (adapter instanceof MediaCollectionAdapter) {
-            MediaCollectionAdapter mcadapter = 
-              (MediaCollectionAdapter) adapter;
-            if (method.equalsIgnoreCase("GET")) 
-              response = mcadapter.getMedia(request);
-            else if (method.equalsIgnoreCase("PUT")) 
-              response = mcadapter.putMedia(request);
-            else if (method.equalsIgnoreCase("DELETE")) 
-              response = mcadapter.deleteMedia(request);   
-            else if (method.equalsIgnoreCase("HEAD")) 
-              response = mcadapter.headMedia(request);   
-            else if (method.equalsIgnoreCase("OPTIONS")) 
-              response = mcadapter.optionsMedia(request);        
+        if (type == TargetType.TYPE_CATEGORIES)
+          response = processCategories(request, adapter);
+        else if (type == TargetType.TYPE_COLLECTION)
+          response = processCollection(request, adapter);
+        else if (type == TargetType.TYPE_ENTRY)
+          response = processEntry(request, adapter);
+        else if (type == TargetType.TYPE_MEDIA)
+          response = processMedia(request, adapter);
+        response = 
+          response != null ? 
+            response : 
+            processExtensionRequest(
+              request, 
+              adapter);
+        return 
+          response != null ? 
+            response :
+            ProviderHelper.badrequest(request);
+      } catch (Throwable e) {
+        if (e instanceof ResponseContextException) {
+          ResponseContextException rce = (ResponseContextException) e;
+          if (rce.getStatusCode() >= 400 && rce.getStatusCode() < 500) {
+            // don't report routine 4xx HTTP errors
+            log.info(e);
           } else {
-            response = ProviderHelper.notsupported(request);
+            log.error(e);
           }
-        } else if (type == TargetType.TYPE_NOT_FOUND) {
-          response = ProviderHelper.notfound(request);
         } else {
-          response = adapter.extensionRequest(request);
+          log.error(e);
         }
-        if (response == null)
-          response = ProviderHelper.notsupported(request);
-        return response;
-      } catch (Throwable e) {
-        log.error(e);
-        if (transaction != null) 
-          transaction.compensate(request,e);
+        transactionCompensate(transaction, request, e);
         response = ProviderHelper.servererror(request, e);
         return response;
       } finally {
-        if (transaction != null) 
-          transaction.end(request, response);
+        transactionEnd(transaction,request,response);
+      }
+  }
+
+  protected void transactionCompensate(
+    Transactional transactional,
+    RequestContext request,
+    Throwable e) {
+      if (transactional != null) 
+        transactional.compensate(request,e);      
+  }
+  
+  protected void transactionEnd(
+    Transactional transactional, 
+    RequestContext request,
+    ResponseContext response) {
+    if (transactional != null)
+      transactional.end(request,response);
+  }
+  
+  protected void transactionStart(
+    Transactional transactional, 
+    RequestContext request) 
+      throws ResponseContextException {
+    if (transactional != null)
+      transactional.start(request);
+  }
+  
+  protected ResponseContext processService(
+    RequestContext context) {
+      String method = context.getMethod(); 
+      if (method.equalsIgnoreCase("GET"))
+        return getServiceDocument(context);
+      else return null;
+  }
+  
+  protected ResponseContext processExtensionRequest(
+    RequestContext context, 
+    CollectionAdapter adapter) {    
+      return adapter.extensionRequest(context);
+  }
+  
+  protected ResponseContext processCategories(
+    RequestContext context, 
+    CollectionAdapter adapter) {
+      return context.getMethod().equalsIgnoreCase("GET") ?
+        adapter.getCategories(context) : null;
+  }
+  
+  protected ResponseContext processCollection(
+    RequestContext context,
+    CollectionAdapter adapter) {
+      String method = context.getMethod();
+      if (method.equalsIgnoreCase("GET")) 
+        return adapter.getFeed(context);
+      else if (method.equalsIgnoreCase("POST")) {
+        return ProviderHelper.isAtom(context) ?
+          adapter.postEntry(context) :
+          adapter instanceof MediaCollectionAdapter ?
+            ((MediaCollectionAdapter)adapter).postMedia(context) :
+            ProviderHelper.notsupported(context);
+      } else return null;
+  }
+  
+  protected ResponseContext processEntry(
+    RequestContext context,
+    CollectionAdapter adapter) {
+      String method = context.getMethod();
+      if (method.equalsIgnoreCase("GET")) 
+        return adapter.getEntry(context);
+      else if (method.equalsIgnoreCase("PUT")) 
+        return adapter.putEntry(context);
+      else if (method.equalsIgnoreCase("DELETE")) 
+        return adapter.deleteEntry(context);
+      else if (method.equalsIgnoreCase("HEAD")) 
+        return adapter.headEntry(context);
+      else if (method.equalsIgnoreCase("OPTIONS")) 
+        return adapter.optionsEntry(context);
+      else return null;
+  }
+  
+  protected ResponseContext processMedia(
+    RequestContext context,
+    CollectionAdapter adapter) {
+      String method = context.getMethod();
+      if (adapter instanceof MediaCollectionAdapter) {
+        MediaCollectionAdapter mcadapter = 
+          (MediaCollectionAdapter) adapter;
+        if (method.equalsIgnoreCase("GET")) 
+          return mcadapter.getMedia(context);
+        else if (method.equalsIgnoreCase("PUT")) 
+          return mcadapter.putMedia(context);
+        else if (method.equalsIgnoreCase("DELETE")) 
+          return mcadapter.deleteMedia(context);   
+        else if (method.equalsIgnoreCase("HEAD")) 
+          return mcadapter.headMedia(context);   
+        else if (method.equalsIgnoreCase("OPTIONS")) 
+          return mcadapter.optionsMedia(context);
+        else return null;
+      } else {
+        return ProviderHelper.notsupported(context);
       }
   }
-   
+  
   protected abstract WorkspaceManager getWorkspaceManager(
     RequestContext request);