Author: lindner
Date: Fri Mar 6 01:23:16 2009
New Revision: 750736
URL: http://svn.apache.org/viewvc?rev=750736&view=rev
Log:
SHINDIG-964 | Upgrade to google collections 0.9 / Use Multimap for http headers
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/LruCacheProvider.java
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/SoftExpiringCache.java
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/ehcache/EhCacheCacheProvider.java
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/GuiceBeanProvider.java
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/MapConverter.java
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/DefaultHandlerRegistryTest.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FetchResponseUtils.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDbTest.java
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/SpiDatabaseBootstrap.java
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/oauth/SampleOAuthDataStore.java
incubator/shindig/trunk/pom.xml
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java
(original)
+++
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java
Fri Mar 6 01:23:16 2009
@@ -20,6 +20,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import org.joda.time.DateTime;
import org.json.JSONArray;
@@ -57,7 +58,7 @@
private static final Set<String> EXCLUDE_METHODS
= ImmutableSet.of("getClass", "getDeclaringClass");
- private static final Map<Class<?>, Map<String, Method>> getters =
Maps.newConcurrentHashMap();
+ private static final Map<Class<?>, Map<String, Method>> getters = new
MapMaker().makeMap();
private JsonSerializer() {}
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/LruCacheProvider.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/LruCacheProvider.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/LruCacheProvider.java
(original)
+++
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/LruCacheProvider.java
Fri Mar 6 01:23:16 2009
@@ -19,6 +19,7 @@
package org.apache.shindig.common.cache;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
@@ -44,7 +45,7 @@
private static final Logger LOG =
Logger.getLogger(LruCacheProvider.class.getName());
private final int defaultCapacity;
private final Injector injector;
- private final Map<String, Cache<?, ?>> caches = Maps.newConcurrentHashMap();
+ private final Map<String, Cache<?, ?>> caches = new MapMaker().makeMap();
@Inject
public LruCacheProvider(Injector injector,
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/SoftExpiringCache.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/SoftExpiringCache.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/SoftExpiringCache.java
(original)
+++
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/SoftExpiringCache.java
Fri Mar 6 01:23:16 2009
@@ -20,8 +20,9 @@
import org.apache.shindig.common.util.TimeSource;
-import com.google.common.base.ReferenceType;
-import com.google.common.collect.ReferenceMap;
+import com.google.common.collect.MapMaker;
+
+import java.util.concurrent.ConcurrentMap;
/**
* A cache that uses a soft expiration policy. Entries will be kept around for
potentially as long
@@ -39,7 +40,7 @@
// We keep a weak reference to the value stored in the cache so that when
the value in the actual
// cache is removed, we should lose it here as well.
- private final ReferenceMap<V, Long> expirationTimes;
+ private final ConcurrentMap<V, Long> expirationTimes;
private TimeSource timeSource;
/**
@@ -50,7 +51,7 @@
*/
public SoftExpiringCache(Cache<K, V> cache) {
this.cache = cache;
- expirationTimes = new ReferenceMap<V, Long>(ReferenceType.WEAK,
ReferenceType.STRONG);
+ expirationTimes = new MapMaker().weakKeys().makeMap();
timeSource = new TimeSource();
}
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/ehcache/EhCacheCacheProvider.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/ehcache/EhCacheCacheProvider.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/ehcache/EhCacheCacheProvider.java
(original)
+++
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/ehcache/EhCacheCacheProvider.java
Fri Mar 6 01:23:16 2009
@@ -23,6 +23,7 @@
import org.apache.shindig.common.util.ResourceLoader;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import net.sf.ehcache.CacheManager;
@@ -40,7 +41,7 @@
public class EhCacheCacheProvider implements CacheProvider {
private final Logger LOG =
Logger.getLogger(EhCacheCacheProvider.class.getName());
private final CacheManager cacheManager;
- private final Map<String, Cache<?, ?>> caches = Maps.newConcurrentHashMap();
+ private final Map<String, Cache<?, ?>> caches = new MapMaker().makeMap();
@Inject
public EhCacheCacheProvider(@Named("shindig.cache.ehcache.config") String
configPath,
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java
(original)
+++
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanJsonConverter.java
Fri Mar 6 01:23:16 2009
@@ -24,6 +24,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import com.google.inject.Inject;
import com.google.inject.Injector;
@@ -50,7 +51,7 @@
public class BeanJsonConverter implements BeanConverter {
// Only compute the filtered setters once per-class
- private static final Map<Class<?>, Map<String, Method>> setters =
Maps.newConcurrentHashMap();
+ private static final Map<Class<?>, Map<String, Method>> setters = new
MapMaker().makeMap();
private final Injector injector;
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/GuiceBeanProvider.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/GuiceBeanProvider.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/GuiceBeanProvider.java
(original)
+++
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/GuiceBeanProvider.java
Fri Mar 6 01:23:16 2009
@@ -110,7 +110,7 @@
Map<String, PropertyDescriptor> nameMap = getNameMap(object.getClass());
Set<String> names = (propertyNameComparator == null) ? nameMap.keySet() :
-
ImmutableSortedSet.orderedBy(propertyNameComparator).copyOf(nameMap.keySet());
+
ImmutableSortedSet.orderedBy(propertyNameComparator).addAll(nameMap.keySet()).build();
List<PropertyDescriptor> result =
Lists.newArrayListWithExpectedSize(nameMap.size());
Modified:
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/MapConverter.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/MapConverter.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/MapConverter.java
(original)
+++
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/xstream/MapConverter.java
Fri Mar 6 01:23:16 2009
@@ -21,6 +21,7 @@
import java.util.Map.Entry;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
@@ -101,7 +102,7 @@
*/
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
- Map<String, Object> m = Maps.newConcurrentHashMap();
+ Map<String, Object> m = new MapMaker().makeMap();
reader.moveDown();
while (reader.hasMoreChildren()) {
String key = reader.getNodeName();
Modified:
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/DefaultHandlerRegistryTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/DefaultHandlerRegistryTest.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/DefaultHandlerRegistryTest.java
(original)
+++
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/protocol/DefaultHandlerRegistryTest.java
Fri Mar 6 01:23:16 2009
@@ -22,6 +22,7 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
+import com.google.common.collect.ImmutableSortedSet;
import com.google.inject.Guice;
import junit.framework.Assert;
@@ -33,6 +34,7 @@
import java.util.Iterator;
import java.util.TreeSet;
+import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@@ -216,8 +218,7 @@
new DefaultHandlerRegistry.RestPath("/service/{p1}/{p2}+/const2/{p3}",
null);
DefaultHandlerRegistry.RestPath restPath3 =
new
DefaultHandlerRegistry.RestPath("/service/const1/const2/{p1}/{p2}+/{p3}", null);
- TreeSet<DefaultHandlerRegistry.RestPath> sortedSet =
- Sets.newTreeSet(restPath1, restPath2, restPath3);
+ Set<DefaultHandlerRegistry.RestPath> sortedSet =
ImmutableSortedSet.of(restPath1, restPath2, restPath3);
Iterator<DefaultHandlerRegistry.RestPath> itr = sortedSet.iterator();
assertEquals(itr.next(), restPath3);
assertEquals(itr.next(), restPath1);
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FetchResponseUtils.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FetchResponseUtils.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FetchResponseUtils.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/FetchResponseUtils.java
Fri Mar 6 01:23:16 2009
@@ -25,6 +25,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Collection;
/**
* Handles converting HttpResponse objects to the format expected by the
makeRequest javascript.
@@ -66,7 +67,7 @@
private static void addHeaders(JSONObject headers, HttpResponse response,
String headerName)
throws JSONException {
- List<String> values = response.getHeaders(headerName);
+ Collection<String> values = response.getHeaders(headerName);
if (!values.isEmpty()) {
headers.put(headerName.toLowerCase(), new JSONArray(values));
}
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
Fri Mar 6 01:23:16 2009
@@ -22,6 +22,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import com.google.common.base.Preconditions;
import com.google.inject.Inject;
@@ -50,7 +51,7 @@
private final Map<String, GadgetFeature> core;
// Caches the transitive dependencies to enable faster lookups.
- final Map<Set<String>, Collection<GadgetFeature>> cache =
Maps.newConcurrentHashMap();
+ final Map<Set<String>, Collection<GadgetFeature>> cache = new
MapMaker().makeMap();
private boolean locked = false;
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
Fri Mar 6 01:23:16 2009
@@ -17,14 +17,17 @@
*/
package org.apache.shindig.gadgets.http;
-import org.apache.shindig.common.util.DateUtil;
-import org.apache.shindig.gadgets.encoding.EncodingDetector;
-
+import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
+import com.google.common.collect.MapMaker;
import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
import com.google.inject.Inject;
import com.google.inject.name.Named;
+import org.apache.shindig.common.util.DateUtil;
+import org.apache.shindig.gadgets.encoding.EncodingDetector;
import java.io.ByteArrayInputStream;
import java.io.Externalizable;
@@ -35,11 +38,14 @@
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.Date;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
/**
* Represents the results of an HTTP content retrieval operation.
@@ -128,7 +134,7 @@
private static boolean fastEncodingDetection = true;
// Holds character sets for fast conversion
- private static final Map<String, Charset> encodingToCharset =
Maps.newConcurrentHashMap();
+ private static final Map<String, Charset> encodingToCharset = new
MapMaker().makeMap();
private transient String responseString;
private transient long date;
@@ -136,7 +142,7 @@
private transient Map<String, String> metadata;
private int httpStatusCode;
- private Map<String, List<String>> headers;
+ private Multimap<String, String> headers;
private byte[] responseBytes;
/**
@@ -149,7 +155,7 @@
*/
HttpResponse(HttpResponseBuilder builder) {
httpStatusCode = builder.getHttpStatusCode();
- Map<String, List<String>> headerCopy =
Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
+ Multimap<String, String> headerCopy = HttpResponse.newHeaderMultimap();
headerCopy.putAll(builder.getHeaders());
// Always safe, HttpResponseBuilder won't modify the body.
@@ -162,7 +168,7 @@
// have been set. This allows us to avoid these expensive calculations
from the cache.
date = getAndUpdateDate(headerCopy);
encoding = getAndUpdateEncoding(headerCopy, responseBytes);
- headers = Collections.unmodifiableMap(headerCopy);
+ headers = Multimaps.unmodifiableMultimap(headerCopy);
}
private HttpResponse(int httpStatusCode, String body) {
@@ -246,7 +252,7 @@
/**
* @return All headers for this object.
*/
- public Map<String, List<String>> getHeaders() {
+ public Multimap<String, String> getHeaders() {
return headers;
}
@@ -254,13 +260,8 @@
* @return All headers with the given name. If no headers are set for the
given name, an empty
* collection will be returned.
*/
- public List<String> getHeaders(String name) {
- List<String> ret = headers.get(name);
- if (ret == null) {
- return Collections.emptyList();
- } else {
- return ret;
- }
+ public Collection<String> getHeaders(String name) {
+ return headers.get(name);
}
/**
@@ -268,11 +269,11 @@
* values for the header, use getHeaders().
*/
public String getHeader(String name) {
- List<String> headerList = getHeaders(name);
+ Collection<String> headerList = getHeaders(name);
if (headerList.isEmpty()) {
return null;
} else {
- return headerList.get(0);
+ return headerList.iterator().next();
}
}
@@ -399,20 +400,20 @@
*
* @return The value of the date header, in milliseconds, or -1 if no Date
could be determined.
*/
- private static long getAndUpdateDate(Map<String, List<String>> headers) {
+ private static long getAndUpdateDate(Multimap<String, String> headers) {
// Validate the Date header. Must conform to the HTTP date format.
long timestamp = -1;
- List<String> dates = headers.get("Date");
- String dateStr = dates == null ? null : dates.isEmpty() ? null :
dates.get(0);
- if (dateStr != null) {
- Date d = DateUtil.parseDate(dateStr);
+ Collection<String> dates = headers.get("Date");
+
+ if (!dates.isEmpty()) {
+ Date d = DateUtil.parseDate(dates.iterator().next());
if (d != null) {
timestamp = d.getTime();
}
}
if (timestamp == -1) {
timestamp = System.currentTimeMillis();
- headers.put("Date", Lists.newArrayList(DateUtil.formatDate(timestamp)));
+ headers.put("Date", DateUtil.formatDate(timestamp));
}
return timestamp;
}
@@ -423,14 +424,14 @@
*
* @return The detected encoding or DEFAULT_ENCODING.
*/
- private static String getAndUpdateEncoding(Map<String, List<String>>
headers, byte[] body) {
+ private static String getAndUpdateEncoding(Multimap<String, String> headers,
byte[] body) {
if (body == null || body.length == 0) {
return DEFAULT_ENCODING;
}
- List<String> values = headers.get("Content-Type");
- String contentType = values == null ? null : values.isEmpty() ? null :
values.get(0);
- if (contentType != null) {
+ Collection<String> values = headers.get("Content-Type");
+ if (!values.isEmpty()) {
+ String contentType = values.iterator().next();
String[] parts = contentType.split(";");
if (BINARY_CONTENT_TYPES.contains(parts[0])) {
return DEFAULT_ENCODING;
@@ -450,11 +451,12 @@
String encoding = EncodingDetector.detectEncoding(body,
fastEncodingDetection);
// Record the charset in the content-type header so that its value can
be cached
// and re-used. This is a BIG performance win.
- headers.put("Content-Type", Lists.newArrayList(contentType + ";
charset=" + encoding));
+ values.clear();
+ values.add(contentType + "; charset=" + encoding);
+
return encoding;
} else {
// If no content type was specified, we'll assume an unknown binary type.
- contentType = "application/octet-stream";
return DEFAULT_ENCODING;
}
}
@@ -474,11 +476,8 @@
@Override
public String toString() {
StringBuilder buf = new StringBuilder("HTTP/1.1
").append(httpStatusCode).append("\r\n\r\n");
- for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
- String name = entry.getKey();
- for (String value : entry.getValue()) {
- buf.append(name).append(": ").append(value).append('\n');
- }
+ for (Map.Entry<String,String> entry : headers.entries()) {
+ buf.append(entry.getKey()).append(":
").append(entry.getValue()).append("\r\n");
}
buf.append("\r\n").append(getResponseAsString()).append("\r\n");
return buf.toString();
@@ -503,7 +502,17 @@
@SuppressWarnings("unchecked")
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
httpStatusCode = in.readInt();
- Map<String, List<String>> headerCopy = (Map<String,
List<String>>)in.readObject();
+
+ // We store the multimap as a Map<String,List<String>> to insulate us from
google-collections API churn
+ // And to remain backwards compatible
+
+ Map<String, List<String>> headerCopyMap = (Map<String,
List<String>>)in.readObject();
+ Multimap headerCopy = newHeaderMultimap();
+
+ for (Map.Entry<String,List<String>> entry : headerCopyMap.entrySet()) {
+ headerCopy.putAll(entry.getKey(), entry.getValue());
+ }
+
int bodyLength = in.readInt();
responseBytes = new byte[bodyLength];
int cnt, offset = 0;
@@ -517,14 +526,32 @@
date = getAndUpdateDate(headerCopy);
encoding = getAndUpdateEncoding(headerCopy, responseBytes);
- headers = Collections.unmodifiableMap(headerCopy);
+ headers = Multimaps.unmodifiableMultimap(headerCopy);
metadata = Collections.emptyMap();
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(httpStatusCode);
- out.writeObject(headers);
+ // Write out multimap as a map (see above)
+ Map<String,List<String>> map = Maps.newHashMap();
+ for (String key : headers.keySet()) {
+ map.put(key, Lists.newArrayList(headers.get(key)));
+ }
+ out.writeObject(Maps.newHashMap(map));
out.writeInt(responseBytes.length);
out.write(responseBytes);
}
+
+
+ private static final Supplier<Collection<String>> HEADER_COLLECTION_SUPPLIER
= new HeaderCollectionSupplier();
+
+ private static class HeaderCollectionSupplier implements
Supplier<Collection<String>> {
+ public Collection<String> get() {
+ return new LinkedList<String>(); //To change body of implemented
methods use File | Settings | File Templates.
+ }
+ }
+ public static Multimap<String,String> newHeaderMultimap() {
+ TreeMap<String,Collection<String>> map =
Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
+ return Multimaps.newMultimap(map, HEADER_COLLECTION_SUPPLIER);
+ }
}
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java
Fri Mar 6 01:23:16 2009
@@ -17,15 +17,17 @@
*/
package org.apache.shindig.gadgets.http;
-import java.util.List;
-import java.util.Map;
-
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
import org.apache.commons.lang.ArrayUtils;
import org.apache.shindig.common.util.CharsetUtil;
import org.apache.shindig.common.util.DateUtil;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
/**
@@ -33,7 +35,7 @@
*/
public class HttpResponseBuilder {
private int httpStatusCode = HttpResponse.SC_OK;
- private Map<String, List<String>> headers =
Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
+ private Multimap<String, String> headers = HttpResponse.newHeaderMultimap();
private byte[] responseBytes = ArrayUtils.EMPTY_BYTE_ARRAY;
private Map<String, String> metadata = Maps.newHashMap();
@@ -48,7 +50,9 @@
public HttpResponseBuilder(HttpResponse response) {
httpStatusCode = response.getHttpStatusCode();
+
headers.putAll(response.getHeaders());
+
metadata.putAll(response.getMetadata());
responseBytes = response.getResponseAsBytes();
}
@@ -95,12 +99,7 @@
*/
public HttpResponseBuilder addHeader(String name, String value) {
if (name != null) {
- List<String> values = headers.get(name);
- if (values == null) {
- values = Lists.newLinkedList();
- headers.put(name, values);
- }
- values.add(value);
+ headers.put(name, value);
}
return this;
}
@@ -110,7 +109,7 @@
*/
public HttpResponseBuilder setHeader(String name, String value) {
if (name != null) {
- headers.put(name, Lists.newLinkedList(value));
+ headers.replaceValues(name, Lists.newArrayList(value));
}
return this;
}
@@ -119,8 +118,8 @@
* Adds an entire map of headers to the response.
*/
public HttpResponseBuilder addHeaders(Map<String, String> headers) {
- for (Map.Entry<String, String> entry : headers.entrySet()) {
- addHeader(entry.getKey(), entry.getValue());
+ for (Map.Entry<String,String> entry : headers.entrySet()) {
+ this.headers.put(entry.getKey(), entry.getValue());
}
return this;
}
@@ -129,7 +128,9 @@
* Adds all headers in the provided multimap to the response.
*/
public HttpResponseBuilder addAllHeaders(Map<String, ? extends List<String>>
headers) {
- this.headers.putAll(headers);
+ for (Map.Entry<String,? extends List<String>> entry : headers.entrySet()) {
+ this.headers.putAll(entry.getKey(), entry.getValue());
+ }
return this;
}
@@ -138,17 +139,17 @@
*
* @return Any values that were removed from the response.
*/
- public List<String> removeHeader(String name) {
- return headers.remove(name);
+ public Collection<String> removeHeader(String name) {
+ return headers.removeAll(name);
}
/**
* @param cacheTtl The time to live for this response, in seconds.
*/
public HttpResponseBuilder setCacheTtl(int cacheTtl) {
- headers.remove("Pragma");
- headers.remove("Expires");
- headers.put("Cache-Control", Lists.newLinkedList("public,max-age=" +
cacheTtl));
+ headers.removeAll("Pragma");
+ headers.removeAll("Expires");
+ headers.put("Cache-Control", "public,max-age=" + cacheTtl);
return this;
}
@@ -157,19 +158,20 @@
* milliseconds since the Unix epoch.
*/
public HttpResponseBuilder setExpirationTime(long expirationTime) {
- headers.remove("Cache-Control");
- headers.remove("Pragma");
- headers.put("Expires",
Lists.newLinkedList(DateUtil.formatDate(expirationTime)));
+ headers.removeAll("Cache-Control");
+ headers.removeAll("Pragma");
+ headers.put("Expires", DateUtil.formatDate(expirationTime));
return this;
}
/**
* Sets cache-control headers indicating the response is not cacheable.
*/
+ private List<String> NO_CACHE_HEADER = ImmutableList.of("no-cache");
public HttpResponseBuilder setStrictNoCache() {
- headers.put("Cache-Control", Lists.newLinkedList("no-cache"));
- headers.put("Pragma", Lists.newLinkedList("no-cache"));
- headers.remove("Expires");
+ headers.replaceValues("Cache-Control", NO_CACHE_HEADER);
+ headers.replaceValues("Pragma", NO_CACHE_HEADER);
+ headers.removeAll("Expires");
return this;
}
@@ -189,7 +191,7 @@
return this;
}
- Map<String, List<String>> getHeaders() {
+ Multimap<String, String> getHeaders() {
return headers;
}
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
Fri Mar 6 01:23:16 2009
@@ -136,12 +136,10 @@
setResponseHeaders(request, response, results);
- for (Map.Entry<String, List<String>> entry :
results.getHeaders().entrySet()) {
+ for (Map.Entry<String, String> entry : results.getHeaders().entries()) {
String name = entry.getKey();
if (!DISALLOWED_RESPONSE_HEADERS.contains(name.toLowerCase())) {
- for (String value : entry.getValue()) {
- response.addHeader(name, value);
- }
+ response.addHeader(name, entry.getValue());
}
}
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
Fri Mar 6 01:23:16 2009
@@ -17,16 +17,16 @@
*/
package org.apache.shindig.gadgets.spec;
-import org.apache.shindig.common.uri.Uri;
-import org.apache.shindig.common.util.HashUtil;
-import org.apache.shindig.common.xml.XmlUtil;
-import org.apache.shindig.gadgets.variables.Substitutions;
-
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
+import com.google.common.collect.MapMaker;
import com.google.common.collect.Maps;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.common.util.HashUtil;
+import org.apache.shindig.common.xml.XmlUtil;
+import org.apache.shindig.gadgets.variables.Substitutions;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -192,7 +192,7 @@
* Used by handler classes to use specs to carry context.
* Not defined by the specification
*/
- private final Map<String, Object> attributes = Maps.newConcurrentHashMap();
+ private final Map<String, Object> attributes = new MapMaker().makeMap();
public Object getAttribute(String key) {
return attributes.get(key);
}
Modified:
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java
Fri Mar 6 01:23:16 2009
@@ -23,9 +23,7 @@
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import com.google.common.collect.*;
import java.util.Collections;
@@ -99,8 +97,8 @@
registry.register(makeFeature("feat0", CONTENT, DEP_NAME));
registry.register(makeFeature("feat1", CONTENT, DEP_NAME));
- Set<String> setKeys = ImmutableSortedSet.of("feat0", "feat1");
- List<String> listKeys = Lists.newLinkedList("feat0", "feat1");
+ Set<String> setKeys = ImmutableSet.of("feat0", "feat1");
+ List<String> listKeys = ImmutableList.of("feat0", "feat1");
Collection<String> collectKeys
= Collections.unmodifiableCollection(Lists.newArrayList("feat0",
"feat1"));
Modified:
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java
Fri Mar 6 01:23:16 2009
@@ -17,9 +17,13 @@
*/
package org.apache.shindig.gadgets.http;
+import com.google.common.base.Join;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -62,8 +66,8 @@
HttpResponseBuilder builder = new HttpResponseBuilder()
.addHeaders(headers);
- assertEquals(Arrays.asList("bar"), builder.getHeaders().get("foo"));
- assertEquals(Arrays.asList("blah"), builder.getHeaders().get("blah"));
+ assertEquals(Arrays.asList("bar"),
Lists.newArrayList(builder.getHeaders().get("foo")));
+ assertEquals(Arrays.asList("blah"),
Lists.newArrayList(builder.getHeaders().get("blah")));
}
@Test
@@ -90,7 +94,7 @@
.addHeader("Cache-Control", "public,max-age=100")
.setExpirationTime(100);
- Map<String, List<String>> headers = builder.getHeaders();
+ Multimap<String, String> headers = builder.getHeaders();
assertTrue("No Expires header added.", headers.containsKey("Expires"));
assertFalse("Pragma header not removed", headers.containsKey("Pragma"));
assertFalse("Cache-Control header not removed",
headers.containsKey("Cache-Control"));
@@ -103,10 +107,10 @@
.addHeader("Expires", "some time stamp normally goes here")
.setCacheTtl(100);
- Map<String, List<String>> headers = builder.getHeaders();
+ Multimap<String, String> headers = builder.getHeaders();
assertFalse("Expires header not removed.", headers.containsKey("Expires"));
assertFalse("Pragma header not removed", headers.containsKey("Pragma"));
- assertEquals("public,max-age=100", headers.get("Cache-Control").get(0));
+ assertEquals("public,max-age=100",
headers.get("Cache-Control").iterator().next());
}
@Test
@@ -116,10 +120,10 @@
.addHeader("Expires", "some time stamp normally goes here")
.setStrictNoCache();
- Map<String, List<String>> headers = builder.getHeaders();
+ Multimap<String, String> headers = builder.getHeaders();
assertFalse("Expires header not removed.", headers.containsKey("Expires"));
assertEquals("no-cache", headers.get("Cache-Control").iterator().next());
- assertEquals("no-cache", headers.get("Pragma").get(0));
+ assertEquals("no-cache", headers.get("Pragma").iterator().next());
}
@@ -130,4 +134,18 @@
.create();
assertEquals("foo", resp.getResponseAsString());
}
+
+ @Test
+ public void headerOrdering() {
+ ImmutableList<String> soupList = ImmutableList.of("Tomato", "Potato",
"Lentil", "Onion");
+ HttpResponseBuilder b = new HttpResponseBuilder();
+ for (String soup : soupList) {
+ b.addHeader("Soup", soup);
+ }
+ HttpResponse resp = b.create();
+
+ // Insure that headers are stored in the order they are added
+ assertEquals(Join.join(",",resp.getHeaders("Soup")), Join.join(",",
soupList));
+
+ }
}
Modified:
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseTest.java
Fri Mar 6 01:23:16 2009
@@ -19,9 +19,12 @@
import org.apache.shindig.common.util.DateUtil;
-import junit.framework.TestCase;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertNotNull;
import org.apache.commons.io.IOUtils;
+import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -29,7 +32,10 @@
import java.io.ObjectOutputStream;
import java.util.Arrays;
-public class HttpResponseTest extends TestCase {
+import static junitx.framework.Assert.assertEquals;
+import static junitx.framework.Assert.assertFalse;
+
+public class HttpResponseTest {
private static final byte[] UTF8_DATA = {
(byte)0xEF, (byte)0xBB, (byte)0xBF, 'h', 'e', 'l', 'l', 'o'
};
@@ -55,6 +61,7 @@
return (int)(ts / 1000);
}
+ @Test
public void testGetEncoding() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Content-Type", "text/plain; charset=TEST-CHARACTER-SET")
@@ -63,6 +70,7 @@
assertEquals("TEST-CHARACTER-SET", response.getEncoding());
}
+ @Test
public void testGetEncodingQuotes() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Content-Type", "text/plain;
charset=\"TEST-CHARACTER-SET\"")
@@ -71,6 +79,7 @@
assertEquals("TEST-CHARACTER-SET", response.getEncoding());
}
+ @Test
public void testEncodingDetectionUtf8WithBom() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Content-Type", "text/plain; charset=UTF-8")
@@ -79,6 +88,7 @@
assertEquals(UTF8_STRING, response.getResponseAsString());
}
+ @Test
public void testEncodingDetectionLatin1() throws Exception {
// Input is a basic latin-1 string with 1 non-UTF8 compatible char.
HttpResponse response = new HttpResponseBuilder()
@@ -88,6 +98,7 @@
assertEquals(LATIN1_STRING, response.getResponseAsString());
}
+ @Test
public void testEncodingDetectionBig5() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Content-Type", "text/plain; charset=BIG5")
@@ -96,6 +107,7 @@
assertEquals(BIG5_STRING, response.getResponseAsString());
}
+ @Test
public void testEncodingDetectionUtf8WithBomNoCharsetSpecified() throws
Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Content-Type", "text/plain")
@@ -105,6 +117,7 @@
assertEquals(UTF8_STRING, response.getResponseAsString());
}
+ @Test
public void testEncodingDetectionLatin1NoCharsetSpecified() throws Exception
{
HttpResponse response = new HttpResponseBuilder()
.addHeader("Content-Type", "text/plain;")
@@ -114,6 +127,7 @@
assertEquals(LATIN1_STRING, response.getResponseAsString());
}
+ @Test
public void testEncodingDetectionUtf8WithBomNoContentHeader() throws
Exception {
HttpResponse response = new HttpResponseBuilder()
.setResponse(UTF8_DATA)
@@ -122,6 +136,7 @@
assertEquals(UTF8_STRING, response.getResponseAsString());
}
+ @Test
public void testEncodingDetectionLatin1NoContentHeader() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.setResponse(LATIN1_DATA)
@@ -129,6 +144,7 @@
assertEquals(HttpResponse.DEFAULT_ENCODING, response.getEncoding());
}
+ @Test
public void testGetEncodingForImageContentType() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.setResponse(LATIN1_DATA)
@@ -137,6 +153,7 @@
assertEquals(HttpResponse.DEFAULT_ENCODING,
response.getEncoding().toUpperCase());
}
+ @Test
public void testGetEncodingForFlashContentType() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.setResponse(LATIN1_DATA)
@@ -145,6 +162,7 @@
assertEquals(HttpResponse.DEFAULT_ENCODING,
response.getEncoding().toUpperCase());
}
+ @Test
public void testPreserveBinaryData() throws Exception {
byte[] data = {
(byte)0x00, (byte)0xDE, (byte)0xEA, (byte)0xDB, (byte)0xEE, (byte)0xF0
@@ -162,6 +180,7 @@
assertTrue(Arrays.equals(data, out));
}
+ @Test
public void testStrictCacheControlNoCache() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Cache-Control", "no-cache")
@@ -171,6 +190,7 @@
assertEquals(-1, response.getCacheTtl());
}
+ @Test
public void testStrictPragmaNoCache() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Pragma", "no-cache")
@@ -180,6 +200,7 @@
assertEquals(-1, response.getCacheTtl());
}
+ @Test
public void testStrictPragmaJunk() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Pragma", "junk")
@@ -191,6 +212,7 @@
assertTrue(response.getCacheTtl() <= HttpResponse.DEFAULT_TTL &&
response.getCacheTtl() > 0);
}
+ @Test
public void testCachingHeadersIgnoredOnError() throws Exception {
HttpResponse response = new HttpResponseBuilder()
.addHeader("Cache-Control", "no-cache")
@@ -219,6 +241,7 @@
assertEquals(maxAge - 1, roundToSeconds(response.getCacheTtl() - 1));
}
+ @Test
public void testExpires() throws Exception {
int maxAge = 10;
int time = roundToSeconds(System.currentTimeMillis()) + maxAge;
@@ -230,6 +253,7 @@
assertTtlOk(maxAge, response);
}
+ @Test
public void testMaxAgeNoDate() throws Exception {
int maxAge = 10;
// Guess time.
@@ -243,6 +267,7 @@
assertTtlOk(maxAge, response);
}
+ @Test
public void testMaxAgeInvalidDate() throws Exception {
int maxAge = 10;
// Guess time.
@@ -258,6 +283,7 @@
assertTtlOk(maxAge, response);
}
+ @Test
public void testMaxAgeWithDate() throws Exception {
int maxAge = 10;
int now = roundToSeconds(System.currentTimeMillis());
@@ -270,6 +296,7 @@
assertTtlOk(maxAge, response);
}
+ @Test
public void testFixedDate() throws Exception {
int time = roundToSeconds(System.currentTimeMillis());
HttpResponse response = new HttpResponseBuilder()
@@ -280,6 +307,7 @@
assertTtlOk(roundToSeconds(HttpResponse.DEFAULT_TTL), response);
}
+ @Test
public void testNegativeCaching() {
assertTrue("Bad HTTP responses must be cacheable!",
HttpResponse.error().getCacheExpiration() >
System.currentTimeMillis());
@@ -310,6 +338,7 @@
assertTrue(ttl <= HttpResponse.DEFAULT_TTL && ttl > 0);
}
+ @Test
public void testStrictNoCacheAndNegativeCaching() {
assertDoesNotAllowNegativeCaching(HttpResponse.SC_UNAUTHORIZED);
assertDoesNotAllowNegativeCaching(HttpResponse.SC_FORBIDDEN);
@@ -319,6 +348,7 @@
assertAllowsNegativeCaching(HttpResponse.SC_GATEWAY_TIMEOUT);
}
+ @Test
public void testSetNoCache() {
int time = roundToSeconds(System.currentTimeMillis());
HttpResponse response = new HttpResponseBuilder()
@@ -330,6 +360,7 @@
assertEquals("no-cache", response.getHeader("Cache-Control"));
}
+ @Test
public void testNullHeaderNamesStripped() {
HttpResponse response = new HttpResponseBuilder()
.addHeader(null, "dummy")
@@ -339,6 +370,7 @@
}
}
+ @Test
public void testIsError() {
// These aren't all valid status codes, but they're reserved in these
blocks. Changes
// would be required to the HTTP standard anyway before this test would be
invalid.
@@ -357,6 +389,7 @@
}
}
+ @Test
public void testSerialization() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
@@ -379,6 +412,7 @@
assertEquals(response, deserialized);
}
+ @Test
public void testSerializationWithTransientFields() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
Fri Mar 6 01:23:16 2009
@@ -21,7 +21,7 @@
import static javax.persistence.GenerationType.IDENTITY;
import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import org.apache.shindig.social.opensocial.jpa.api.DbObject;
import org.apache.shindig.social.opensocial.model.Activity;
@@ -31,7 +31,6 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
import javax.persistence.Basic;
import javax.persistence.Column;
@@ -221,7 +220,7 @@
*/
@OneToMany(targetEntity = ActivityTemplateParamsDb.class, mappedBy =
"activity", cascade = ALL)
@MapKey(name = "name")
- protected Map<String, ActivityTemplateParamsDb> templateParamsDb =
Maps.newConcurrentHashMap();
+ protected Map<String, ActivityTemplateParamsDb> templateParamsDb = new
MapMaker().makeMap();
/**
* The transient store for templateParamers loaded by the postLoad hook and
@@ -656,7 +655,7 @@
*/
@PostLoad
public void loadTransientFields() {
- templateParams = Maps.newConcurrentHashMap();
+ templateParams = new MapMaker().makeMap();
for (Entry<String, ActivityTemplateParamsDb> e : templateParamsDb
.entrySet()) {
templateParams.put(e.getKey(), e.getValue().value);
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
Fri Mar 6 01:23:16 2009
@@ -22,6 +22,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import org.apache.shindig.social.opensocial.jpa.api.DbObject;
@@ -97,7 +98,7 @@
*/
@OneToMany(targetEntity=ApplicationDataMapValueDb.class,
mappedBy="applicationDataMap", cascade = ALL)
@MapKey(name="name")
- protected Map<String, ApplicationDataMapValueDb> valuesDb =
Maps.newConcurrentHashMap();
+ protected Map<String, ApplicationDataMapValueDb> valuesDb = new
MapMaker().makeMap();
/**
* The transient store for values loaded by the postLoad hook and persisted
by the
@@ -145,7 +146,7 @@
*/
@PostLoad
public void postLoad() {
- values = Maps.newConcurrentHashMap();
+ values = new MapMaker().makeMap();
for (Entry<String, ApplicationDataMapValueDb> e : valuesDb.entrySet()) {
values.put(e.getKey(), e.getValue().value);
}
Modified:
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDbTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDbTest.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDbTest.java
(original)
+++
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDbTest.java
Fri Mar 6 01:23:16 2009
@@ -34,7 +34,7 @@
import org.junit.Before;
import org.junit.Test;
-import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
/**
*
@@ -101,7 +101,7 @@
@Test
public void updateJohnDoeApplicationDataSettingCountTo5() throws Exception {
// Do update
- Map<String, String> values = Maps.newConcurrentHashMap();
+ Map<String, String> values = new MapMaker().makeMap();
values.put("count", "5");
this.appDataServiceDb.updatePersonData(new UserId(Type.userId,
"john.doe"), new GroupId(GroupId.Type.self, "@self"), DEFAULT_APPLICATION_ID,
SpiTestUtil.asSet("count"), values, SpiTestUtil.DEFAULT_TEST_SECURITY_TOKEN);
Modified:
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/SpiDatabaseBootstrap.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/SpiDatabaseBootstrap.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/SpiDatabaseBootstrap.java
(original)
+++
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/SpiDatabaseBootstrap.java
Fri Mar 6 01:23:16 2009
@@ -59,6 +59,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.MapMaker;
import com.google.inject.Inject;
/**
@@ -246,7 +247,7 @@
ApplicationDataMapDb applicationDataMap = new ApplicationDataMapDb();
applicationDataMap.setApplication(application);
applicationDataMap.setPersonId(personId);
- Map<String, String> values = Maps.newConcurrentHashMap();
+ Map<String, String> values = new MapMaker().makeMap();
if (null != count) {
values.put("count", count);
}
@@ -282,7 +283,7 @@
mediaItems.add(mediaItem2);
activity.setMediaItems(mediaItems);
activity.setPostedTime(1111111111L);
- Map<String, String> templateParams = Maps.newConcurrentHashMap();
+ Map<String, String> templateParams = new MapMaker().makeMap();
templateParams.put("small", "true");
templateParams.put("otherContent", "and got wet");
activity.setTemplateParams(templateParams);
@@ -298,7 +299,7 @@
List<MediaItem> mediaItems = new ArrayList<MediaItem>();
activity.setMediaItems(mediaItems);
activity.setPostedTime(1111111112L);
- Map<String, String> templateParams = Maps.newConcurrentHashMap();
+ Map<String, String> templateParams = new MapMaker().makeMap();
templateParams.put("small", "true");
templateParams.put("otherContent", "and went fast");
activity.setTemplateParams(templateParams);
Modified:
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/oauth/SampleOAuthDataStore.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/oauth/SampleOAuthDataStore.java?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/oauth/SampleOAuthDataStore.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/oauth/SampleOAuthDataStore.java
Fri Mar 6 01:23:16 2009
@@ -17,24 +17,25 @@
*/
package org.apache.shindig.social.sample.oauth;
-import org.apache.shindig.auth.AuthenticationMode;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.MapMaker;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
import org.apache.shindig.auth.SecurityToken;
+import org.apache.shindig.auth.AuthenticationMode;
import org.apache.shindig.social.core.oauth.OAuthSecurityToken;
import org.apache.shindig.social.opensocial.oauth.OAuthDataStore;
import org.apache.shindig.social.opensocial.oauth.OAuthEntry;
import org.apache.shindig.social.sample.spi.JsonDbOpensocialService;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Maps;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-import net.oauth.OAuthConsumer;
-import net.oauth.OAuthServiceProvider;
import org.json.JSONException;
import java.util.Date;
import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import net.oauth.OAuthConsumer;
+import net.oauth.OAuthServiceProvider;
// Sample implementation for OAuth data store
public class SampleOAuthDataStore implements OAuthDataStore {
@@ -49,7 +50,7 @@
}
// All valid OAuth tokens
- private static ConcurrentHashMap<String,OAuthEntry> oauthEntries =
Maps.newConcurrentHashMap();
+ private static ConcurrentMap<String,OAuthEntry> oauthEntries = new
MapMaker().makeMap();
// Get the OAuthEntry that corresponds to the oauthToken
public OAuthEntry getEntry(String oauthToken) {
Modified: incubator/shindig/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/pom.xml?rev=750736&r1=750735&r2=750736&view=diff
==============================================================================
--- incubator/shindig/trunk/pom.xml (original)
+++ incubator/shindig/trunk/pom.xml Fri Mar 6 01:23:16 2009
@@ -1232,7 +1232,7 @@
<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
- <version>0.8</version>
+ <version>0.9</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>