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 2007/02/21 19:05:43 UTC
svn commit: r510127 - in /incubator/abdera/java/trunk:
examples/src/main/java/org/apache/abdera/examples/appserver/
protocol/src/main/java/org/apache/abdera/protocol/
server/src/main/java/org/apache/abdera/protocol/server/provider/
server/src/main/java...
Author: jmsnell
Date: Wed Feb 21 10:05:42 2007
New Revision: 510127
URL: http://svn.apache.org/viewvc?view=rev&rev=510127
Log:
* eliminate Provider.getInfo method. not necessary
* do not do http request precondition checking in the default request handler.
easier to do this in the Provider
* eliminate the "full" param on the Provider methods. Not useful
* refactor the default request handler to shift out some unused, likely not useful code
* eliminate the ResponseInfo interface. not used any more
Added:
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/TypeRequestHandler.java
Removed:
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/ResponseInfo.java
Modified:
incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Response.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbstractRequestHandler.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/DefaultRequestHandler.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/HttpServletRequestContext.java
Modified: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java?view=diff&rev=510127&r1=510126&r2=510127
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java (original)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java Wed Feb 21 10:05:42 2007
@@ -34,7 +34,6 @@
import org.apache.abdera.parser.ParseException;
import org.apache.abdera.parser.Parser;
import org.apache.abdera.protocol.EntityTag;
-import org.apache.abdera.protocol.ResponseInfo;
import org.apache.abdera.protocol.server.provider.AbstractResponseContext;
import org.apache.abdera.protocol.server.provider.BaseResponseContext;
import org.apache.abdera.protocol.server.provider.EmptyResponseContext;
@@ -94,41 +93,25 @@
}
public ResponseContext getService(
- RequestContext request,
- boolean full) {
+ RequestContext request) {
Abdera abdera = request.getServiceContext().getAbdera();
Document<Service> service = get_service_doc(abdera);
AbstractResponseContext rc;
- rc = (full) ?
- new BaseResponseContext<Document<Service>>(service) :
- new EmptyResponseContext(200);
+ rc = new BaseResponseContext<Document<Service>>(service);
rc.setEntityTag(service_etag);
return rc;
}
public ResponseContext getFeed(
- RequestContext request,
- boolean full) {
+ RequestContext request) {
Abdera abdera = request.getServiceContext().getAbdera();
Document<Feed> feed = get_feed_doc(abdera);
AbstractResponseContext rc;
- rc = (full) ?
- new BaseResponseContext<Document<Feed>>(feed) :
- new EmptyResponseContext(200);
+ rc = new BaseResponseContext<Document<Feed>>(feed);
rc.setEntityTag(calculateEntityTag(feed.getRoot()));
return rc;
}
- public ResponseInfo getInfo(
- RequestContext request) {
- TargetType type = request.getTarget().getType();
- if (type == TargetType.TYPE_SERVICE) return getService(request, false);
- if (type == TargetType.TYPE_COLLECTION) return getFeed(request, false);
- if (type == TargetType.TYPE_ENTRY) return getEntry(request, false);
- return null;
- }
-
-
@SuppressWarnings("unchecked")
public ResponseContext createEntry(
RequestContext request) {
@@ -178,24 +161,21 @@
public ResponseContext deleteEntry(
RequestContext request) {
- Entry entry = getEntry(request);
+ Entry entry = getAbderaEntry(request);
if (entry != null)
entry.discard();
return new EmptyResponseContext(204);
}
public ResponseContext getEntry(
- RequestContext request,
- boolean full) {
- Entry entry = (Entry) getEntry(request);
+ 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();
- AbstractResponseContext rc = (full) ?
- new BaseResponseContext<Document<Entry>>(entry_doc) :
- new EmptyResponseContext(200);
+ AbstractResponseContext rc = new BaseResponseContext<Document<Entry>>(entry_doc);
rc.setEntityTag(calculateEntityTag(entry));
return rc;
} else {
@@ -209,7 +189,7 @@
Abdera abdera = request.getServiceContext().getAbdera();
Parser parser = abdera.getParser();
Factory factory = abdera.getFactory();
- Entry orig_entry = getEntry(request);
+ Entry orig_entry = getAbderaEntry(request);
if (orig_entry != null) {
try {
MimeType contentType = request.getContentType();
@@ -268,7 +248,7 @@
return null;
}
- private Entry getEntry(RequestContext request) {
+ private Entry getAbderaEntry(RequestContext request) {
Abdera abdera = request.getServiceContext().getAbdera();
String entry_id = getEntryID(request);
Document<Feed> feed = get_feed_doc(abdera);
@@ -302,8 +282,7 @@
}
public ResponseContext getMedia(
- RequestContext request,
- boolean full) {
+ RequestContext request) {
throw new UnsupportedOperationException();
}
@@ -329,7 +308,7 @@
return true;
}
- public ResponseContext getCategories(RequestContext request, boolean full) {
+ public ResponseContext getCategories(RequestContext request) {
return null;
}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Response.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Response.java?view=diff&rev=510127&r1=510126&r2=510127
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Response.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Response.java Wed Feb 21 10:05:42 2007
@@ -29,7 +29,7 @@
import org.apache.abdera.util.iri.IRISyntaxException;
public interface Response
- extends ResponseInfo, ProtocolConstants {
+ extends ProtocolConstants {
public static enum ResponseType {
SUCCESS, REDIRECTION, CLIENT_ERROR, SERVER_ERROR, UNKNOWN;
@@ -44,6 +44,8 @@
}
+ public EntityTag getEntityTag();
+
public ResponseType getType();
public int getStatus();
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java?view=diff&rev=510127&r1=510126&r2=510127
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java Wed Feb 21 10:05:42 2007
@@ -17,12 +17,8 @@
*/
package org.apache.abdera.protocol.server.provider;
-import org.apache.abdera.protocol.ResponseInfo;
-
public interface Provider {
- ResponseInfo getInfo(RequestContext request);
-
ResponseContext createEntry(RequestContext request);
ResponseContext deleteEntry(RequestContext request);
@@ -33,15 +29,15 @@
ResponseContext updateMedia(RequestContext request);
- ResponseContext getService(RequestContext request, boolean full);
+ ResponseContext getService(RequestContext request);
- ResponseContext getFeed(RequestContext request, boolean full);
+ ResponseContext getFeed(RequestContext request);
- ResponseContext getEntry(RequestContext request, boolean full);
+ ResponseContext getEntry(RequestContext request);
- ResponseContext getMedia(RequestContext request, boolean full);
+ ResponseContext getMedia(RequestContext request);
- ResponseContext getCategories(RequestContext request, boolean full);
+ ResponseContext getCategories(RequestContext request);
ResponseContext entryPost(RequestContext request);
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbstractRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbstractRequestHandler.java?view=diff&rev=510127&r1=510126&r2=510127
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbstractRequestHandler.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbstractRequestHandler.java Wed Feb 21 10:05:42 2007
@@ -28,8 +28,6 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.abdera.protocol.EntityTag;
-import org.apache.abdera.protocol.ResponseInfo;
import org.apache.abdera.protocol.server.ServiceContext;
import org.apache.abdera.protocol.server.provider.EmptyResponseContext;
import org.apache.abdera.protocol.server.provider.Provider;
@@ -97,12 +95,6 @@
getAllowedMethods(target.getType()));
return false;
}
- // Check The Conditions
- ResponseInfo info = provider.getInfo(request);
- switch(checkConditions(info, request)) {
- case 412: preconditionfailed(response); return false;
- case 304: notmodified(response); return false;
- }
return true;
}
@@ -164,44 +156,6 @@
ServiceContext context,
HttpServletRequest request) {
return new HttpServletRequestContext(context, request);
- }
-
- protected int checkConditions(
- ResponseInfo info,
- RequestContext request) {
- EntityTag entity_tag = (info != null) ? info.getEntityTag() : null;
- Date last_mod = (info != null) ? info.getLastModified() : null;
- if (entity_tag != null) {
- String ifmatch = request.getIfMatch();
- if (ifmatch != null &&
- (entity_tag == null ||
- !EntityTag.matches(entity_tag,ifmatch))) {
- return 412;
- }
- String ifnonematch = request.getIfNoneMatch();
- if (ifnonematch != null &&
- entity_tag != null &&
- EntityTag.matches(entity_tag,ifnonematch)) {
- return 304;
- }
- }
- if (last_mod != null) {
- Date ifmodsince = request.getIfModifiedSince();
- if (ifmodsince != null &&
- last_mod.getTime() <= ifmodsince.getTime()) return 304;
- Date ifunmodsince = request.getIfUnmodifiedSince();
- if (ifunmodsince != null &&
- last_mod.getTime() > ifunmodsince.getTime()) return 412;
- }
- return 0;
- }
-
- protected void preconditionfailed(HttpServletResponse response) throws IOException {
- response.sendError(412, "Failed");
- }
-
- protected void notmodified(HttpServletResponse response) throws IOException {
- response.sendError(304, "Not Modified");
}
protected void noprovider(HttpServletResponse response) throws IOException {
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/DefaultRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/DefaultRequestHandler.java?view=diff&rev=510127&r1=510126&r2=510127
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/DefaultRequestHandler.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/DefaultRequestHandler.java Wed Feb 21 10:05:42 2007
@@ -17,9 +17,6 @@
*/
package org.apache.abdera.protocol.server.servlet;
-import java.util.HashMap;
-import java.util.Map;
-
import org.apache.abdera.protocol.server.provider.AbstractResponseContext;
import org.apache.abdera.protocol.server.provider.EmptyResponseContext;
import org.apache.abdera.protocol.server.provider.Provider;
@@ -31,153 +28,80 @@
extends AbstractRequestHandler
implements RequestHandler {
- public static interface TypeHandler {
- ResponseContext process(Provider provider, RequestContext request);
- }
-
- private static class TypeMethod {
- private TargetType type;
- private String method;
- public int hashCode() {
- final int PRIME = 31;
- int result = 1;
- result = PRIME * result + ((method == null) ? 0 : method.hashCode());
- result = PRIME * result + ((type == null) ? 0 : type.hashCode());
- return result;
- }
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- final TypeMethod other = (TypeMethod) obj;
- if (method == null) {
- if (other.method != null)
- return false;
- } else if (!method.equals(other.method))
- return false;
- if (type == null) {
- if (other.type != null)
- return false;
- } else if (!type.equals(other.type))
- return false;
- return true;
- }
- }
-
- private final Map<TargetType,TypeHandler> typehandlers = new HashMap<TargetType,TypeHandler>();
- private final Map<TypeMethod,TypeHandler> typemethodhandlers = new HashMap<TypeMethod,TypeHandler>();
-
- private TypeMethod getTypeMethod(TargetType type, String method) {
- TypeMethod tm = new TypeMethod();
- tm.type = type;
- tm.method = method;
- return tm;
- }
-
- protected synchronized void setTypeMethodHandler(TargetType type, String method, TypeHandler handler) {
- typemethodhandlers.put(getTypeMethod(type,method), handler);
- }
-
- protected synchronized void setTypeHandler(TargetType type, TypeHandler handler) {
- typehandlers.put(type,handler);
- }
-
- private TypeHandler getHandler(TargetType type) {
- return typehandlers.get(type);
- }
-
- private TypeHandler getMethodHandler(TargetType type, String method) {
- return typemethodhandlers.get(getTypeMethod(type, method));
- }
-
protected ResponseContext process(
Provider provider,
RequestContext request) {
TargetType type = request.getTarget().getType();
- TypeHandler handler = getHandler(type);
- if (handler == null) {
- String method = request.getMethod().intern();
-
- handler = getMethodHandler(type,method);
+ String method = request.getMethod();
- if (handler == null) {
- if (method == "GET") {
- if (type == TargetType.TYPE_SERVICE) {
- return provider.getService(request, true);
- }
- if (type == TargetType.TYPE_COLLECTION) {
- return provider.getFeed(request, true);
- }
- if (type == TargetType.TYPE_ENTRY) {
- return provider.getEntry(request, true);
- }
- if (type == TargetType.TYPE_MEDIA) {
- return provider.getMedia(request, true);
- }
- if (type == TargetType.TYPE_CATEGORIES) {
- return provider.getCategories(request, true);
- }
- }
- else if (method == "HEAD") {
- if (type == TargetType.TYPE_SERVICE) {
- return provider.getService(request, false);
- }
- if (type == TargetType.TYPE_COLLECTION) {
- return provider.getFeed(request, false);
- }
- if (type == TargetType.TYPE_ENTRY) {
- return provider.getEntry(request, false);
- }
- if (type == TargetType.TYPE_MEDIA) {
- return provider.getMedia(request, false);
- }
- if (type == TargetType.TYPE_CATEGORIES) {
- return provider.getCategories(request, false);
- }
- }
- else if (method == "POST") {
- if (type == TargetType.TYPE_COLLECTION) {
- return provider.createEntry(request);
- }
- if (type == TargetType.TYPE_ENTRY) {
- return provider.entryPost(request);
- }
- if (type == TargetType.TYPE_MEDIA) {
- return provider.mediaPost(request);
- }
- }
- else if (method == "PUT") {
- if (type == TargetType.TYPE_ENTRY) {
- return provider.updateEntry(request);
- }
- if (type == TargetType.TYPE_MEDIA) {
- return provider.updateMedia(request);
- }
- }
- else if (method == "DELETE") {
- if (type == TargetType.TYPE_ENTRY) {
- return provider.deleteEntry(request);
- }
- if (type == TargetType.TYPE_MEDIA) {
- return provider.deleteMedia(request);
- }
- }
- else if (method == "OPTIONS") {
- AbstractResponseContext rc = new EmptyResponseContext(200);
- rc.addHeader("Allow", combine(getAllowedMethods(type)));
- return rc;
- }
- } else {
- return handler.process(provider, request);
- }
- return null;
- } else {
- return handler.process(provider, request);
+ if (method.equals("GET")) {
+ if (type == TargetType.TYPE_SERVICE) {
+ return provider.getService(request);
+ }
+ if (type == TargetType.TYPE_COLLECTION) {
+ return provider.getFeed(request);
+ }
+ if (type == TargetType.TYPE_ENTRY) {
+ return provider.getEntry(request);
+ }
+ if (type == TargetType.TYPE_MEDIA) {
+ return provider.getMedia(request);
+ }
+ if (type == TargetType.TYPE_CATEGORIES) {
+ return provider.getCategories(request);
+ }
+ }
+ else if (method.equals("HEAD")) {
+ if (type == TargetType.TYPE_SERVICE) {
+ return provider.getService(request);
+ }
+ if (type == TargetType.TYPE_COLLECTION) {
+ return provider.getFeed(request);
+ }
+ if (type == TargetType.TYPE_ENTRY) {
+ return provider.getEntry(request);
+ }
+ if (type == TargetType.TYPE_MEDIA) {
+ return provider.getMedia(request);
+ }
+ if (type == TargetType.TYPE_CATEGORIES) {
+ return provider.getCategories(request);
+ }
+ }
+ else if (method.equals("POST")) {
+ if (type == TargetType.TYPE_COLLECTION) {
+ return provider.createEntry(request);
+ }
+ if (type == TargetType.TYPE_ENTRY) {
+ return provider.entryPost(request);
+ }
+ if (type == TargetType.TYPE_MEDIA) {
+ return provider.mediaPost(request);
+ }
+ }
+ else if (method.equals("PUT")) {
+ if (type == TargetType.TYPE_ENTRY) {
+ return provider.updateEntry(request);
+ }
+ if (type == TargetType.TYPE_MEDIA) {
+ return provider.updateMedia(request);
+ }
+ }
+ else if (method.equals("DELETE")) {
+ if (type == TargetType.TYPE_ENTRY) {
+ return provider.deleteEntry(request);
+ }
+ if (type == TargetType.TYPE_MEDIA) {
+ return provider.deleteMedia(request);
+ }
+ }
+ else if (method.equals("OPTIONS")) {
+ AbstractResponseContext rc = new EmptyResponseContext(200);
+ rc.addHeader("Allow", combine(getAllowedMethods(type)));
+ return rc;
}
+ return null;
}
protected String[] getAllowedMethods(TargetType type) {
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/HttpServletRequestContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/HttpServletRequestContext.java?view=diff&rev=510127&r1=510126&r2=510127
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/HttpServletRequestContext.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/HttpServletRequestContext.java Wed Feb 21 10:05:42 2007
@@ -168,62 +168,62 @@
}
private static String getHost(
- ServiceContext context,
- HttpServletRequest request) {
- Abdera abdera = context.getAbdera();
- String host = abdera.getConfiguration().getConfigurationOption(
- "org.apache.abdera.protocol.server.Host");
- return (host != null) ?
- host :
- request.getServerName();
- }
-
- private static int getPort(
- ServiceContext context,
- HttpServletRequest request) {
+ ServiceContext context,
+ HttpServletRequest request) {
Abdera abdera = context.getAbdera();
- String port = abdera.getConfiguration().getConfigurationOption(
- "org.apache.abdera.protocol.server.Port");
- return (port != null) ?
- Integer.parseInt(port) :
- request.getLocalPort();
- }
-
- private static IRI initBaseUri(
- ServiceContext context,
- HttpServletRequest request) {
- StringBuffer buffer =
- new StringBuffer(
- (request.isSecure())?
- "https":"http");
- buffer.append("://");
- buffer.append(getHost(context,request));
- int port = getPort(context,request);
- if (port != 80) {
- buffer.append(":");
- buffer.append(port);
- }
- buffer.append(request.getContextPath());
- // So that .resolve() works appropriately.
- buffer.append("/");
- try {
- return new IRI(buffer.toString());
- } catch (IRISyntaxException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static IRI initRequestUri(HttpServletRequest request) {
- IRI uri = null;
+ String host = abdera.getConfiguration().getConfigurationOption(
+ "org.apache.abdera.protocol.server.Host");
+ return (host != null) ?
+ host :
+ request.getServerName();
+ }
+
+ private static int getPort(
+ ServiceContext context,
+ HttpServletRequest request) {
+ Abdera abdera = context.getAbdera();
+ String port = abdera.getConfiguration().getConfigurationOption(
+ "org.apache.abdera.protocol.server.Port");
+ return (port != null) ?
+ Integer.parseInt(port) :
+ request.getLocalPort();
+ }
+
+ private static IRI initBaseUri(
+ ServiceContext context,
+ HttpServletRequest request) {
+ StringBuffer buffer =
+ new StringBuffer(
+ (request.isSecure())?
+ "https":"http");
+ buffer.append("://");
+ buffer.append(getHost(context,request));
+ int port = getPort(context,request);
+ if (port != 80) {
+ buffer.append(":");
+ buffer.append(port);
+ }
+ buffer.append(request.getContextPath());
+ // So that .resolve() works appropriately.
+ buffer.append("/");
try {
- StringBuffer buf =
- new StringBuffer(
- request.getRequestURI());
- String qs = request.getQueryString();
- if (qs != null && qs.length() != 0)
- buf.append("?" + request.getQueryString());
- uri = new IRI(buf.toString());
- } catch (IRISyntaxException e) {}
- return uri;
- }
+ return new IRI(buffer.toString());
+ } catch (IRISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static IRI initRequestUri(HttpServletRequest request) {
+ IRI uri = null;
+ try {
+ StringBuffer buf =
+ new StringBuffer(
+ request.getRequestURI());
+ String qs = request.getQueryString();
+ if (qs != null && qs.length() != 0)
+ buf.append("?" + request.getQueryString());
+ uri = new IRI(buf.toString());
+ } catch (IRISyntaxException e) {}
+ return uri;
+ }
}
Added: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/TypeRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/TypeRequestHandler.java?view=auto&rev=510127
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/TypeRequestHandler.java (added)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/TypeRequestHandler.java Wed Feb 21 10:05:42 2007
@@ -0,0 +1,133 @@
+/*
+* 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.servlet;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.abdera.protocol.server.provider.Provider;
+import org.apache.abdera.protocol.server.provider.RequestContext;
+import org.apache.abdera.protocol.server.provider.ResponseContext;
+import org.apache.abdera.protocol.server.provider.TargetType;
+
+/**
+ * Extension of the Default Request Handler that allows subclasses
+ * to plug in alternate implementations of request and method handlers.
+ * This was originally in DefaultRequestHandler but it just didn't
+ * prove to be as useful as I had originally imagined it could be.
+ * Separating this out into it's own class makes it easier for us to
+ * drop it later if it proves to be completely useless :-)
+ */
+public abstract class TypeRequestHandler
+ extends DefaultRequestHandler
+ implements RequestHandler {
+
+ public static interface TypeHandler {
+ ResponseContext process(
+ Provider provider,
+ RequestContext request);
+ }
+
+ private static class TypeMethod {
+ private TargetType type;
+ private String method;
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((method == null) ? 0 : method.hashCode());
+ result = PRIME * result + ((type == null) ? 0 : type.hashCode());
+ return result;
+ }
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final TypeMethod other = (TypeMethod) obj;
+ if (method == null) {
+ if (other.method != null)
+ return false;
+ } else if (!method.equals(other.method))
+ return false;
+ if (type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!type.equals(other.type))
+ return false;
+ return true;
+ }
+ }
+
+ private final Map<TargetType,TypeHandler> typehandlers =
+ new HashMap<TargetType,TypeHandler>();
+ private final Map<TypeMethod,TypeHandler> typemethodhandlers =
+ new HashMap<TypeMethod,TypeHandler>();
+
+ private TypeMethod getTypeMethod(TargetType type, String method) {
+ TypeMethod tm = new TypeMethod();
+ tm.type = type;
+ tm.method = method;
+ return tm;
+ }
+
+ protected synchronized void setTypeMethodHandler(
+ TargetType type,
+ String method,
+ TypeHandler handler) {
+ typemethodhandlers.put(getTypeMethod(type,method), handler);
+ }
+
+ protected synchronized void setTypeHandler(
+ TargetType type,
+ TypeHandler handler) {
+ typehandlers.put(type,handler);
+ }
+
+ private TypeHandler getHandler(
+ TargetType type) {
+ return typehandlers.get(type);
+ }
+
+ private TypeHandler getMethodHandler(
+ TargetType type,
+ String method) {
+ return typemethodhandlers.get(getTypeMethod(type, method));
+ }
+
+ @Override
+ protected ResponseContext process(
+ Provider provider,
+ RequestContext request) {
+ TargetType type = request.getTarget().getType();
+ TypeHandler handler = getHandler(type);
+ if (handler == null) {
+ String method = request.getMethod();
+ handler = getMethodHandler(type,method);
+ if (handler == null) {
+ return super.process(provider, request);
+ } else {
+ return handler.process(provider, request);
+ }
+ } else {
+ return handler.process(provider, request);
+ }
+ }
+
+}