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 2006/09/08 02:47:30 UTC
svn commit: r441309 - in
/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol:
Response.java util/AbstractRequest.java util/AbstractResponse.java
util/CacheControlParser.java util/CacheControlUtil.java
Author: jmsnell
Date: Thu Sep 7 17:47:30 2006
New Revision: 441309
URL: http://svn.apache.org/viewvc?view=rev&rev=441309
Log:
Improvements to the base protocol classes
Use an enum of cache control directives instead of two hashsets for
more efficient processing.
Modified:
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/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/CacheControlParser.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlUtil.java
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=441309&r1=441308&r2=441309
==============================================================================
--- 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 Sep 7 17:47:30 2006
@@ -31,7 +31,16 @@
public interface Response extends ProtocolConstants {
public static enum ResponseType {
- SUCCESS, REDIRECTION, CLIENT_ERROR, SERVER_ERROR, UNKNOWN
+ SUCCESS, REDIRECTION, CLIENT_ERROR, SERVER_ERROR, UNKNOWN;
+
+ public static ResponseType select(int status) {
+ if (status >= 200 && status < 300) return SUCCESS;
+ if (status >= 300 && status < 400) return REDIRECTION;
+ if (status >= 400 && status < 500) return CLIENT_ERROR;
+ if (status >= 500 && status < 600) return SERVER_ERROR;
+ return UNKNOWN;
+ }
+
}
public ResponseType getType();
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?view=diff&rev=441309&r1=441308&r2=441309
==============================================================================
--- 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 Sep 7 17:47:30 2006
@@ -93,19 +93,19 @@
}
public boolean isNoCache() {
- return (flags & NOCACHE) == NOCACHE;
+ return check(NOCACHE);
}
public boolean isNoStore() {
- return (flags & NOSTORE) == NOSTORE;
+ return check(NOSTORE);
}
public boolean isNoTransform() {
- return (flags & NOTRANSFORM) == NOTRANSFORM;
+ return check(NOTRANSFORM);
}
public boolean isOnlyIfCached() {
- return (flags & ONLYIFCACHED) == ONLYIFCACHED;
+ return check(ONLYIFCACHED);
}
public void setMaxAge(long max_age) {
@@ -119,24 +119,29 @@
public void setMinFresh(long min_fresh) {
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) {
- if (val) flags |= NOCACHE;
- else if (isNoCache()) flags ^= NOCACHE;
+ toggle(val, NOCACHE);
}
public void setNoStore(boolean val) {
- if (val) flags |= NOSTORE;
- else if (isNoStore()) flags ^= NOSTORE;
+ toggle(val, NOSTORE);
}
public void setNoTransform(boolean val) {
- if (val) flags |= NOTRANSFORM;
- else if (isNoTransform()) flags ^= NOTRANSFORM;
+ toggle(val, NOTRANSFORM);
}
public void setOnlyIfCached(boolean val) {
- if (val) flags |= ONLYIFCACHED;
- else if (isOnlyIfCached()) flags ^= ONLYIFCACHED;
+ toggle(val, ONLYIFCACHED);
}
}
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?view=diff&rev=441309&r1=441308&r2=441309
==============================================================================
--- 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 Sep 7 17:47:30 2006
@@ -103,12 +103,7 @@
}
public ResponseType getType() {
- int status = getStatus();
- if (status >= 200 && status < 300) return ResponseType.SUCCESS;
- if (status >= 300 && status < 400) return ResponseType.REDIRECTION;
- if (status >= 400 && status < 500) return ResponseType.CLIENT_ERROR;
- if (status >= 500 && status < 600) return ResponseType.SERVER_ERROR;
- return ResponseType.UNKNOWN;
+ return ResponseType.select(getStatus());
}
public URI getUriHeader(String name) throws URISyntaxException {
@@ -117,31 +112,31 @@
}
public boolean isMustRevalidate() {
- return (flags & REVALIDATE) == REVALIDATE;
+ return check(REVALIDATE);
}
public boolean isNoCache() {
- return (flags & NOCACHE) == NOCACHE;
+ return check(NOCACHE);
}
public boolean isNoStore() {
- return (flags & NOSTORE) == NOSTORE;
+ return check(NOSTORE);
}
public boolean isNoTransform() {
- return (flags & NOTRANSFORM) == NOTRANSFORM;
+ return check(NOTRANSFORM);
}
public boolean isPrivate() {
- return (flags & PRIVATE) == PRIVATE;
+ return check(PRIVATE);
}
public boolean isProxyRevalidate() {
- return (flags & PROXYREVALIDATE) == PROXYREVALIDATE;
+ return check(PROXYREVALIDATE);
}
public boolean isPublic() {
- return (flags & PUBLIC) == PUBLIC;
+ return check(PUBLIC);
}
public void setMaxAge(long max_age) {
@@ -149,33 +144,27 @@
}
public void setMustRevalidate(boolean val) {
- if (val) flags |= REVALIDATE;
- else if (isMustRevalidate()) flags ^= REVALIDATE;
+ toggle(val, REVALIDATE);
}
public void setProxyRevalidate(boolean val) {
- if (val) flags |= PROXYREVALIDATE;
- else if (isProxyRevalidate()) flags ^= PROXYREVALIDATE;
+ toggle(val, PROXYREVALIDATE);
}
public void setNoCache(boolean val) {
- if (val) flags |= NOCACHE;
- else if (isNoCache()) flags ^= NOCACHE;
+ toggle(val, NOCACHE);
}
public void setNoStore(boolean val) {
- if (val) flags |= NOSTORE;
- else if (isNoStore()) flags ^= NOSTORE;
+ toggle(val, NOSTORE);
}
public void setNoTransform(boolean val) {
- if (val) flags |= NOTRANSFORM;
- else if (isNoTransform()) flags ^= NOTRANSFORM;
+ toggle(val, NOTRANSFORM);
}
public void setPublic(boolean val) {
- if (val) flags |= PUBLIC;
- else if (isPublic()) flags ^= PUBLIC;
+ toggle(val, PUBLIC);
}
public void setPrivate(boolean val) {
@@ -191,4 +180,13 @@
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;
+ }
+
}
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlParser.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlParser.java?view=diff&rev=441309&r1=441308&r2=441309
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlParser.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/CacheControlParser.java Thu Sep 7 17:47:30 2006
@@ -17,74 +17,79 @@
*/
package org.apache.abdera.protocol.util;
-import java.util.Arrays;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-public class CacheControlParser implements Iterable<String> {
-
- public static final HashSet<String> cacheRequestDirectives =
- new HashSet<String>(
- Arrays.asList(
- new String[] {
- "no-cache",
- "no-store",
- "max-age",
- "max-stale",
- "min-fresh",
- "no-transform",
- "only-if-cached" }));
-
- public static final HashSet<String> cacheResponseDirectives =
- new HashSet<String>(
- Arrays.asList(
- new String[] {
- "public",
- "private",
- "no-cache",
- "no-store",
- "no-transform",
- "must-revalidate",
- "proxy-revalidate",
- "max-age",
- "s-maxage" }));
-
+public class CacheControlParser implements Iterable<CacheControlParser.Directive> {
+
+ public enum Directive {
+ MAXAGE, MAXSTALE, MINFRESH, NOCACHE, NOSTORE, NOTRANSFORM, ONLYIFCACHED,
+ MUSTREVALIDATE, PRIVATE, PROXYREVALIDATE, PUBLIC, SMAXAGE, UNKNOWN;
+
+ public static Directive select(String d) {
+ try {
+ d = d.toUpperCase().replace("-", "");
+ return Directive.valueOf(d);
+ } catch (Exception e) {}
+ return UNKNOWN;
+ }
+
+ }
+
private static final String REGEX =
"\\s*([\\w\\-]+)\\s*(=)?\\s*(\\d+|\\\"([^\"\\\\]*(\\\\.[^\"\\\\]*)*)+\\\")?\\s*";
private static final Pattern pattern = Pattern.compile(REGEX);
- private HashMap<String, String> values = new HashMap<String, String>();
+ private HashMap<Directive, String> values = new HashMap<Directive, String>();
public CacheControlParser(String value) {
Matcher matcher = pattern.matcher(value);
while (matcher.find()) {
- String directive = matcher.group(1);
- if (isDirective(directive)) {
+ String d = matcher.group(1);
+ Directive directive = Directive.select(d);
+ if (directive != Directive.UNKNOWN) {
values.put(directive, matcher.group(3));
}
}
}
- private boolean isDirective(String directive) {
- return cacheRequestDirectives.contains(directive) ||
- cacheResponseDirectives.contains(directive);
- }
-
- public Map<String,String> getValues() {
+ public Map<Directive,String> getValues() {
return values;
}
- public String getValue(String directive) {
+ public String getValue(Directive directive) {
return values.get(directive);
}
- public Iterator<String> iterator() {
+ public Iterator<Directive> iterator() {
return values.keySet().iterator();
}
+ public String[] getValues(Directive directive) {
+ String value = getValue(directive);
+ if (value != null) {
+ return splitAndTrim(value, ",", true);
+ }
+ return null;
+ }
+
+ private static String unquote(String s) {
+ if (s == null || s.length() == 0) return s;
+ if (s.startsWith("\"")) s = s.substring(1);
+ if (s.endsWith("\"")) s = s.substring(0, s.length() - 1);
+ return s;
+ }
+
+ private static String[] splitAndTrim(String value, String delim, boolean unquote) {
+ String[] headers = (unquote) ? unquote(value).split(delim) : value.split(delim);
+ for (int n = 0; n < headers.length; n++) {
+ headers[n] = headers[n].trim();
+ }
+ return headers;
+ }
+
}
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?view=diff&rev=441309&r1=441308&r2=441309
==============================================================================
--- 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 Sep 7 17:47:30 2006
@@ -58,21 +58,16 @@
request.setMaxAge(-1);
request.setMaxStale(-1);
request.setMinFresh(-1);
- for (String directive : parser) {
- if (directive.equalsIgnoreCase("no-cache")) {
- request.setNoCache(true);
- } else if (directive.equalsIgnoreCase("no-store"))
- request.setNoStore(true);
- else if (directive.equalsIgnoreCase("no-transform"))
- request.setNoTransform(true);
- else if (directive.equalsIgnoreCase("only-if-cached"))
- request.setOnlyIfCached(true);
- else if (directive.equalsIgnoreCase("max-age"))
- request.setMaxAge(value(parser.getValue(directive)));
- else if (directive.equalsIgnoreCase("max-stale"))
- request.setMaxStale(value(parser.getValue(directive)));
- else if (directive.equalsIgnoreCase("min-fresh"))
- request.setMinFresh(value(parser.getValue(directive)));
+ for (CacheControlParser.Directive directive : parser) {
+ switch(directive) {
+ case NOCACHE: request.setNoCache(true); break;
+ case NOSTORE: request.setNoStore(true); break;
+ case NOTRANSFORM: request.setNoTransform(true); break;
+ case ONLYIFCACHED: request.setOnlyIfCached(true); break;
+ case MAXAGE: request.setMaxAge(value(parser.getValue(directive))); break;
+ case MAXSTALE: request.setMaxStale(value(parser.getValue(directive))); break;
+ case MINFRESH: request.setMinFresh(value(parser.getValue(directive))); break;
+ }
}
}
@@ -88,46 +83,29 @@
response.setPrivate(false);
response.setPublic(false);
response.setMaxAge(-1);
- for (String directive : parser) {
- if (directive.equalsIgnoreCase("no-cache")) {
- response.setNoCache(true);
- String value = parser.getValue(directive);
- if (value != null) {
- String[] headers = splitAndTrim(value, ",", true);
- response.setNoCacheHeaders(headers);
- }
- } else if (directive.equalsIgnoreCase("no-store"))
- response.setNoStore(true);
- else if (directive.equalsIgnoreCase("no-transform"))
- response.setNoTransform(true);
- else if (directive.equalsIgnoreCase("must-revalidate"))
- response.setMustRevalidate(true);
- else if (directive.equalsIgnoreCase("public"))
- response.setPublic(true);
- else if (directive.equalsIgnoreCase("private")) {
- response.setPrivate(true);
- String value = parser.getValue(directive);
- if (value != null) {
- String[] headers = splitAndTrim(value, ",", true);
- response.setPrivateHeaders(headers);
- }
- } else if (directive.equalsIgnoreCase("max-age"))
- response.setMaxAge(value(parser.getValue(directive)));
+ for (CacheControlParser.Directive directive : parser) {
+ switch(directive) {
+ case NOCACHE:
+ response.setNoCache(true);
+ response.setNoCacheHeaders(parser.getValues(directive));
+ break;
+ case NOSTORE:
+ response.setNoStore(true); break;
+ case NOTRANSFORM:
+ response.setNoTransform(true); break;
+ case MUSTREVALIDATE:
+ response.setMustRevalidate(true); break;
+ case PUBLIC:
+ response.setPublic(true); break;
+ case PRIVATE:
+ response.setPrivate(true);
+ response.setPrivateHeaders(parser.getValues(directive));
+ break;
+ case MAXAGE:
+ response.setMaxAge(value(parser.getValue(directive)));
+ break;
+ }
}
}
-
- private static String unquote(String s) {
- if (s == null || s.length() == 0) return s;
- if (s.startsWith("\"")) s = s.substring(1);
- if (s.endsWith("\"")) s = s.substring(0, s.length() - 1);
- return s;
- }
-
- public static String[] splitAndTrim(String value, String delim, boolean unquote) {
- String[] headers = (unquote) ? unquote(value).split(delim) : value.split(delim);
- for (int n = 0; n < headers.length; n++) {
- headers[n] = headers[n].trim();
- }
- return headers;
- }
+
}