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>


Reply via email to