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/10/19 01:16:27 UTC
svn commit: r586171 - in /incubator/abdera/java/trunk:
client/src/main/java/org/apache/abdera/protocol/client/
client/src/main/java/org/apache/abdera/protocol/client/cache/
client/src/main/java/org/apache/abdera/protocol/client/util/
protocol/src/main/...
Author: jmsnell
Date: Thu Oct 18 16:16:26 2007
New Revision: 586171
URL: http://svn.apache.org/viewvc?rev=586171&view=rev
Log:
Protocol API refactorings, simplifications, corrections, etc.
In order to help ensure that the API is consistent across the request and responses objects, a new top level base interface called Message is provided. Response and Request extend from Message. Common code is moved into an AbstractMessage class.
A couple of Lists are replaced with arrays in order to enforce the fact that the listings are actually immutable.
A couple of error refactorings are made to simplify error handling.
Added:
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Message.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractMessage.java
Removed:
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestException.java
Modified:
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/ClientResponse.java
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/CommonsResponse.java
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/CacheBase.java
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/InMemoryCachedResponse.java
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/util/MethodHelper.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/ItemManager.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Resolver.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Response.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/Error.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/ProtocolException.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractResponse.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlUtil.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/PoolManager.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractRequestHandler.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractResponseContext.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/HttpServletRequestContext.java
incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/test/server/UtilityTest.java
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/AbderaClient.java Thu Oct 18 16:16:26 2007
@@ -30,6 +30,7 @@
import org.apache.abdera.Abdera;
import org.apache.abdera.model.Base;
import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Element;
import org.apache.abdera.protocol.Response.ResponseType;
import org.apache.abdera.protocol.client.cache.Cache;
import org.apache.abdera.protocol.client.cache.CacheDisposition;
@@ -39,6 +40,8 @@
import org.apache.abdera.protocol.client.util.BaseRequestEntity;
import org.apache.abdera.protocol.client.util.MethodHelper;
import org.apache.abdera.protocol.client.util.SimpleSSLProtocolSocketFactory;
+import org.apache.abdera.protocol.error.Error;
+import org.apache.abdera.protocol.error.ProtocolException;
import org.apache.abdera.protocol.util.CacheControlUtil;
import org.apache.abdera.util.ServiceUtil;
import org.apache.abdera.util.Version;
@@ -424,8 +427,30 @@
if (response == null) return;
ResponseType type = response.getType();
if ((type.equals(ResponseType.CLIENT_ERROR) && options.is4xxRequestException()) ||
- (type.equals(ResponseType.SERVER_ERROR) && options.is5xxRequestException()))
- throw new RequestException(response);
+ (type.equals(ResponseType.SERVER_ERROR) && options.is5xxRequestException())) {
+ try {
+ Document<Element> doc = response.getDocument();
+ org.apache.abdera.protocol.error.Error error = null;
+ if (doc != null) {
+ Element root = doc.getRoot();
+ if (root instanceof Error) {
+ error = (Error) root;
+ }
+ }
+ if (error == null)
+ error = org.apache.abdera.protocol.error.Error.create(
+ abdera,
+ response.getStatus(),
+ response.getStatusText());
+ error.throwException();
+ } catch (ProtocolException pe) {
+ throw pe;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
}
public RequestOptions getDefaultRequestOptions() {
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/ClientResponse.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/ClientResponse.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/ClientResponse.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/ClientResponse.java Thu Oct 18 16:16:26 2007
@@ -95,7 +95,7 @@
Date getServerDate();
/**
- * Return the character set encoding specified in the ContentType header, if ant
+ * Return the character set encoding specified in the ContentType header, if any
*/
String getCharacterEncoding();
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/CommonsResponse.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/CommonsResponse.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/CommonsResponse.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/CommonsResponse.java Thu Oct 18 16:16:26 2007
@@ -20,6 +20,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -86,36 +87,34 @@
*/
public String getHeader(String header) {
Header h = method.getResponseHeader(header);
- if (h != null)
- return h.getValue();
- else return null;
+ return h != null ? h.getValue() : null;
}
/**
* Return the values of the named HTTP header
*/
- public List<Object> getHeaders(String header) {
+ public Object[] getHeaders(String header) {
Header[] headers = method.getResponseHeaders(header);
List<Object> values = new ArrayList<Object>();
for (Header h : headers) {
values.add(h.getValue());
}
- return java.util.Collections.unmodifiableList(values);
+ return values.toArray(new Object[values.size()]);
}
/**
* Return all of the HTTP headers
*/
- public Map<String,List<Object>> getHeaders() {
+ public Map<String,Object[]> getHeaders() {
Header[] headers = method.getResponseHeaders();
- Map<String,List<Object>> map = new HashMap<String,List<Object>>();
+ Map<String,Object[]> map = new HashMap<String,Object[]>();
for (Header header : headers) {
- List<Object> values = map.get(header.getName());
- if (values == null) {
- values = new ArrayList<Object>();
- map.put(header.getName(),values);
- }
- values.add(header.getValue());
+ Object[] values = map.get(header.getName());
+ List<Object> list = values == null ?
+ new ArrayList<Object>() :
+ Arrays.asList(values);
+ list.add(header.getValue());
+ map.put(header.getName(), list.toArray(new Object[list.size()]));
}
return java.util.Collections.unmodifiableMap(map);
}
@@ -173,5 +172,5 @@
throw new ClientException(e); // server likely returned a bad date format
}
}
-
+
}
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java Thu Oct 18 16:16:26 2007
@@ -49,11 +49,9 @@
private boolean requestException5xx = false;
private boolean useExpectContinue = true;
- private final Map<String,List<String>> headers;
+ private final Map<String,String[]> headers = new HashMap<String,String[]>();
- public RequestOptions() {
- headers = new HashMap<String,List<String>>();
- }
+ public RequestOptions() {}
public RequestOptions(Date ifModifiedSince) {
this();
@@ -87,7 +85,7 @@
setNoCache(no_cache);
}
- private Map<String,List<String>> getHeaders() {
+ private Map<String,String[]> getHeaders() {
return headers;
}
@@ -124,6 +122,10 @@
setHeader("Content-Type", value);
}
+ public void setContentLocation(String iri) {
+ setHeader("Content-Location", iri);
+ }
+
/**
* Set the value of the HTTP Content-Type header
*/
@@ -153,8 +155,7 @@
for (int n = 0; n < values.length; n++) {
values[n] = EncodingUtil.encode(values[n], charset);
}
- List<String> list = Arrays.asList(new String[] {combine(values)});
- getHeaders().put(header, list);
+ getHeaders().put(header, new String[] {combine(values)});
} else {
removeHeaders(header);
}
@@ -175,8 +176,7 @@
*/
public void setHeader(String header, String... values) {
if (values != null && values.length > 0) {
- List<String> list = Arrays.asList(new String[] {combine(values)});
- getHeaders().put(header, list);
+ getHeaders().put(header, new String[] {combine(values)});
} else {
removeHeaders(header);
}
@@ -209,7 +209,7 @@
for (int n = 0; n < values.length; n++) {
values[n] = EncodingUtil.encode(values[n], charset);
}
- List<String> list = getHeaders().get(header);
+ List<String> list = Arrays.asList(getHeaders().get(header));
String value = combine(values);
if (list != null) {
if (!list.contains(value))
@@ -232,7 +232,7 @@
*/
public void addHeader(String header, String... values) {
if (values == null || values.length == 0) return;
- List<String> list = getHeaders().get(header);
+ List<String> list = Arrays.asList(getHeaders().get(header));
String value = combine(values);
if (list != null) {
if (!list.contains(value))
@@ -254,14 +254,14 @@
* Returns the text value of the specified header
*/
public String getHeader(String header) {
- List<String> list = getHeaders().get(header);
- return (list != null) ? list.get(0) : null;
+ String[] list = getHeaders().get(header);
+ return (list != null && list.length > 0) ? list[0] : null;
}
/**
* Return a listing of text values for the specified header
*/
- public List<String> getHeaders(String header) {
+ public String[] getHeaders(String header) {
return getHeaders().get(header);
}
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/CacheBase.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/CacheBase.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/CacheBase.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/CacheBase.java Thu Oct 18 16:16:26 2007
@@ -18,11 +18,10 @@
package org.apache.abdera.protocol.client.cache;
import java.io.IOException;
-import java.util.List;
import org.apache.abdera.Abdera;
-import org.apache.abdera.protocol.client.RequestOptions;
import org.apache.abdera.protocol.client.ClientResponse;
+import org.apache.abdera.protocol.client.RequestOptions;
import org.apache.abdera.protocol.util.CacheControlUtil;
public abstract class CacheBase
@@ -44,9 +43,10 @@
CacheKey key = getCacheKey(uri, options);
CachedResponse response = get(key);
if (response != null && options != null) {
- List<String> pragma = options.getHeaders("Pragma");
+ Object[] pragma = options.getHeaders("Pragma");
if (pragma != null) {
- for (String s: pragma) {
+ for (Object o: pragma) {
+ String s = (String)o;
if (s.equalsIgnoreCase("no-cache")) {
return CacheDisposition.TRANSPARENT;
}
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/InMemoryCachedResponse.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/InMemoryCachedResponse.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/InMemoryCachedResponse.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/cache/InMemoryCachedResponse.java Thu Oct 18 16:16:26 2007
@@ -23,7 +23,6 @@
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import org.apache.abdera.Abdera;
@@ -42,7 +41,7 @@
private int status = 0;
private String status_text = null;
private String uri = null;
- private Map<String,List<Object>> headers = null;
+ private Map<String,Object[]> headers = null;
private byte[] buf = null;
public InMemoryCachedResponse(
@@ -80,9 +79,9 @@
this.buf = out.toByteArray();
}
- public Map<String,List<Object>> getHeaders() {
+ public Map<String,Object[]> getHeaders() {
if (headers == null)
- headers = new HashMap<String,List<Object>>();
+ headers = new HashMap<String,Object[]>();
return headers;
}
@@ -91,15 +90,15 @@
}
public String getHeader(String header) {
- List<Object> values = getHeaders().get(header);
- return (values != null) ? (String)values.get(0) : null;
+ Object[] values = getHeaders().get(header);
+ return (values != null && values.length > 0) ? (String)values[0] : null;
}
public String[] getHeaderNames() {
return getHeaders().keySet().toArray(new String[getHeaders().size()]);
}
- public List<Object> getHeaders(String header) {
+ public Object[] getHeaders(String header) {
return getHeaders().get(header);
}
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/util/MethodHelper.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/util/MethodHelper.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/util/MethodHelper.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/util/MethodHelper.java Thu Oct 18 16:16:26 2007
@@ -18,11 +18,10 @@
package org.apache.abdera.protocol.client.util;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import org.apache.abdera.protocol.client.RequestOptions;
import org.apache.abdera.protocol.client.ClientResponse;
+import org.apache.abdera.protocol.client.RequestOptions;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.methods.DeleteMethod;
@@ -61,12 +60,12 @@
}
}
- public static Map<String,List<Object>> getCacheableHeaders(ClientResponse response) {
- Map<String,List<Object>> map = new HashMap<String,List<Object>>();
+ public static Map<String,Object[]> getCacheableHeaders(ClientResponse response) {
+ Map<String,Object[]> map = new HashMap<String,Object[]>();
String[] headers = response.getHeaderNames();
for (String header : headers) {
if (MethodHelper.isCacheableHeader(header, response)) {
- List<Object> list = response.getHeaders(header);
+ Object[] list = response.getHeaders(header);
map.put(header, list);
}
}
@@ -162,9 +161,9 @@
private static void initHeaders(RequestOptions options, HttpMethod method) {
String[] headers = options.getHeaderNames();
for (String header : headers) {
- List<String> values = options.getHeaders(header);
- for (String value : values) {
- method.addRequestHeader(header, value);
+ Object[] values = options.getHeaders(header);
+ for (Object value : values) {
+ method.addRequestHeader(header, value.toString());
}
}
String cc = options.getCacheControl();
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/ItemManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/ItemManager.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/ItemManager.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/ItemManager.java Thu Oct 18 16:16:26 2007
@@ -17,10 +17,20 @@
*/
package org.apache.abdera.protocol;
+/**
+ * ItemManager is an internal utility class that provides a simple get/release
+ * interface. It is used primarily to control access to pooled resources.
+ */
public interface ItemManager<T> {
+ /**
+ * Get an item based on the specified request
+ */
T get(Request request);
+ /**
+ * Release an item
+ */
void release(T item);
}
Added: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Message.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Message.java?rev=586171&view=auto
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Message.java (added)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Message.java Thu Oct 18 16:16:26 2007
@@ -0,0 +1,108 @@
+/*
+* 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;
+
+import java.util.Date;
+
+import javax.activation.MimeType;
+
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.protocol.util.ProtocolConstants;
+
+/**
+ * A protocol message. This is used as the basis for both request and response
+ * objects in order to provide a consistent interface.
+ */
+public interface Message extends ProtocolConstants {
+
+ /**
+ * Get the value of the specified header
+ */
+ String getHeader(String name);
+
+ /**
+ * Get the decoded value of a RFC 2047 header
+ */
+ String getDecodedHeader(String name);
+
+ /**
+ * Return multiple values for the specified header
+ */
+ Object[] getHeaders(String name);
+
+ /**
+ * Return multiple decoded values for the specified header
+ */
+ String[] getDecodedHeaders(String name);
+
+ /**
+ * Return a listing of header names
+ */
+ String[] getHeaderNames();
+
+ /**
+ * Return the value of the Cache-Control header
+ */
+ String getCacheControl();
+
+ /**
+ * Return the value of the Slug header
+ */
+ String getSlug();
+
+ /**
+ * Return the value of the Content-Type header
+ */
+ MimeType getContentType();
+
+ /**
+ * Return the value of the Content-Location header
+ */
+ IRI getContentLocation();
+
+ /**
+ * Return the value of the Content-Language header
+ */
+ String getContentLanguage();
+
+ /**
+ * Return the value of a Date header
+ */
+ Date getDateHeader(String name);
+
+ /**
+ * Return the maximum-age as specified by the Cache-Control header
+ */
+ long getMaxAge();
+
+ /**
+ * Return true if the Cache-Control header contains no-cache
+ */
+ boolean isNoCache();
+
+ /**
+ * Return true if the Cache-Control header contains no-store
+ */
+ boolean isNoStore();
+
+ /**
+ * Return true if the Cache-Control header contains no-transform
+ */
+ boolean isNoTransform();
+
+}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java Thu Oct 18 16:16:26 2007
@@ -18,63 +18,73 @@
package org.apache.abdera.protocol;
import java.util.Date;
-import java.util.List;
-import javax.activation.MimeType;
-
-import org.apache.abdera.protocol.util.ProtocolConstants;
import org.apache.abdera.util.EntityTag;
-public interface Request extends ProtocolConstants {
- String getHeader(String name);
-
- String getDecodedHeader(String name);
-
- List<String> getHeaders(String name);
-
- List<String> getDecodedHeaders(String name);
-
- String[] getHeaderNames();
-
+/**
+ * A protocol request. This is used as a base for both server and client requests
+ */
+public interface Request extends Message {
+
+ /**
+ * Get the value of the Accept header
+ */
String getAccept();
-
+
+ /**
+ * Get the value of the Accept-Charset header
+ */
String getAcceptCharset();
-
+
+ /**
+ * Get the value of the Accept-Encoding header
+ */
String getAcceptEncoding();
-
+
+ /**
+ * Get the value of the Accept-Language header
+ */
String getAcceptLanguage();
-
+
+ /**
+ * Get the value of the Authorization header
+ */
String getAuthorization();
-
- String getCacheControl();
-
- String getSlug();
-
- MimeType getContentType();
-
- Date getDateHeader(String name);
-
+
+ /**
+ * Get a listing of Etags from the If-Match header
+ */
EntityTag[] getIfMatch();
-
+
+ /**
+ * Get the value of the If-Modified-Since header
+ */
Date getIfModifiedSince();
-
+
+ /**
+ * Get a listing of ETags from the If-None-Match header
+ */
EntityTag[] getIfNoneMatch();
-
+
+ /**
+ * Get the value of the If-Unmodified-Since header
+ */
Date getIfUnmodifiedSince();
-
- long getMaxAge();
-
+
+ /**
+ * Get the max-stale value from the Cache-Control header
+ */
long getMaxStale();
-
+
+ /**
+ * Get the min-fresh value from the Cache-Control header
+ */
long getMinFresh();
-
- boolean isNoCache();
-
- boolean isNoStore();
-
- boolean isNoTransform();
-
+
+ /**
+ * True if the only-if-cached directive is set in the Cache-Control header
+ */
boolean isOnlyIfCached();
}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Resolver.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Resolver.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Resolver.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Resolver.java Thu Oct 18 16:16:26 2007
@@ -17,6 +17,11 @@
*/
package org.apache.abdera.protocol;
+/**
+ * The Resolver interface is a utility class used to resolve objects based on
+ * a request. It is used internally by Abdera as the basis for Target and Subject
+ * resolvers.
+ */
public interface Resolver<T> {
T resolve(Request request);
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?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- 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 Thu Oct 18 16:16:26 2007
@@ -18,17 +18,12 @@
package org.apache.abdera.protocol;
import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import javax.activation.MimeType;
-
-import org.apache.abdera.protocol.util.ProtocolConstants;
-import org.apache.abdera.util.EntityTag;
import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.util.EntityTag;
public interface Response
- extends ProtocolConstants {
+ extends Message {
public static enum ResponseType {
SUCCESS, REDIRECTION, CLIENT_ERROR, SERVER_ERROR, UNKNOWN;
@@ -43,58 +38,30 @@
}
- public EntityTag getEntityTag();
+ EntityTag getEntityTag();
- public ResponseType getType();
-
- public int getStatus();
-
- public String getStatusText();
-
- public Date getLastModified();
-
- public String getContentLanguage();
-
- public IRI getContentLocation();
-
- public long getContentLength();
+ ResponseType getType();
- public MimeType getContentType();
+ int getStatus();
- public String getAllow();
+ String getStatusText();
- public IRI getLocation();
+ Date getLastModified();
- public String getSlug();
+ long getContentLength();
- public Date getDateHeader(String name);
+ String getAllow();
- public IRI getUriHeader(String name);
-
- public String getHeader(String name);
-
- public List<Object> getHeaders(String name);
-
- public Map<String, List<Object>> getHeaders();
-
- public String[] getHeaderNames();
+ IRI getLocation();
boolean isPrivate();
boolean isPublic();
- boolean isNoCache();
-
- boolean isNoStore();
-
- boolean isNoTransform();
-
boolean isMustRevalidate();
boolean isProxyRevalidate();
- long getMaxAge();
-
long getSMaxAge();
long getAge();
@@ -105,7 +72,4 @@
String[] getPrivateHeaders();
- String getCacheControl();
-
- String getDecodedHeader(String header);
}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/Error.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/Error.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/Error.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/Error.java Thu Oct 18 16:16:26 2007
@@ -26,7 +26,8 @@
import org.apache.abdera.model.ExtensibleElementWrapper;
/**
- * Abdera protocol error element
+ * Abdera protocol error element. The Abdera error document provides a
+ * simple structure for reporting errors back to Abdera clients.
*/
public class Error
extends ExtensibleElementWrapper {
@@ -44,11 +45,19 @@
super(factory, qname);
}
+ /**
+ * The code should typically match the HTTP status code; however, certain
+ * application scenarios may require the use of a different code
+ */
public int getCode() {
String code = getSimpleExtension(CODE);
return code != null ? Integer.parseInt(code) : -1;
}
-
+
+ /**
+ * The code should typically match the HTTP status code; however, certain
+ * application scenarios may require the use of a different code
+ */
public void setCode(int code) {
if (code > -1) {
Element element = getExtension(CODE);
@@ -63,10 +72,16 @@
}
}
+ /**
+ * Human-readable, language-sensitive description of the error
+ */
public String getMessage() {
return getSimpleExtension(MESSAGE);
}
-
+
+ /**
+ * Human-readable, language-sensitive description of the error
+ */
public void setMessage(String message) {
if (message != null) {
Element element = getExtension(MESSAGE);
@@ -81,10 +96,17 @@
}
}
+ /**
+ * Will throw a ProtocolException that wraps this element. This is
+ * useful on the client side to surface error responses
+ */
public void throwException() {
throw new ProtocolException(this);
}
+ /**
+ * Create a new Error object
+ */
public static Error create(Abdera abdera, int code, String message) {
Document<Error> doc = abdera.getFactory().newDocument();
Error error = abdera.getFactory().newElement(ERROR,doc);
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/ProtocolException.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/ProtocolException.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/ProtocolException.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/error/ProtocolException.java Thu Oct 18 16:16:26 2007
@@ -23,7 +23,7 @@
extends RuntimeException {
private static final long serialVersionUID = 1017447143200419489L;
- protected final Error error;
+ private final Error error;
public ProtocolException(Error error) {
super(error.getCode() + "::" + error.getMessage());
@@ -38,25 +38,34 @@
public Error getError() {
return error;
}
-
- @Override
+
+ @Override
public int hashCode() {
- final int PRIME = 31;
+ final int prime = 31;
int result = 1;
- result = PRIME * result + ((error == null) ? 0 : error.hashCode());
+ String message = error != null ? error.getMessage() : null;
+ int code = error != null ? error.getCode() : 0;
+ result = prime * result + ((message == null) ? 0 : message.hashCode());
+ result = prime * result + code;
return result;
}
- @Override
+ @Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final ProtocolException other = (ProtocolException) obj;
- if (error == null) {
- if (other.error != null) return false;
- } else if (!error.equals(other.error)) return false;
+ String message = error != null ? error.getMessage() : null;
+ int code = error != null ? error.getCode() : 0;
+ String omessage = other.error != null ? other.error.getMessage() : null;
+ int ocode = other.error != null ? other.error.getCode() : 0;
+ if (message == null) {
+ if (omessage != null) return false;
+ } else if (!message.equals(omessage)) return false;
+ if (code != ocode) return false;
return true;
}
+
}
Added: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractMessage.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractMessage.java?rev=586171&view=auto
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractMessage.java (added)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractMessage.java Thu Oct 18 16:16:26 2007
@@ -0,0 +1,101 @@
+/*
+* 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.util;
+
+import javax.activation.MimeType;
+
+import org.apache.abdera.i18n.iri.Escaping;
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.protocol.Message;
+
+/**
+ * Root impl for Message interface impls. This is provided solely as a way of
+ * keeping the interface and impl's consistent across the Request and Response
+ * objects.
+ */
+public abstract class AbstractMessage
+ implements Message {
+
+ protected int flags = 0;
+ protected long max_age = -1;
+
+
+ public String getCacheControl() {
+ return getHeader("Cache-Control");
+ }
+
+ public String getContentLanguage() {
+ return getHeader("Content-Language");
+ }
+
+ public IRI getContentLocation() {
+ String value = getHeader("Content-Location");
+ return (value != null) ? new IRI(value) : null;
+ }
+
+ public MimeType getContentType() {
+ try {
+ String value = getHeader("Content-Type");
+ return (value != null) ? new MimeType(value) : null;
+ } catch (javax.activation.MimeTypeParseException e) {
+ throw new org.apache.abdera.util.MimeTypeParseException(e);
+ }
+ }
+
+ public String getDecodedHeader(String header) {
+ return Escaping.decode(EncodingUtil.decode(getHeader(header)));
+ }
+
+ public String[] getDecodedHeaders(String header) {
+ Object[] headers = getHeaders(header);
+ for (int n = 0; n < headers.length; n++) {
+ headers[n] = Escaping.decode(EncodingUtil.decode(headers[n].toString()));
+ }
+ return (String[])headers;
+ }
+
+ public String getSlug() {
+ return getDecodedHeader("Slug");
+ }
+
+
+ protected boolean check(int flag) {
+ return (flags & flag) == flag;
+ }
+
+ protected void toggle(boolean val, int flag) {
+ if (val) flags |= flag;
+ else flags &= ~flag;
+ }
+
+ public boolean isNoCache() {
+ return check(NOCACHE);
+ }
+
+ public boolean isNoStore() {
+ return check(NOSTORE);
+ }
+
+ public boolean isNoTransform() {
+ return check(NOTRANSFORM);
+ }
+
+ public long getMaxAge() {
+ return max_age;
+ }
+}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java Thu Oct 18 16:16:26 2007
@@ -18,18 +18,14 @@
package org.apache.abdera.protocol.util;
import java.util.Date;
-import java.util.List;
-import javax.activation.MimeType;
-
-import org.apache.abdera.i18n.iri.Escaping;
import org.apache.abdera.protocol.Request;
import org.apache.abdera.util.EntityTag;
-public abstract class AbstractRequest implements Request {
+public abstract class AbstractRequest
+ extends AbstractMessage
+ implements Request {
- protected int flags = 0;
- protected long max_age = -1;
protected long max_stale = -1;
protected long min_fresh = -1;
@@ -53,23 +49,6 @@
return getHeader("Authorization");
}
- public String getCacheControl() {
- return getHeader("Cache-Control");
- }
-
- public String getSlug() {
- return Escaping.decode(EncodingUtil.decode(getHeader("Slug")));
- }
-
- public MimeType getContentType() {
- try {
- String value = getHeader("Content-Type");
- return (value != null) ? new MimeType(value) : null;
- } catch (javax.activation.MimeTypeParseException e) {
- throw new org.apache.abdera.util.MimeTypeParseException(e);
- }
- }
-
public EntityTag[] getIfMatch() {
return EntityTag.parseTags(getHeader("If-Match"));
}
@@ -86,10 +65,6 @@
return getDateHeader("If-Unmodified-Since");
}
- public long getMaxAge() {
- return max_age;
- }
-
public long getMaxStale() {
return max_stale;
}
@@ -98,18 +73,6 @@
return min_fresh;
}
- public boolean isNoCache() {
- return check(NOCACHE);
- }
-
- public boolean isNoStore() {
- return check(NOSTORE);
- }
-
- public boolean isNoTransform() {
- return check(NOTRANSFORM);
- }
-
public boolean isOnlyIfCached() {
return check(ONLYIFCACHED);
}
@@ -126,15 +89,6 @@
this.min_fresh = min_fresh;
}
- private boolean check(int flag) {
- return (flags & flag) == flag;
- }
-
- private void toggle(boolean val, int flag) {
- if (val) flags |= flag;
- else flags &= ~flag;
- }
-
public void setNoCache(boolean val) {
toggle(val, NOCACHE);
}
@@ -151,16 +105,4 @@
toggle(val, ONLYIFCACHED);
}
- public String getDecodedHeader(String header) {
- return EncodingUtil.decode(getHeader(header));
- }
-
- public List<String> getDecodedHeaders(String header) {
- List<String> headers = getHeaders(header);
- String[] vals = new String[headers.size()];
- for (int n = 0; n < headers.size(); n++) {
- vals[n] = EncodingUtil.decode(headers.get(n));
- }
- return java.util.Arrays.asList(vals);
- }
}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractResponse.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractResponse.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractResponse.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractResponse.java Thu Oct 18 16:16:26 2007
@@ -19,17 +19,14 @@
import java.util.Date;
-import javax.activation.MimeType;
-
+import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.protocol.Response;
import org.apache.abdera.util.EntityTag;
-import org.apache.abdera.i18n.iri.Escaping;
-import org.apache.abdera.i18n.iri.IRI;
-public abstract class AbstractResponse
+public abstract class AbstractResponse
+ extends AbstractMessage
implements Response {
- protected int flags = 0;
protected String[] nocache_headers = null;
protected String[] private_headers = null;
protected long max_age = -1;
@@ -48,14 +45,6 @@
return getHeader("Allow");
}
- public String getCacheControl() {
- return getHeader("Cache-Control");
- }
-
- public String getContentLanguage() {
- return getHeader("Content-Language");
- }
-
public long getContentLength() {
String value = getHeader("Content-Length");
try {
@@ -65,23 +54,6 @@
}
}
- public IRI getContentLocation() {
- return getUriHeader("Content-Location");
- }
-
- public String getSlug() {
- return getDecodedHeader("Slug");
- }
-
- public MimeType getContentType() {
- try {
- String value = getHeader("Content-Type");
- return (value != null) ? new MimeType(value) : null;
- } catch (javax.activation.MimeTypeParseException e) {
- throw new org.apache.abdera.util.MimeTypeParseException(e);
- }
- }
-
public EntityTag getEntityTag() {
String etag = getHeader("ETag");
return (etag != null) ? EntityTag.parse(getHeader("ETag")) : null;
@@ -96,11 +68,8 @@
}
public IRI getLocation() {
- return getUriHeader("Location");
- }
-
- public long getMaxAge() {
- return max_age;
+ String l = getHeader("Location");
+ return l != null ? new IRI(l) : null;
}
public String[] getNoCacheHeaders() {
@@ -119,27 +88,10 @@
return ResponseType.select(getStatus());
}
- public IRI getUriHeader(String name) {
- String value = getHeader(name);
- return (value != null) ? new IRI(value) : null;
- }
-
public boolean isMustRevalidate() {
return check(REVALIDATE);
}
- public boolean isNoCache() {
- return check(NOCACHE);
- }
-
- public boolean isNoStore() {
- return check(NOSTORE);
- }
-
- public boolean isNoTransform() {
- return check(NOTRANSFORM);
- }
-
public boolean isPrivate() {
return check(PRIVATE);
}
@@ -193,17 +145,4 @@
this.nocache_headers = headers;
}
- private boolean check(int flag) {
- return (flags & flag) == flag;
- }
-
- private void toggle(boolean val, int flag) {
- if (val) flags |= flag;
- else flags &= ~flag;
- }
-
- public String getDecodedHeader(String header) {
- return Escaping.decode(EncodingUtil.decode(getHeader(header)));
- }
-
}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlUtil.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlUtil.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlUtil.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlUtil.java Thu Oct 18 16:16:26 2007
@@ -23,8 +23,14 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+/**
+ * Provides parsing and properly handling of the HTTP Cache-Control header.
+ */
public class CacheControlUtil {
+ /**
+ * Idempotent methods are handled differently in caches than other methods
+ */
public static boolean isIdempotent(String method) {
return (method.equalsIgnoreCase("GET") ||
method.equalsIgnoreCase("HEAD") ||
@@ -40,6 +46,9 @@
buf.append(value);
}
+ /**
+ * Construct the Cache-Control header from info in the request object
+ */
public static String buildCacheControl(AbstractRequest request) {
StringBuffer buf = new StringBuffer();
if (request.isNoCache()) append(buf,"no-cache");
@@ -52,6 +61,9 @@
return buf.toString();
}
+ /**
+ * Parse the Cache-Control header
+ */
public static void parseCacheControl(
String cc,
AbstractRequest request) {
@@ -77,6 +89,9 @@
}
}
+ /**
+ * Parse the Cache-Control header
+ */
public static void parseCacheControl(
String cc,
AbstractResponse response) {
@@ -114,7 +129,9 @@
}
}
-
+ /**
+ * Cache Control Directives
+ */
public enum Directive {
MAXAGE, MAXSTALE, MINFRESH, NOCACHE, NOSTORE, NOTRANSFORM, ONLYIFCACHED,
MUSTREVALIDATE, PRIVATE, PROXYREVALIDATE, PUBLIC, SMAXAGE, UNKNOWN;
@@ -127,7 +144,10 @@
return UNKNOWN;
}
}
-
+
+ /**
+ * Parser for the Cache-Control header
+ */
public static class CacheControlParser
implements Iterable<Directive> {
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/PoolManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/PoolManager.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/PoolManager.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/PoolManager.java Thu Oct 18 16:16:26 2007
@@ -25,7 +25,11 @@
* Implements a simple pool manager.
*
* By default, an upper limit to the pool is set at 25 entries.
- * New items can always be created.
+ * New items can always be created, but if more than 25 entries
+ * are released back to the pool, the extras are discarded.
+ * Items added to the stack should never maintain any kind of
+ * state as it is entirely possible that different threads will
+ * be grabbing items from the pool
*/
public abstract class PoolManager<T>
implements ItemManager<T> {
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractRequestHandler.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractRequestHandler.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractRequestHandler.java Thu Oct 18 16:16:26 2007
@@ -22,8 +22,6 @@
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Date;
-import java.util.List;
-import java.util.Map;
import javax.activation.MimeType;
import javax.servlet.ServletException;
@@ -117,20 +115,17 @@
MimeType ct = context.getContentType();
if (ct != null) response.setContentType(ct.toString());
} catch (Exception e) {}
- Map<String, List<Object>> headers = context.getHeaders();
- if (headers != null) {
- for (Map.Entry<String, List<Object>> entry : headers.entrySet()) {
- List<Object> values = entry.getValue();
- if (values == null)
- continue;
- for (Object value : values) {
- if (value instanceof Date)
- response.setDateHeader(entry.getKey(), ((Date)value).getTime());
- else
- response.setHeader(entry.getKey(), value.toString());
- }
+ String[] names = context.getHeaderNames();
+ for (String name : names) {
+ Object[] headers = context.getHeaders(name);
+ for (Object value : headers) {
+ if (value instanceof Date)
+ response.setDateHeader(name, ((Date)value).getTime());
+ else
+ response.setHeader(name, value.toString());
}
- }
+ }
+
if (!request.getMethod().equals("HEAD") && context.hasEntity()) {
OutputStream out = response.getOutputStream();
context.writeTo(out);
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractResponseContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractResponseContext.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractResponseContext.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractResponseContext.java Thu Oct 18 16:16:26 2007
@@ -18,6 +18,7 @@
package org.apache.abdera.protocol.server.impl;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.BitSet;
import java.util.Date;
import java.util.HashMap;
@@ -45,10 +46,10 @@
protected String status_text = null;
protected Writer writer = null;
- protected Map<String,List<Object>> headers = null;
+ protected Map<String,Object[]> headers = null;
public void removeHeader(String name) {
- Map<String,List<Object>> headers = getHeaders();
+ Map<String,Object[]> headers = getHeaders();
headers.remove(name);
}
@@ -57,12 +58,11 @@
}
public void setEncodedHeader(String name, String charset, String... vals) {
- Map<String,List<Object>> headers = getHeaders();
- List<Object> values = new ArrayList<Object>();
- for (String value : vals) {
- values.add(EncodingUtil.encode(value, charset));
+ Object[] evals = new Object[vals.length];
+ for (int n = 0; n < vals.length; n++) {
+ evals[n] = EncodingUtil.encode(vals[n], charset);
}
- headers.put(name, values);
+ setHeader(name, evals);
}
public void setEscapedHeader(String name, BitSet mask, String value) {
@@ -70,19 +70,16 @@
}
public void setHeader(String name, Object value) {
- Map<String,List<Object>> headers = getHeaders();
- List<Object> values = new ArrayList<Object>();
- values.add(value);
- headers.put(name, values);
+ setHeader(name, new Object[] {value});
}
public void setHeader(String name, Object... vals) {
- Map<String,List<Object>> headers = getHeaders();
+ Map<String,Object[]> headers = getHeaders();
List<Object> values = new ArrayList<Object>();
for (Object value : vals) {
values.add(value);
}
- headers.put(name, values);
+ headers.put(name, values.toArray(new Object[values.size()]));
}
public void addEncodedHeader(String name, String charset, String value) {
@@ -90,48 +87,39 @@
}
public void addEncodedHeaders(String name, String charset, String... vals) {
- Map<String,List<Object>> headers = getHeaders();
- List<Object> values = new ArrayList<Object>();
- if (values == null) {
- values = new ArrayList<Object>();
- headers.put(name,values);
- }
for (String value : vals) {
- values.add(EncodingUtil.encode(value, charset));
+ addHeader(name,EncodingUtil.encode(value, charset));
}
}
public void addHeader(String name, Object value) {
- Map<String,List<Object>> headers = getHeaders();
- List<Object> values = new ArrayList<Object>();
- if (values == null) {
- values = new ArrayList<Object>();
- headers.put(name, values);
- }
- values.add(value);
+ addHeader(name, new Object[] {value});
}
public void addHeaders(String name, Object... vals) {
- Map<String,List<Object>> headers = getHeaders();
- List<Object> values = new ArrayList<Object>();
+ Map<String,Object[]> headers = getHeaders();
+ Object[] values = headers.get(name);
+ List<Object> l = null;
if (values == null) {
- values = new ArrayList<Object>();
- headers.put(name,values);
+ l = new ArrayList<Object>();
+ } else {
+ l = Arrays.asList(values);
}
for (Object value : vals) {
- values.add(value);
+ l.add(value);
}
+ headers.put(name, l.toArray(new Object[l.size()]));
}
- public Map<String, List<Object>> getHeaders() {
+ public Map<String, Object[]> getHeaders() {
if (headers == null)
- headers = new HashMap<String,List<Object>>();
+ headers = new HashMap<String,Object[]>();
return headers;
}
public Date getDateHeader(String name) {
- Map<String,List<Object>> headers = getHeaders();
- List<Object> values = headers.get(name);
+ Map<String,Object[]> headers = getHeaders();
+ Object[] values = headers.get(name);
if (values != null) {
for (Object value : values) {
if (value instanceof Date)
@@ -142,20 +130,20 @@
}
public String getHeader(String name) {
- Map<String,List<Object>> headers = getHeaders();
- List<Object> values = headers.get(name);
- if (values != null && values.size() > 0)
- return values.get(0).toString();
+ Map<String,Object[]> headers = getHeaders();
+ Object[] values = headers.get(name);
+ if (values != null && values.length > 0)
+ return values[0].toString();
return null;
}
- public List<Object> getHeaders(String name) {
- Map<String,List<Object>> headers = getHeaders();
+ public Object[] getHeaders(String name) {
+ Map<String,Object[]> headers = getHeaders();
return headers.get(name);
}
public String[] getHeaderNames() {
- Map<String,List<Object>> headers = getHeaders();
+ Map<String,Object[]> headers = getHeaders();
return headers.keySet().toArray(new String[headers.size()]);
}
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/HttpServletRequestContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/HttpServletRequestContext.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/HttpServletRequestContext.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/HttpServletRequestContext.java Thu Oct 18 16:16:26 2007
@@ -167,9 +167,10 @@
}
@SuppressWarnings("unchecked")
- public List<String> getHeaders(String name) {
- Enumeration<String> e = request.getHeaders(name);
- return java.util.Collections.list(e);
+ public Object[] getHeaders(String name) {
+ Enumeration<Object> e = request.getHeaders(name);
+ List<Object> list = java.util.Collections.list(e);
+ return list.toArray(new String[list.size()]);
}
@SuppressWarnings("unchecked")
Modified: incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/test/server/UtilityTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/test/server/UtilityTest.java?rev=586171&r1=586170&r2=586171&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/test/server/UtilityTest.java (original)
+++ incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/test/server/UtilityTest.java Thu Oct 18 16:16:26 2007
@@ -25,6 +25,9 @@
import java.util.HashMap;
import java.util.List;
+import junit.framework.TestCase;
+
+import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.protocol.server.ServiceManager;
import org.apache.abdera.protocol.server.Target;
import org.apache.abdera.protocol.server.TargetType;
@@ -33,9 +36,6 @@
import org.apache.abdera.protocol.server.impl.SimpleSubjectResolver;
import org.apache.abdera.protocol.util.EncodingUtil;
import org.apache.abdera.util.EntityTag;
-import org.apache.abdera.i18n.iri.IRI;
-
-import junit.framework.TestCase;
public class UtilityTest extends TestCase {
@@ -181,7 +181,7 @@
return null;
}
- public List<String> getHeaders(String name) {
+ public String[] getHeaders(String name) {
return null;
}