You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2011/11/07 22:31:55 UTC

svn commit: r1198949 [2/3] - in /abdera/abdera2: activities/src/main/java/org/apache/abdera2/activities/io/gson/ activities/src/main/java/org/apache/abdera2/activities/model/ activities/src/main/java/org/apache/abdera2/activities/model/objects/ activit...

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/WebLink.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/WebLink.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/WebLink.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/WebLink.java Mon Nov  7 21:31:52 2011
@@ -3,8 +3,8 @@ package org.apache.abdera2.common.http;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
@@ -16,15 +16,15 @@ import javax.activation.MimeType;
 import org.apache.abdera2.common.iri.IRI;
 import org.apache.abdera2.common.lang.Lang;
 import org.apache.abdera2.common.mediatype.MimeTypeHelper;
-import org.apache.abdera2.common.text.CharUtils;
+import org.apache.abdera2.common.misc.MoreFunctions;
 import org.apache.abdera2.common.text.Codec;
 
 import com.google.common.base.Function;
 import com.google.common.base.Supplier;
-import com.google.common.collect.Iterables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
-import static org.apache.abdera2.common.text.CharUtils.scanFor;
-import static org.apache.abdera2.common.text.CharUtils.quotedIfNotToken;
+import static org.apache.abdera2.common.text.CharUtils.*;
 import static com.google.common.base.Preconditions.*;
 /**
  * Implements the HTTP Link Header
@@ -65,7 +65,7 @@ public class WebLink implements Serializ
     private String title;
     private MimeType mediaType;
     private final Map<String,String> params = 
-      new HashMap<String,String>();
+      new LinkedHashMap<String,String>();
 
     public Builder () {}
     
@@ -144,7 +144,7 @@ public class WebLink implements Serializ
     }
     
     public Builder param(String name, String value) {
-      checkNotNull(null);
+      checkNotNull(name);
       checkArgument(!reserved(name));
       this.params.put(name,value);
       return this;
@@ -156,37 +156,40 @@ public class WebLink implements Serializ
     }
     
     public Builder mediaType(String type) {
-      this.mediaType = MimeTypeHelper.create(type);
+      this.mediaType = MimeTypeHelper.unmodifiableMimeType(type);
       return this;
     }
     
     public Builder mediaType(MimeType type) {
-      this.mediaType = type;
+      this.mediaType = MimeTypeHelper.unmodifiableMimeType(type);
       return this;
     }
   }
   
   private final IRI iri;
-  private final Set<String> rel = 
-    new LinkedHashSet<String>();
+  private final Set<String> rel;
   private IRI anchor;
-  private final Set<String> rev =
-    new LinkedHashSet<String>();
+  private final Set<String> rev;
   private Lang lang;
-  private final Set<String> media = 
-    new LinkedHashSet<String>();
+  private final Set<String> media;
   private String title;
   private MimeType mediaType;
   private final Map<String,String> params = 
-    new HashMap<String,String>();
+    new LinkedHashMap<String,String>();
   
   private WebLink(Builder builder) {
     this.iri = builder.iri;
-    this.rel.addAll(builder.rel);
+    this.rel = builder.rel != null ?
+      ImmutableSet.copyOf(builder.rel) :
+      ImmutableSet.<String>of();
+    this.rev = builder.rev != null ?
+      ImmutableSet.copyOf(builder.rev) :
+      ImmutableSet.<String>of();
+    this.media = builder.media != null ?
+      ImmutableSet.copyOf(builder.media) :
+      ImmutableSet.<String>of();
     this.anchor = builder.anchor;
-    this.rev.addAll(builder.rev);
     this.lang = builder.lang;
-    this.media.addAll(builder.media);
     this.title = builder.title;
     this.mediaType = builder.mediaType;
     this.params.putAll(builder.params);
@@ -203,7 +206,11 @@ public class WebLink implements Serializ
   public WebLink(IRI iri, String rel) {
     checkNotNull(iri);
     this.iri = iri.normalize();
-    if (rel != null) this.rel.add(rel);
+    this.rel = rel != null ?
+      ImmutableSet.of(rel) :
+      ImmutableSet.<String>of();
+    this.rev = ImmutableSet.<String>of();
+    this.media = ImmutableSet.<String>of();
     this.anchor = null;
     this.lang = null;
     this.title = null;
@@ -217,6 +224,9 @@ public class WebLink implements Serializ
     this.lang = null;
     this.title = null;
     this.mediaType = null;
+    this.rel = ImmutableSet.<String>of();
+    this.rev = ImmutableSet.<String>of();
+    this.media = ImmutableSet.<String>of();
   }
   
   public IRI getResolvedIri(IRI base) {
@@ -236,7 +246,7 @@ public class WebLink implements Serializ
   }
   
   public Iterable<String> getRel() {
-    return Iterables.unmodifiableIterable(this.rel);
+    return this.rel;
   }
   
   public IRI getAnchor() {
@@ -244,7 +254,7 @@ public class WebLink implements Serializ
   }
   
   public Iterable<String> getRev() {
-    return Iterables.unmodifiableIterable(this.rev);
+    return this.rev;
   }
   
   public Lang getHrefLang() {
@@ -252,7 +262,7 @@ public class WebLink implements Serializ
   }
   
   public Iterable<String> getMedia() {
-    return Iterables.unmodifiableIterable(this.media);
+    return this.media;
   }
   
   public String getTitle() {
@@ -265,18 +275,10 @@ public class WebLink implements Serializ
   
   @Override
   public int hashCode() {
-    final int prime = 31;
-    int result = 1;
-    result = prime * result + ((anchor == null) ? 0 : anchor.hashCode());
-    result = prime * result + ((iri == null) ? 0 : iri.hashCode());
-    result = prime * result + ((lang == null) ? 0 : lang.hashCode());
-    result = prime * result + ((media == null) ? 0 : media.hashCode());
-    result = prime * result + ((mediaType == null) ? 0 : mediaType.toString().hashCode());
-    result = prime * result + ((params == null) ? 0 : params.hashCode());
-    result = prime * result + ((rel == null) ? 0 : rel.hashCode());
-    result = prime * result + ((rev == null) ? 0 : rev.hashCode());
-    result = prime * result + ((title == null) ? 0 : title.hashCode());
-    return result;
+    return MoreFunctions.genHashCode(
+      1, anchor,iri,lang,media,
+      mediaType,
+      params,rel,rev,title);
   }
 
   @Override
@@ -339,17 +341,10 @@ public class WebLink implements Serializ
 
 
   private static final Set<String> reserved = 
-    new HashSet<String>();
-  static {
-    reserved.add("rel");
-    reserved.add("anchor");
-    reserved.add("rev");
-    reserved.add("hreflang");
-    reserved.add("media");
-    reserved.add("title");
-    reserved.add("type");
-    reserved.add("type");
-  }
+    new HashSet<String>(
+      ImmutableSet.of(
+        "rel","anchor","rev","hreflang",
+        "media","title","type"));
   private static boolean reserved(String name) {
     return reserved.contains(name);
   }
@@ -360,104 +355,45 @@ public class WebLink implements Serializ
     return params.get(name);
   }
   
+  private void append(Set<String> set, String name, StringBuilder buf) {
+    if (set.size() > 0) {
+      buf.append(String.format(";%s=\"",name));
+      boolean first = true;
+      for (String r : set) {
+        first = appendcomma(first,buf);
+        buf.append(quotedIfNotToken(r,false));
+      }
+      buf.append('"');
+    }
+  }
+  
   public String toString() {
     StringBuilder buf = new StringBuilder();
     buf.append('<')
        .append(iri.toASCIIString())
        .append('>');
-    
-    if (rel.size() > 0) {
-      buf.append(';')
-         .append("rel=");
-      boolean first = true;
-      if (rel.size() > 1)
-        buf.append('"');
-      for (String r : rel) {
-        if (!first) buf.append(' ');
-        else first = false;
-        buf.append(quotedIfNotToken(r));
-      }
-      if (rel.size() > 1)
-        buf.append('"');
-    }
-    
-    if (anchor != null) {
-      buf.append(';')
-         .append("anchor=<")
-         .append(anchor.toASCIIString())
-         .append('>');
-    }
-    
-    if (rev.size() > 0) {
-      buf.append(';')
-         .append("rev=");
-      boolean first = true;
-      if (rev.size() > 1)
-        buf.append('"');
-      for (String r : rev) {
-        if (!first) buf.append(' ');
-        else first = false;
-        buf.append(quotedIfNotToken(r));
-      }
-      if (rev.size() > 1)
-        buf.append('"');
-    }
-    
-    if (lang != null) {
-      buf.append(';')
-         .append("hreflang=")
-         .append(lang.toString());
-    }
-    
-    if (media.size() > 0) {
-      buf.append(';')
-         .append("media=");
-      boolean first = true;
-      if (media.size() > 1)
-        buf.append('"');
-      for (String r : media) {
-        if (!first) buf.append(' ');
-        else first = false;
-        buf.append(quotedIfNotToken(r));
-      }
-      if (media.size() > 1)
-        buf.append('"');
-    }
-    
+    appendif(anchor != null,buf,";anchor=<%s>",anchor.toASCIIString());
+    appendif(lang != null,buf,";hreflang=%s",lang.toString());
+    appendif(mediaType != null,buf,";type=%s",quotedIfNotToken(mediaType.toString()));
+    append(rel,"rel",buf);
+    append(rev,"rev",buf);
+    append(media,"media",buf);
     if (title != null) {
       String enctitle = Codec.encode(title,Codec.STAR);
+      boolean test = title.equals(enctitle);
+      buf.append(";title");
+      appendif(!test,buf,"*=%s",enctitle);
+      appendif(test,buf,"=%s",quotedIfNotToken(title));
+    }
+    for (Map.Entry<String, String> entry : params.entrySet()) {
+      String val = entry.getValue();
+      String encval = Codec.encode(val,Codec.STAR);
+      boolean test = val.equals(encval);
       buf.append(';')
-         .append("title");
-      if (!title.equals(enctitle))
-        buf.append('*')
-           .append('=')
-           .append(enctitle);
-      else
-        buf.append('=')
-           .append(quotedIfNotToken(title));
-    }
-    
-   if (mediaType != null) {
-     buf.append(';')
-        .append("type=")
-        .append(quotedIfNotToken(mediaType.toString()));
-   }
-   
-   for (Map.Entry<String, String> entry : params.entrySet()) {
-     String val = entry.getValue();
-     String encval = Codec.encode(val,Codec.STAR);
-     buf.append(';')
-        .append(entry.getKey());
-     if (!val.equals(encval)) {
-       buf.append('*')
-          .append('=')
-          .append(encval);
-     } else {
-       buf.append('=')
-          .append(quotedIfNotToken(entry.getValue()));
-     }
-   }
-    
+         .append(entry.getKey());
+      appendif(!test,buf,"*=%s", encval);
+      appendif(test,buf,"=%s", quotedIfNotToken(entry.getValue()));
+    }
     return buf.toString();
   }
 
@@ -473,55 +409,46 @@ public class WebLink implements Serializ
   
   public static Iterable<WebLink> parse(String text) {
     List<WebLink> links = new ArrayList<WebLink>();
-    if (text == null) return Collections.emptyList();
-    
+    if (text == null) return ImmutableList.<WebLink>of();
     int z = scanFor('<', text, 0, true);
-
     while(z != -1) {
       int s = z;
       int e = scanFor('>', text, s, false);
-      if (e == -1)
-        throw new IllegalArgumentException();
-      
+      checkArgument(e != -1);
       String uri = text.substring(s+1,e).trim();
       WebLink.Builder maker = WebLink.make().iri(uri);
-      
       s = scanFor(';', text,e+1,false);
       while(s != -1 && text.charAt(s) != ',') {
         e = scanFor('=', text,s+1,false);
         String name = text.substring(s+1,text.charAt(e-1)=='*'?e-1:e).trim();
         s = scanFor(';', text,e+1,false);
         String val = s!=-1?text.substring(e+1,s).trim():text.substring(e+1).trim();
-        val = Codec.decode(val);
-        if (name.equalsIgnoreCase("rel")) {
-          String[] vals = CharUtils.unquote(val).split("\\s+");
-          for (String v : vals)
+        val = Codec.decode(val).toLowerCase(Locale.US);
+        if (name.equals("rel"))
+          for (String v : unquote(val).split("\\s+"))
             maker.rel(v);
-        } else if (name.equalsIgnoreCase("anchor")) {
-          maker.anchor(CharUtils.unwrap(val, '<', '>'));
-        } else if (name.equalsIgnoreCase("rev")) {
-          String[] vals = CharUtils.unquote(val).split("\\s+");
-          for (String v : vals)
+        else if (name.equals("anchor"))
+          maker.anchor(unwrap(val, '<', '>'));
+        else if (name.equals("rev"))
+          for (String v : unquote(val).split("\\s+"))
             maker.rev(v);
-        } else if (name.equalsIgnoreCase("hreflang")) {
-          maker.lang(CharUtils.unquote(val));
-        } else if (name.equalsIgnoreCase("media")) {
-          String[] vals = CharUtils.unquote(val).split("\\s+");
-          for (String v : vals)
+        else if (name.equals("hreflang"))
+          maker.lang(unquote(val));
+        else if (name.equals("media"))
+          for (String v : unquote(val).split("\\s+"))
             maker.media(v);
-        } else if (name.equalsIgnoreCase("title")) {
-          maker.title(CharUtils.unquote(val));
-        } else if (name.equalsIgnoreCase("type")) {
-          maker.mediaType(CharUtils.unquote(val));
-        } else {
-          maker.param(name,CharUtils.unquote(val));
-        }
+        else if (name.equals("title"))
+          maker.title(unquote(val));
+        else if (name.equals("type"))
+          maker.mediaType(unquote(val));
+        else
+          maker.param(name,unquote(val));
       }
       links.add(maker.get());
       if (s == -1) break;
       z = scanFor('<', text, s+1, false);
     }
-    return links;
+    return ImmutableList.copyOf(links);
   }
     
   public static String toString(WebLink link, WebLink... links) {
@@ -537,8 +464,7 @@ public class WebLink implements Serializ
     StringBuilder buf = new StringBuilder();
     boolean first = true;
     for (WebLink link : links) {
-      if (!first) buf.append(", ");
-      else first = !first;
+      first = appendcomma(first,buf);
       buf.append(link.toString());
     }
     return buf.toString();

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/CharsetSniffingInputStream.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/CharsetSniffingInputStream.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/CharsetSniffingInputStream.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/CharsetSniffingInputStream.java Mon Nov  7 21:31:52 2011
@@ -22,7 +22,9 @@ import java.io.IOException;
 import java.io.InputStream;
 
 /**
- * Will attempt to autodetect the character encoding from the stream By default, this will preserve the BOM if it exists
+ * Will attempt to autodetect the character encoding from the stream by 
+ * looking for the Byte Order Mark. This is at most a best guess.
+ * By default, this will preserve the BOM if it exists
  */
 public class CharsetSniffingInputStream extends FilterInputStream {
 

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/Compression.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/Compression.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/Compression.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/Compression.java Mon Nov  7 21:31:52 2011
@@ -25,9 +25,9 @@ import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 import java.util.zip.InflaterInputStream;
 
-import org.apache.abdera2.common.text.CharUtils;
-
+import static org.apache.abdera2.common.text.CharUtils.splitAndTrim;
 import static com.google.common.base.Preconditions.*;
+
 public class Compression {
 
     public enum CompressionCodec {
@@ -73,12 +73,16 @@ public class Compression {
         return codec;
     }
 
+    private static void checkCodecs(boolean exp) {
+      checkArgument(exp, "At least one codec must be specified");
+    }
+    
     public static OutputStream wrap(
         OutputStream out, 
         CompressionCodec... codecs)
         throws IOException {
       checkNotNull(out);
-      checkArgument(codecs.length > 0, "At least one codec must be specified");
+      checkCodecs(codecs.length > 0);
       for (int n = codecs.length - 1; n >= 0; n--)
         out = codecs[n].wrap(out);
       return out;      
@@ -90,19 +94,16 @@ public class Compression {
         CompressionCodec... codecs)
         throws IOException {
         checkNotNull(out);
-        checkArgument(codec != null, "At least one codec must be specified");
-        for (int n = codecs.length - 1; n >= 0; n--)
-          out = codecs[n].wrap(out);
-        out = codec.wrap(out);
-        return out;
+        checkCodecs(codec != null);
+        return codec.wrap(wrap(out,codecs));
     }
 
     public static InputStream wrap(
       InputStream in, 
       CompressionCodec... codecs)
-    throws IOException {
+      throws IOException {
       checkNotNull(in);
-      checkArgument(codecs.length > 0, "At least one codec must be specified");
+      checkCodecs(codecs.length > 0);
       for (int n = codecs.length - 1; n >= 0; n--)
         in = codecs[n].wrap(in);
       return in;
@@ -114,11 +115,8 @@ public class Compression {
         CompressionCodec... codecs) 
           throws IOException {  
         checkNotNull(in);
-        checkArgument(codec != null, "At least one codec must be specified");
-        for (int n = codecs.length - 1; n >= 0; n--)
-          in = codecs[n].wrap(in);
-        in = codec.wrap(in);
-        return in;
+        checkCodecs(codec != null);
+        return codec.wrap(wrap(in,codecs));
     }
 
     public static InputStream wrap(
@@ -126,13 +124,13 @@ public class Compression {
         String ce) 
           throws IOException {
         checkNotNull(in);
-        String[] encodings = CharUtils.splitAndTrim(ce);
-        checkArgument(encodings.length > 0, "At least one codec must be specified");
+        String[] encodings = splitAndTrim(ce);
+        checkCodecs(encodings.length > 0);
         for (int n = encodings.length - 1; n >= 0; n--) {
-            CompressionCodec encoding = 
-              getCodec(encodings[n]);
-            checkNotNull(encoding,"Invalid Compression Codec");
-            in = encoding.wrap(in);
+          CompressionCodec encoding = 
+            getCodec(encodings[n]);
+          checkNotNull(encoding,"Invalid Compression Codec");
+          in = encoding.wrap(in);
         }
         return in;
     }
@@ -140,7 +138,7 @@ public class Compression {
     public static String describe(
         CompressionCodec codec, 
         CompressionCodec... codecs) {
-        checkArgument(codec != null || codecs.length > 0, "At least one codec must be specified");
+        checkCodecs(codec != null || codecs.length > 0);
         int i = 0;
         if (codec == null) {
           codec = codecs[0];

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/FilteredCharReader.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/FilteredCharReader.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/FilteredCharReader.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/FilteredCharReader.java Mon Nov  7 21:31:52 2011
@@ -22,9 +22,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
-import java.io.UnsupportedEncodingException;
 
+import org.apache.abdera2.common.misc.ExceptionHelper;
 import org.apache.abdera2.common.text.CharUtils.Profile;
+import static com.google.common.base.Preconditions.checkArgument;
 
 /**
  * A reader implementation that profiles out unwanted characters By default, unwanted characters are simply removed from
@@ -39,69 +40,94 @@ public class FilteredCharReader extends 
     private final Profile profile;
     private final char replacement;
 
-    public FilteredCharReader(InputStream in, Profile profile) {
-        this(new InputStreamReader(in), profile);
+    public FilteredCharReader(
+      InputStream in, 
+      Profile profile) {
+        this(reader(in), profile);
+    }
+
+    public FilteredCharReader(
+      InputStream in, 
+      String charset, 
+      Profile profile) {
+        this(reader(in, charset), profile);
+    }
+
+    public FilteredCharReader(
+      InputStream in, 
+      Profile profile, 
+      char replacement) {
+        this(reader(in), profile, replacement);
+    }
+
+    public FilteredCharReader(
+      InputStream in, 
+      String charset, 
+      Profile profile, 
+      char replacement) {
+        this(reader(in, charset), profile, replacement);
+    }
+
+    private static Reader reader(InputStream in) {
+      return new InputStreamReader(in);
+    }
+    
+    private static Reader reader(InputStream in, String charset) {
+      try {
+        return new InputStreamReader(in,charset);
+      } catch (Throwable t) {
+        throw ExceptionHelper.propogate(t);
+      }
     }
-
-    public FilteredCharReader(InputStream in, String charset, Profile profile) throws UnsupportedEncodingException {
-        this(new InputStreamReader(in, charset), profile);
-    }
-
-    public FilteredCharReader(InputStream in, Profile profile, char replacement) {
-        this(new InputStreamReader(in), profile, replacement);
-    }
-
-    public FilteredCharReader(InputStream in, String charset, Profile profile, char replacement)
-        throws UnsupportedEncodingException {
-        this(new InputStreamReader(in, charset), profile, replacement);
-    }
-
+    
     public FilteredCharReader(Reader in) {
-        this(in, Profile.NONOP, (char)0);
+      this(in, Profile.NONOP, (char)0);
     }
 
     public FilteredCharReader(Reader in, Profile profile) {
-        this(in, profile, (char)0);
+      this(in, profile, (char)0);
     }
 
     public FilteredCharReader(Reader in, char replacement) {
-        this(in, Profile.NONOP, replacement);
+      this(in, Profile.NONOP, replacement);
     }
 
     public FilteredCharReader(Reader in, Profile profile, char replacement) {
-        super(in);
-        this.profile = profile;
-        this.replacement = replacement;
-        if (replacement != 0 && ((!Character.isValidCodePoint(replacement)) || profile.apply(replacement)))
-            throw new IllegalArgumentException();
+      super(in);
+      this.profile = profile;
+      this.replacement = replacement;
+      checkArgument(
+        replacement == 0 ||
+        Character.isValidCodePoint(replacement) ||
+        !profile.apply(replacement)
+      );
     }
 
     @Override
     public int read() throws IOException {
-        int c = -1;
-        if (replacement == 0) {
-            while (((c = super.read()) != -1 && profile.apply(c))) {
-            }
-        } else {
-            c = super.read();
-            if (c != -1 && profile.apply(c))
-                c = replacement;
-        }
-        return c;
+      int c = -1;
+      if (replacement == 0)
+        while (((c = super.read()) != -1 && profile.apply(c))) {}
+      else {
+        c = super.read();
+        if (c != -1 && profile.apply(c))
+          c = replacement;
+      }
+      return c;
     }
 
     @Override
     public int read(char[] cbuf, int off, int len) throws IOException {
-        int n = off;
-        for (; n < Math.min(len, cbuf.length - off); n++) {
-            int r = read();
-            if (r != -1)
-                cbuf[n] = (char)r;
-            else
-                break;
-        }
-        n -= off;
-        return n <= 0 ? -1 : n;
+      int n = off;
+      for (; n < Math.min(len, cbuf.length - off); n++) {
+        int r = read();
+        if (r != -1)
+            cbuf[n] = (char)r;
+        else
+            break;
+      }
+      n -= off;
+      return n <= 0 ? -1 : n;
     }
 
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/PeekAheadInputStream.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/PeekAheadInputStream.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/PeekAheadInputStream.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/PeekAheadInputStream.java Mon Nov  7 21:31:52 2011
@@ -28,20 +28,20 @@ import java.io.InputStream;
 public class PeekAheadInputStream extends RewindableInputStream {
 
     public PeekAheadInputStream(InputStream in) {
-        super(in);
+      super(in);
     }
 
     public PeekAheadInputStream(InputStream in, int initialSize) {
-        super(in, initialSize);
+      super(in, initialSize);
     }
 
     /**
      * Peek the next byte in the stream
      */
     public int peek() throws IOException {
-        int m = read();
-        unread(m);
-        return m;
+      int m = read();
+      unread(m);
+      return m;
     }
 
     /**
@@ -49,7 +49,7 @@ public class PeekAheadInputStream extend
      * reached
      */
     public int peek(byte[] buf) throws IOException {
-        return peek(buf, 0, buf.length);
+      return peek(buf, 0, buf.length);
     }
 
     /**
@@ -57,9 +57,9 @@ public class PeekAheadInputStream extend
      * reached
      */
     public int peek(byte[] buf, int off, int len) throws IOException {
-        int r = read(buf, off, len);
-        if (r > -1) unread(buf, off, r);
-        return r;
+      int r = read(buf, off, len);
+      if (r > -1) unread(buf, off, r);
+      return r;
     }
 
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/AbstractScheme.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/AbstractScheme.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/AbstractScheme.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/AbstractScheme.java Mon Nov  7 21:31:52 2011
@@ -17,6 +17,8 @@
  */
 package org.apache.abdera2.common.iri;
 import static com.google.common.base.Preconditions.*;
+
+import org.apache.abdera2.common.misc.MoreFunctions;
 /**
  * Base implementation for IRI scheme providers
  */
@@ -56,11 +58,7 @@ public abstract class AbstractScheme imp
 
     @Override
     public int hashCode() {
-      final int prime = 31;
-      int result = 1;
-      result = prime * result + ((name == null) ? 0 : name.hashCode());
-      result = prime * result + port;
-      return result;
+      return MoreFunctions.genHashCode(1, name,port);
     }
 
     @Override

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/IRI.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/IRI.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/IRI.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/IRI.java Mon Nov  7 21:31:52 2011
@@ -24,6 +24,7 @@ import java.net.URISyntaxException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.abdera2.common.misc.MoreFunctions;
 import org.apache.abdera2.common.text.InvalidCharacterException;
 import org.apache.abdera2.common.text.NormalizationForm;
 import org.apache.abdera2.common.text.UrlEncoding;
@@ -136,17 +137,9 @@ public final class IRI implements Serial
 
     @Override
     public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + ((authority == null) ? 0 : authority.hashCode());
-        result = PRIME * result + ((fragment == null) ? 0 : fragment.hashCode());
-        result = PRIME * result + ((host == null) ? 0 : host.hashCode());
-        result = PRIME * result + ((path == null) ? 0 : path.hashCode());
-        result = PRIME * result + port;
-        result = PRIME * result + ((query == null) ? 0 : query.hashCode());
-        result = PRIME * result + ((_scheme == null) ? 0 : _scheme.hashCode());
-        result = PRIME * result + ((userinfo == null) ? 0 : userinfo.hashCode());
-        return result;
+      return MoreFunctions.genHashCode(
+        1, authority, fragment, host, path, 
+        port, query, _scheme, userinfo);
     }
 
     @Override

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Lang.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Lang.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Lang.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Lang.java Mon Nov  7 21:31:52 2011
@@ -25,7 +25,11 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.abdera2.common.lang.Subtag.Type;
+import static org.apache.abdera2.common.misc.MoreFunctions.*;
+import static org.apache.abdera2.common.text.CharUtils.*;
+import static com.google.common.base.Preconditions.checkArgument;
 
+import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 
 /**
@@ -273,55 +277,46 @@ public final class Lang 
             return new Lang(primary);
         }
         m = p_langtag.matcher(lang);
-        if (m.find()) {
-            String langtag = m.group(1);
-            String script = m.group(2);
-            String region = m.group(3);
-            String variant = m.group(4);
-            String extension = m.group(5);
-            String privateuse = m.group(6);
-            Subtag current = null;
-            String[] tags = langtag.split(SEP);
-            for (String tag : tags)
-                current = current == null ? 
-                    primary = new Subtag(Type.LANGUAGE, tag) :
-                    new Subtag(Type.EXTLANG, tag, current);
-            if (script != null && script.length() > 0)
-                current = new Subtag(Type.SCRIPT, script.substring(1), current);
-            if (region != null && region.length() > 0)
-                current = new Subtag(Type.REGION, region.substring(1), current);
-            if (variant != null && variant.length() > 0) {
-                variant = variant.substring(1);
-                tags = variant.split(SEP);
-                for (String tag : tags)
-                    current = new Subtag(Type.VARIANT, tag, current);
-            }
-            if (extension != null && extension.length() > 0) {
-                extension = extension.substring(1);
-                tags = extension.split(SEP);
-                current = new Subtag(Type.SINGLETON, tags[0], current);
-                for (int i = 1; i < tags.length; i++) {
-                    String tag = tags[i];
-                    current = new Subtag(
-                        tag.length() == 1 ? 
-                            Type.SINGLETON : 
-                            Type.EXTENSION, 
-                        tag, 
-                        current);
-                }
-            }
-            if (privateuse != null && privateuse.length() > 0) {
-                privateuse = privateuse.substring(1);
-                tags = privateuse.split(SEP);
-                current = new Subtag(Type.SINGLETON, tags[0], current);
-                for (int i = 1; i < tags.length; i++)
-                    current = new Subtag(Type.PRIVATEUSE, tags[i], current);
-            }
-            return new Lang(primary);
+        checkArgument(m.find());
+        String langtag = m.group(1);
+        String script = m.group(2);
+        String region = m.group(3);
+        String variant = m.group(4);
+        String extension = m.group(5);
+        String privateuse = m.group(6);
+        Subtag current = null;
+        String[] tags = langtag.split(SEP);
+        for (String tag : tags)
+          current = current == null ? 
+            primary = Subtag.language(tag) :
+            Subtag.extlang(tag, current);
+        if (not_empty(script))
+          current = Subtag.script(script.substring(1), current);
+        if (not_empty(region))
+          current = Subtag.region(region.substring(1), current);
+        if (not_empty(variant))
+          for (String tag : variant.substring(1).split(SEP))
+            current = Subtag.variant(tag, current);
+        if (not_empty(extension)) {
+          tags = extension.substring(1).split(SEP);
+          current = Subtag.singleton(tags[0], current);
+          for (int i = 1; i < tags.length; i++) {
+            String tag = tags[i];
+            current = tag.length() == 1?
+              Subtag.singleton(tag, current) :
+              Subtag.extension(tag, current);
+          }
         }
-        throw new IllegalArgumentException();
-    }
+        if (not_empty(privateuse)) {
+          tags = privateuse.substring(1).split(SEP);
+          current = Subtag.singleton(tags[0], current);
+          for (int i = 1; i < tags.length; i++)
+            current = Subtag.privateuse(tags[i], current);
+        }
+        return new Lang(primary);
 
+    }
+    
     public static String fromLocale(Locale locale) {
         return new Lang(locale).toString();
     }
@@ -330,15 +325,15 @@ public final class Lang 
       return new Lang(Locale.getDefault());
     }
     
-    private static Lang[] available_langs;
-    static {
-      try {
-         Locale[] available_locales = Locale.getAvailableLocales();
-         available_langs = new Lang[available_locales.length];
-         for (int n = 0; n < available_locales.length; n++) 
-           available_langs[n] = new Lang(available_locales[n]);
-      } catch (Throwable t) {}
-    }
+    private static Lang[] available_langs = 
+      each(
+        Locale.getAvailableLocales(), 
+        new Function<Locale,Lang>() {
+          public Lang apply(Locale input) {
+            return new Lang(input);
+          }
+        },
+        Lang.class);
     
     public static Lang[] getAvailableLangs() {
       return available_langs;

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Range.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Range.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Range.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Range.java Mon Nov  7 21:31:52 2011
@@ -30,6 +30,9 @@ import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 
+import static org.apache.abdera2.common.text.CharUtils.*;
+import static com.google.common.base.Preconditions.*;
+
 /**
  * A language range used for matching language tags
  */
@@ -40,37 +43,41 @@ public final class Range 
     private final boolean extended;
 
     public Range(String range, boolean extended) {
-        super(parse(range, extended).root);
+        super(parse(checkNotNull(range), extended).root);
         this.extended = extended;
     }
 
     public Range(String range) {
-        this(parse(range).root);
+        this(parse(checkNotNull(range)).root);
     }
 
     public Range(Lang lang) {
-        this(lang.toString());
+        this(checkNotNull(lang).toString());
     }
 
     public Range(Lang lang, boolean extended) {
-        this(lang.toString(), extended);
+        this(checkNotNull(lang).toString(), extended);
     }
 
     Range(Subtag primary) {
-        super(primary);
+        super(checkNotNull(primary));
         this.extended = !checkBasic();
     }
 
     public Range append(Subtag subtag) {
-        Subtag last = null;
-        for (Subtag tag : this)
-            last = tag;
-        last.setNext(subtag);
-        return this;
+      Subtag last = null, first = null;
+      for (Subtag tag : this) {
+        last = new Subtag(tag,last);
+        if (first == null) first = last;
+      }
+      if (last == null)
+        last = subtag;
+      last.setNext(subtag);
+      return new Range(first);
     }
 
     public Range appendWildcard() {
-        return append(Subtag.newWildcard());
+      return append(Subtag.newWildcard());
     }
 
     public Range toBasicRange() {
@@ -317,39 +324,30 @@ public final class Range 
      */
     public static Range parse(String range, boolean extended) {
         if (!extended) {
-            Subtag primary = null, current = null;
-            Matcher m = p_range.matcher(range);
-            if (m.find()) {
-                String first = m.group(1);
-                String therest = m.group(2);
-                current = primary =
-                    new Subtag(first.equals("*") ? 
-                        Subtag.Type.WILDCARD : 
-                        Subtag.Type.SIMPLE, first
-                        .toLowerCase(Locale.US));
-                Matcher n = p_range_component.matcher(therest);
-                while (n.find()) {
-                    String name = n.group(1).toLowerCase(Locale.US);
-                    current = new Subtag(
-                        name.equals("*") ? 
-                            Subtag.Type.WILDCARD : 
-                            Subtag.Type.SIMPLE, 
-                        name, 
-                        current);
-                }
+          Subtag primary = null, current = null;
+          Matcher m = p_range.matcher(range);
+          if (m.find()) {
+            String first = m.group(1);
+            String therest = m.group(2);
+            current = primary =
+              Subtag.simple(first.toLowerCase(Locale.US));
+            Matcher n = p_range_component.matcher(therest);
+            while (n.find()) {
+              String name = n.group(1).toLowerCase(Locale.US);
+              current = Subtag.simple(name, current);
             }
-            return new Range(primary);
+          }
+          return new Range(primary);
         } else {
-
             Subtag primary = null;
             Matcher m = p_grandfathered.matcher(range);
             if (m.find()) {
                 String[] tags = range.split(SEP);
                 Subtag current = null;
                 for (String tag : tags)
-                    current = current == null ?
-                        primary = new Subtag(Type.GRANDFATHERED, tag) :
-                        new Subtag(Type.GRANDFATHERED,tag,current);
+                  current = current == null ?
+                    primary = Subtag.grandfathered(tag) :
+                    Subtag.grandfathered(tag,current);
                 return new Range(primary);
             }
             m = p_privateuse.matcher(range);
@@ -363,64 +361,53 @@ public final class Range 
                 return new Range(primary);
             }
             m = p_extended_range.matcher(range);
-            if (m.find()) {
-                String langtag = m.group(1);
-                String script = m.group(2);
-                String region = m.group(3);
-                String variant = m.group(4);
-                String extension = m.group(5);
-                String privateuse = m.group(6);
-                Subtag current = null;
-                String[] tags = langtag.split(SEP);
-                for (String tag : tags)
-                    current = current == null ?
-                        primary = new Subtag(tag.equals("*") ? Type.WILDCARD : Type.LANGUAGE, tag) :
-                        new Subtag(tag.equals("*") ? Type.WILDCARD : Type.EXTLANG, tag, current);
-                if (script != null && script.length() > 0)
-                    current =
-                        new Subtag(
-                            script.substring(1).equals("*") ? 
-                                Type.WILDCARD : 
-                                Type.SCRIPT, 
-                            script.substring(1),
-                            current);
-                if (region != null && region.length() > 0)
-                    current =
-                        new Subtag(
-                            region.substring(1).equals("*") ? 
-                                Type.WILDCARD : 
-                                Type.REGION, 
-                            region.substring(1),
-                            current);
-                if (variant != null && variant.length() > 0) {
-                    variant = variant.substring(1);
-                    tags = variant.split(SEP);
-                    for (String tag : tags)
-                        current = new Subtag(tag.equals("*") ? Type.WILDCARD : Type.VARIANT, tag, current);
-                }
-                if (extension != null && extension.length() > 0) {
-                    extension = extension.substring(1);
-                    tags = extension.split(SEP);
-                    current = new Subtag(tags[0].equals("*") ? Type.WILDCARD : Type.SINGLETON, tags[0], current);
-                    for (int i = 1; i < tags.length; i++) {
-                        String tag = tags[i];
-                        current =
-                            new Subtag(tag.equals("*") ? Type.WILDCARD : tag.length() == 1 ? Type.SINGLETON
-                                : Type.EXTENSION, tag, current);
-                    }
-                }
-                if (privateuse != null && privateuse.length() > 0) {
-                    privateuse = privateuse.substring(1);
-                    tags = privateuse.split(SEP);
-                    current = new Subtag(tags[0].equals("*") ? Type.WILDCARD : Type.SINGLETON, tags[0], current);
-                    for (int i = 1; i < tags.length; i++) {
-                        current = new Subtag(tags[i].equals("*") ? Type.WILDCARD : Type.PRIVATEUSE, tags[i], current);
-                    }
-                }
-                return new Range(primary);
+            checkArgument(m.find());
+            String langtag = m.group(1);
+            String script = m.group(2);
+            String region = m.group(3);
+            String variant = m.group(4);
+            String extension = m.group(5);
+            String privateuse = m.group(6);
+            Subtag current = null;
+            String[] tags = langtag.split(SEP);
+            for (String tag : tags)
+              current = current == null ?
+                primary = Subtag.language(tag) :
+                Subtag.extlang(tag, current);
+            if (not_empty(script))
+              current =
+                Subtag.script(
+                  script.substring(1),
+                  current);
+            if (not_empty(region))
+              current =
+                Subtag.region(
+                  region.substring(1),
+                  current);
+            if (not_empty(variant)) {
+              for (String tag : variant.substring(1).split(SEP))
+                current = Subtag.variant(tag, current);
+            }
+            if (not_empty(extension)) {
+              tags = extension.substring(1).split(SEP);
+              current = Subtag.singleton(tags[0], current);
+              for (int i = 1; i < tags.length; i++) {
+                String tag = tags[i];
+                current =
+                  tag.length() == 1 ?
+                    Subtag.singleton(tag, current) :
+                    Subtag.extension(tag, current);
+              }
+            }
+            if (not_empty(privateuse)) {
+              tags = privateuse.substring(1).split(SEP);
+              current = Subtag.singleton(tags[0], current);
+              for (int i = 1; i < tags.length; i++)
+                current = Subtag.privateuse(tags[i], current);
             }
+            return new Range(primary);
         }
-        throw new IllegalArgumentException("Invalid range");
+
     }
 
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Subtag.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Subtag.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Subtag.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Subtag.java Mon Nov  7 21:31:52 2011
@@ -20,6 +20,8 @@ package org.apache.abdera2.common.lang;
 import java.io.Serializable;
 import java.util.Locale;
 
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 /**
  * A Language Tab Subtag. Instances are immutable and safe to use by
  * multiple threads.
@@ -29,6 +31,86 @@ public final class Subtag 
 
     private static final long serialVersionUID = -4496128268514329138L;
 
+    public static Subtag language(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.LANGUAGE, name);
+    }
+    
+    public static Subtag language(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.LANGUAGE, name, prev);
+    }
+    
+    public static Subtag extlang(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.EXTLANG, name);
+    }
+    
+    public static Subtag extlang(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.EXTLANG, name, prev);
+    }
+    
+    public static Subtag script(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.SCRIPT, name);
+    }
+    
+    public static Subtag script(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.SCRIPT, name, prev);
+    }
+    
+    public static Subtag region(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.REGION, name);
+    }
+    
+    public static Subtag region(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.REGION, name, prev);
+    }
+    
+    public static Subtag variant(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.VARIANT, name);
+    }
+    
+    public static Subtag variant(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.VARIANT, name, prev);
+    }
+    
+    public static Subtag singleton(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.SINGLETON, name);
+    }
+    
+    public static Subtag singleton(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.SINGLETON, name, prev);
+    }
+    
+    public static Subtag extension(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.EXTENSION, name);
+    }
+    
+    public static Subtag extension(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.EXTENSION, name, prev);
+    }
+    
+    public static Subtag privateuse(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.PRIVATEUSE, name);
+    }
+    
+    public static Subtag privateuse(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.PRIVATEUSE, name, prev);
+    }
+    
+    public static Subtag grandfathered(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.GRANDFATHERED, name);
+    }
+    
+    public static Subtag grandfathered(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.GRANDFATHERED, name, prev);
+    }
+   
+    public static Subtag simple(String name) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.SIMPLE, name);
+    }
+    
+    public static Subtag simple(String name, Subtag prev) {
+      return new Subtag(name.equals("*") ? Type.WILDCARD : Type.SIMPLE, name, prev);
+    }
+    
     public enum Type {
         LANGUAGE,
         EXTLANG,
@@ -109,22 +191,22 @@ public final class Subtag 
         return toString();
     }
 
-    void setPrevious(Subtag prev) {
-        this.prev = prev;
-    }
-
     public Subtag previous() {
-        return prev;
+      return prev;
     }
 
+    void setPrevious(Subtag prev) {
+      this.prev = prev;
+    }
+    
     void setNext(Subtag next) {
-        this.next = next;
-        if (next != null)
-            next.setPrevious(this);
+      this.next = next;
+      if (next != null)
+          next.setPrevious(this);
     }
 
     public Subtag next() {
-        return next;
+      return next;
     }
 
     public String toString() {
@@ -149,13 +231,8 @@ public final class Subtag 
     }
 
     public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((name == null) ? 0 : 
-          name.toLowerCase(Locale.US).hashCode());
-        result = prime * result + ((type == null) ? 0 : 
-          type.hashCode());
-        return result;
+      return MoreFunctions.genHashCode(
+        1, name.toLowerCase(Locale.US), type);
     }
 
     public boolean equals(Object obj) {

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/SubtagSet.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/SubtagSet.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/SubtagSet.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/SubtagSet.java Mon Nov  7 21:31:52 2011
@@ -24,6 +24,7 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.abdera2.common.lang.Subtag.Type;
+import org.apache.abdera2.common.misc.MoreFunctions;
 
 public abstract class SubtagSet 
   implements Serializable, 
@@ -124,11 +125,7 @@ public abstract class SubtagSet 
     }
 
     public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        for (Subtag tag : this)
-            result = prime * result + tag.hashCode();
-        return result;
+      return MoreFunctions.genHashCode(1, this);
     }
 
     public boolean equals(Object obj) {

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/mediatype/MimeTypeHelper.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/mediatype/MimeTypeHelper.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/mediatype/MimeTypeHelper.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/mediatype/MimeTypeHelper.java Mon Nov  7 21:31:52 2011
@@ -27,11 +27,15 @@ import javax.activation.MimeType;
 import javax.activation.MimeTypeParameterList;
 
 import org.apache.abdera2.common.Constants;
+import org.apache.abdera2.common.misc.ExceptionHelper;
 
 import com.google.common.base.Equivalence;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 
+import static org.apache.abdera2.common.misc.Comparisons.*;
+import static org.apache.abdera2.common.text.CharUtils.not_empty;
+
 /**
  * Utilities for working with MIME Media Types
  */
@@ -39,7 +43,10 @@ public final class MimeTypeHelper {
 
     private MimeTypeHelper() {}
   
-    private static final MimeType WILDCARD = createWildcard();
+    public static final MimeType WILDCARD = createWildcard();
+    public static final MimeType ATOM = unmodifiableMimeType(Constants.ATOM_MEDIA_TYPE);
+    public static final MimeType ENTRY = unmodifiableMimeType(Constants.ENTRY_MEDIA_TYPE);
+    public static final MimeType FEED = unmodifiableMimeType(Constants.FEED_MEDIA_TYPE);
 
     public static String getCharset(String mediatype) {
         try {
@@ -59,11 +66,7 @@ public final class MimeTypeHelper {
     }
 
     private static MimeType createWildcard() {
-        try {
-            return new MimeType("*/*");
-        } catch (Exception e) {
-            return null; // Won't happen
-        }
+      return unmodifiableMimeType("*/*");
     }
 
     public static Predicate<String> isMatch(final String a) {
@@ -94,16 +97,11 @@ public final class MimeTypeHelper {
      * Returns true if media type a matches media type b
      */
     public static boolean isMatch(String a, String b) {
-        if ((a == null || a.length() == 0) && (b == null || b.length() == 0))
-            return true;
-        boolean answer = false;
-        try {
-            MimeType mta = new MimeType(a.toLowerCase());
-            MimeType mtb = new MimeType(b.toLowerCase());
-            return isMatch(mta, mtb);
-        } catch (Exception e) {
-        }
-        return answer;
+        if (bothAreEmpty(a, b)) return true;
+        if (onlyOneIsNull(a, b)) return false;
+        return isMatch(
+          unmodifiableMimeType(a.toLowerCase()), 
+          unmodifiableMimeType(b.toLowerCase()));
     }
 
     public static boolean isMatch(MimeType a, MimeType b) {
@@ -114,48 +112,34 @@ public final class MimeTypeHelper {
      * Returns true if media type a matches media type b
      */
     public static boolean isMatch(MimeType a, MimeType b, boolean includeparams) {
-        try {
-            if (a == null || b == null)
-                return true;
-            if (a.match(b)) {
-                if (includeparams) {
-                    MimeTypeParameterList aparams = a.getParameters();
-                    MimeTypeParameterList bparams = b.getParameters();
-                    if (aparams.isEmpty() && bparams.isEmpty())
-                        return true;
-                    if (aparams.isEmpty() && !bparams.isEmpty())
-                        return false;
-                    if (!aparams.isEmpty() && bparams.isEmpty())
-                        return false;
-                    boolean answer = true;
-                    for (Enumeration<?> e = aparams.getNames(); e.hasMoreElements();) {
-                        String aname = (String)e.nextElement();
-                        String avalue = aparams.get(aname);
-                        String bvalue = bparams.get(aname);
-                        if (avalue.equals(bvalue))
-                            answer = true;
-                        else {
-                            answer = false;
-                            break;
-                        }
-                    }
-                    return answer;
-                } else
-                    return true;
-            }
-            if (a.equals(WILDCARD))
-                return true;
-            if (a.getPrimaryType().equals("*")) {
-                MimeType c = new MimeType(b.getPrimaryType(), a.getSubType());
-                return isMatch(c, b);
-            }
-            if (b.getPrimaryType().equals("*")) {
-                MimeType c = new MimeType(a.getPrimaryType(), b.getSubType());
-                return isMatch(a, c);
-            }
-        } catch (Exception e) {
-        }
-        return false;
+      if (bothAreNull(a,b))
+          return true;
+      if (a.match(b))
+        if (includeparams) {
+          MimeTypeParameterList aparams = a.getParameters();
+          MimeTypeParameterList bparams = b.getParameters();
+          if (bothAreTrue(aparams.isEmpty(),bparams.isEmpty()))
+              return true;
+          if (onlyOneIsTrue(aparams.isEmpty(),bparams.isEmpty()))
+              return false;
+          for (Enumeration<?> e = aparams.getNames(); e.hasMoreElements();) {
+            String aname = (String)e.nextElement();
+            String avalue = aparams.get(aname);
+            String bvalue = bparams.get(aname);
+            if (!avalue.equals(bvalue))
+              return false;
+          }
+          return true;
+        } else
+            return true;
+      if (a.equals(WILDCARD))
+          return true;
+      if (a.getPrimaryType().equals("*"))
+        return isMatch(unmodifiableMimeType(b.getPrimaryType() + "/" + a.getSubType()), b);
+      if (b.getPrimaryType().equals("*"))
+        return isMatch(a, unmodifiableMimeType(a.getPrimaryType() + "/" + b.getSubType()));
+
+      return false;
     }
 
     private static boolean isMatchType(String actual, String expected) {
@@ -240,9 +224,9 @@ public final class MimeTypeHelper {
     public static boolean isEntry(String a) {
         try {
             MimeType mta = new MimeType(a.toLowerCase());
-            MimeType mtb = new MimeType(Constants.ATOM_MEDIA_TYPE);
-            MimeType mtc = new MimeType(Constants.ENTRY_MEDIA_TYPE);
-            return isMatch(mta, mtc) || (isMatch(mta, mtb) && isMatchType(mta.getParameter("type"), "entry"));
+            return isMatch(mta, ENTRY) || 
+                  (isMatch(mta, ATOM) && 
+                   isMatchType(mta.getParameter("type"), "entry"));
         } catch (Exception e) {
         }
         return false;
@@ -254,9 +238,9 @@ public final class MimeTypeHelper {
     public static boolean isFeed(String a) {
         try {
             MimeType mta = new MimeType(a.toLowerCase());
-            MimeType mtb = new MimeType(Constants.ATOM_MEDIA_TYPE);
-            MimeType mtc = new MimeType(Constants.FEED_MEDIA_TYPE);
-            return isMatch(mta, mtc) || (isMatch(mta, mtb) && isMatchType(mta.getParameter("type"), "feed"));
+            return isMatch(mta, FEED) || 
+                  (isMatch(mta, ATOM) && 
+                   isMatchType(mta.getParameter("type"), "feed"));
         } catch (Exception e) {
         }
         return false;
@@ -271,8 +255,10 @@ public final class MimeTypeHelper {
             try {
                 MimeType mta = new MimeType(a);
                 answer =
-                    (("application".equalsIgnoreCase(mta.getPrimaryType()) || "text".equalsIgnoreCase(mta
-                        .getPrimaryType())) && mta.getSubType().equals("xml") || mta.getSubType().endsWith("+xml"));
+                    (("application".equalsIgnoreCase(mta.getPrimaryType()) ||
+                      "text".equalsIgnoreCase(mta.getPrimaryType())) && 
+                      mta.getSubType().equals("xml") || 
+                      mta.getSubType().endsWith("+xml"));
             } catch (Exception e) {
             }
         }
@@ -405,8 +391,56 @@ public final class MimeTypeHelper {
     public static final Function<String,MimeType> parser = 
       new Function<String,MimeType>() {
         public MimeType apply(String input) {
-          return input != null ? MimeTypeHelper.create(input) : null;
+          return input != null ? unmodifiableMimeType(input) : null;
         }
       
     };
+    
+  public static MimeType unmodifiableMimeType(String mimeType) {
+    try {
+      return new UnmodifiableMimeType(mimeType);
+    } catch (javax.activation.MimeTypeParseException t) {
+      throw ExceptionHelper.propogate(t);
+    }
+  }
+
+  public static MimeType unmodifiableMimeType(MimeType mimeType) {
+    try {
+      return mimeType instanceof UnmodifiableMimeType ?
+        mimeType :
+        new UnmodifiableMimeType(mimeType.toString());
+    } catch (javax.activation.MimeTypeParseException t) {
+      throw ExceptionHelper.propogate(t);
+    }
+  }
+  
+    
+  public static class UnmodifiableMimeType extends MimeType {
+    public UnmodifiableMimeType() {
+      super();
+    }
+    public UnmodifiableMimeType(String primary, String sub)
+        throws javax.activation.MimeTypeParseException {
+      super(primary, sub);
+    }
+    public UnmodifiableMimeType(String rawdata)
+        throws javax.activation.MimeTypeParseException {
+      super(rawdata);
+    }
+    public void setPrimaryType(String primary)
+        throws javax.activation.MimeTypeParseException {
+      throw new UnsupportedOperationException();
+    }
+    public void setSubType(String sub)
+        throws javax.activation.MimeTypeParseException {
+      throw new UnsupportedOperationException();
+    }
+    public void setParameter(String name, String value) {
+      throw new UnsupportedOperationException();
+    }
+    public void removeParameter(String name) {
+      throw new UnsupportedOperationException();
+    }
+    
+  }
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Chain.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Chain.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Chain.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Chain.java Mon Nov  7 21:31:52 2011
@@ -116,4 +116,5 @@ public final class Chain<T,R> 
         return out != null ? out.apply(output) : output;
       }
     }
+
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java Mon Nov  7 21:31:52 2011
@@ -1,5 +1,7 @@
 package org.apache.abdera2.common.misc;
 
+import org.apache.abdera2.common.text.CharUtils;
+
 import com.google.common.base.Equivalence;
 import com.google.common.base.Predicate;
 import static com.google.common.base.Preconditions.*;
@@ -50,6 +52,18 @@ public class Comparisons {
     return onlySecondIsNull().apply(t1,t2);
   }
   
+  public static boolean bothAreTrue(boolean t1, boolean t2) {
+    return t1 && t2;
+  }
+  
+  public static boolean onlyOneIsTrue(boolean t1, boolean t2) {
+    return t1 |= t2;
+  }
+  
+  public static boolean bothAreEmpty(String t1, String t2) {
+    return !CharUtils.not_empty(t1) && !CharUtils.not_empty(t2);
+  }
+  
   public static <T>boolean onlyOneIsNull(T t1, T t2) {
     return onlyOneIsNull().apply(t1,t2);
   }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MapRed.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MapRed.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MapRed.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MapRed.java Mon Nov  7 21:31:52 2011
@@ -100,7 +100,7 @@ public final class MapRed {
     private final List<Pair<K,V>> list = 
       new ArrayList<Pair<K,V>>();
     public PairBuilder<K,V> pair(K k, V v) {
-      list.add(MapRed.<K,V>pair(k,v));
+      list.add(Pair.<K,V>of(k,v));
       return this;
     }
     public Iterable<Pair<K, V>> get() {
@@ -114,29 +114,10 @@ public final class MapRed {
   public static <K,V>Iterable<Pair<K,V>> pairs(Map<K,V> map) {
     List<Pair<K,V>> list = new ArrayList<Pair<K,V>>();
     for (Map.Entry<K,V> entry : map.entrySet())
-      list.add(pair(entry.getKey(),entry.getValue()));
+      list.add(Pair.of(entry.getKey(),entry.getValue()));
     return list;
   }
   
-  public static <K,V>Pair<K,V> pair(K k, V v) {
-    return new Pair<K,V>(k,v);
-  }
-  
-  public static class Pair<K,V> {
-    private K key;
-    private V val;
-    public Pair(K key, V val) {
-      this.key = key;
-      this.val = val;
-    }
-    public K key() {
-      return key;
-    }
-    public V val() {
-      return val;
-    }
-  }
-  
   public static interface Reducer<K2,V2,K3,V3> {
     void reduce(
       K2 key, 
@@ -261,9 +242,9 @@ public final class MapRed {
         SimpleCollector<K2,V2> context = new SimpleCollector<K2,V2>(nulls);
         List<Pair<K2, Iterable<V2>>> list = new ArrayList<Pair<K2, Iterable<V2>>>();
         for (Pair<K1, V1> entry : input)
-          mapper.map(entry.key(), entry.val(), context);
+          mapper.map(entry.first(), entry.second(), context);
         for (Map.Entry<K2, Iterable<V2>> entry : context.collected())
-          list.add(pair(entry.getKey(), entry.getValue()));
+          list.add(Pair.of(entry.getKey(), entry.getValue()));
         return list;
       }      
     };
@@ -278,9 +259,9 @@ public final class MapRed {
         SimpleCollector<K2,V2> context = new SimpleCollector<K2,V2>(nulls,comparator);
         List<Pair<K2, Iterable<V2>>> list = new ArrayList<Pair<K2, Iterable<V2>>>();
         for (Pair<K1, V1> entry : input)
-          mapper.map(entry.key(), entry.val(), context);
+          mapper.map(entry.first(), entry.second(), context);
         for (Map.Entry<K2, Iterable<V2>> entry : context.collected())
-          list.add(pair(entry.getKey(), entry.getValue()));
+          list.add(Pair.of(entry.getKey(), entry.getValue()));
         return list;
       }      
     };
@@ -306,9 +287,9 @@ public final class MapRed {
         SimpleCollector<K2,V2> context = new SimpleCollector<K2,V2>(nulls, comparator);
         List<Pair<K2, Iterable<V2>>> list = new ArrayList<Pair<K2, Iterable<V2>>>();
         for (Pair<K1, Iterable<V1>> entry : input)
-          reducer.reduce(entry.key(), entry.val().iterator(), context);
+          reducer.reduce(entry.first(), entry.second().iterator(), context);
         for (Map.Entry<K2, Iterable<V2>> entry : context.collected())
-          list.add(pair(entry.getKey(), entry.getValue()));
+          list.add(Pair.of(entry.getKey(), entry.getValue()));
         return list;
       }      
     };
@@ -322,9 +303,9 @@ public final class MapRed {
         SimpleCollector<K2,V2> context = new SimpleCollector<K2,V2>(nulls);
         List<Pair<K2, Iterable<V2>>> list = new ArrayList<Pair<K2, Iterable<V2>>>();
         for (Pair<K1, Iterable<V1>> entry : input)
-          reducer.reduce(entry.key(), entry.val().iterator(), context);
+          reducer.reduce(entry.first(), entry.second().iterator(), context);
         for (Map.Entry<K2, Iterable<V2>> entry : context.collected())
-          list.add(pair(entry.getKey(), entry.getValue()));
+          list.add(Pair.of(entry.getKey(), entry.getValue()));
         return list;
       }      
     };

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java Mon Nov  7 21:31:52 2011
@@ -21,7 +21,60 @@ import com.google.common.collect.Iterabl
 import com.google.common.util.concurrent.ListenableFutureTask;
 
 public class MoreFunctions {
-
+  
+  private static int _hash(Object obj ) {
+    if (obj != null) {
+      Class<?> type = obj.getClass();
+      if (type.isArray()) {
+        if (type.equals(long[].class))
+          return Arrays.hashCode((long[])obj);
+        else if (type.equals(int[].class))
+          return Arrays.hashCode((int[])obj);
+        else if (type.equals(short[].class))
+          return Arrays.hashCode((short[])obj);
+        else if (type.equals(byte[].class))
+          return Arrays.hashCode((byte[])obj);
+        else if (type.equals(boolean[].class))
+          return Arrays.hashCode((boolean[])obj);
+        else if (type.equals(char[].class))
+          return Arrays.hashCode((char[])obj);
+        else if (type.equals(double[].class))
+          return Arrays.hashCode((double[])obj);
+        else if (type.equals(float[].class))
+          return Arrays.hashCode((float[])obj);
+        else return Arrays.hashCode((Object[])obj);
+      } else {
+        if (obj instanceof Iterable) {
+          return genHashCode(obj.hashCode(), Iterables.toArray((Iterable)obj, Object.class));
+        } else {
+          if (obj instanceof Long) {
+            long f = (Long)obj;
+            return (int)(f ^ (f >>> 32));
+          } else if (obj instanceof Double) {
+              long f = Double.doubleToLongBits((Double)obj);
+              return (int)(f ^ (f >>> 32));
+            } else if (obj instanceof Float) {
+              return Float.floatToIntBits((Float)obj);
+            } else if (obj instanceof Boolean) {
+              return (Boolean)obj ? 1231 : 1237;
+            } else if (obj instanceof Integer) {
+              return (Integer)obj;
+            } else return obj.hashCode();
+          }
+        }
+      }
+    return 0;
+  }
+  
+  public static int genHashCode(int sup, Object... fields) {
+    final int prime = 31;
+    int result = sup;
+    for (Object field : fields)
+      result = prime * result + 
+        (field != null ? _hash(field) : 0);
+    return result;
+  }
+  
   public static <T>T createInstance(Class<T> _class, Object... args) {
     return MoreFunctions.<T>createInstance(_class).apply(args);
   }

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Pair.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Pair.java?rev=1198949&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Pair.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Pair.java Mon Nov  7 21:31:52 2011
@@ -0,0 +1,53 @@
+package org.apache.abdera2.common.misc;
+
+public class Pair<K,V> {
+
+  private final K k;
+  private final V v;
+  
+  public Pair(K k, V v) {
+    this.k = k;
+    this.v = v;
+  }
+  
+  public K first() {
+    return k;
+  }
+  
+  public V second() {
+    return v;
+  }
+
+  public static <K,V>Pair<K,V> of(K k, V v) {
+    return new Pair<K,V>(k,v);
+  }
+  
+  @Override
+  public int hashCode() {
+    return MoreFunctions.genHashCode(1, k,v);
+  }
+
+  @SuppressWarnings({ "unchecked", "rawtypes" })
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj)
+      return true;
+    if (obj == null)
+      return false;
+    if (getClass() != obj.getClass())
+      return false;
+    Pair<K,V> other = (Pair) obj;
+    if (k == null) {
+      if (other.k != null)
+        return false;
+    } else if (!k.equals(other.k))
+      return false;
+    if (v == null) {
+      if (other.v != null)
+        return false;
+    } else if (!v.equals(other.v))
+      return false;
+    return true;
+  }
+  
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Pair.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractCollectionAdapter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractCollectionAdapter.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractCollectionAdapter.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractCollectionAdapter.java Mon Nov  7 21:31:52 2011
@@ -25,6 +25,7 @@ import org.apache.abdera2.common.text.Ur
 import org.apache.abdera2.common.date.DateTimes;
 import org.apache.abdera2.common.http.EntityTag;
 import org.apache.abdera2.common.misc.ExceptionHelper;
+import org.apache.abdera2.common.misc.MoreFunctions;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.joda.time.DateTime;
@@ -59,11 +60,7 @@ public abstract class AbstractCollection
         this.method = method.toUpperCase();
       }
       public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((method == null) ? 0 : method.hashCode());
-        result = prime * result + ((type == null) ? 0 : type.hashCode());
-        return result;
+        return MoreFunctions.genHashCode(1, method,type);
       }
       public boolean equals(Object obj) {
         if (this == obj)

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractProvider.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractProvider.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractProvider.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractProvider.java Mon Nov  7 21:31:52 2011
@@ -18,7 +18,6 @@
 package org.apache.abdera2.common.protocol;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -33,6 +32,9 @@ import org.apache.commons.logging.LogFac
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
+import static java.util.Collections.unmodifiableMap;
+import static com.google.common.collect.Iterables.*;
+import static org.apache.abdera2.common.protocol.ProviderHelper.*;
 
 /**
  * Base Provider implementation that provides the core implementation details for all Providers. This class provides the
@@ -87,7 +89,7 @@ public abstract class AbstractProvider
     public ResponseContext apply(RequestContext request) {
       Target target = request.getTarget();
       if (Target.NOT_FOUND.apply(target))
-          return ProviderHelper.notfound(request);
+          return notfound(request);
       TargetType type = target.getType();
       log.debug(String.format(
         "Processing [%s] request for Target [%s] of Type [%s]",
@@ -98,13 +100,13 @@ public abstract class AbstractProvider
         getWorkspaceManager()
           .getCollectionAdapter(request);
       if (adapter == null && type != TargetType.TYPE_SERVICE)
-        return ProviderHelper.notfound(request);
+        return notfound(request);
       RequestProcessor processor = 
-        this.requestProcessors
+        requestProcessors
           .get(type)
           .apply(adapter);
       if (processor == null)
-          return ProviderHelper.notfound(request);
+        return notfound(request);
       Chain<RequestContext,ResponseContext> chain = 
         Chain.<RequestContext,ResponseContext>make()
         .to(processor)
@@ -118,30 +120,29 @@ public abstract class AbstractProvider
       }
       return response != null ? 
         response : 
-        ProviderHelper.badrequest(request);
+        badrequest(request);
     }
 
     /**
      * Subclass to customize the kind of error response to return
      */
     protected ResponseContext createErrorResponse(RequestContext request, Throwable e) {
-        return ProviderHelper.servererror(request, e);
+      return servererror(request, e);
     }
 
     protected abstract WorkspaceManager getWorkspaceManager();
 
     public void setFilters(Collection<Task<RequestContext,ResponseContext>> filters) {
-        this.filters = new LinkedHashSet<Task<RequestContext,ResponseContext>>(filters);
+      this.filters = new LinkedHashSet<Task<RequestContext,ResponseContext>>(filters);
     }
 
     public Iterable<Task<RequestContext,ResponseContext>> getFilters(RequestContext request) {
-        return filters;
+      return unmodifiableIterable(filters);
     }
 
     public void addFilter(Task<RequestContext,ResponseContext>... filters) {
-        for (Task<RequestContext,ResponseContext> filter : filters) {
-            this.filters.add(filter);
-        }
+      for (Task<RequestContext,ResponseContext> filter : filters)
+        this.filters.add(filter);
     }
 
     public void setRequestProcessors(
@@ -151,8 +152,8 @@ public abstract class AbstractProvider
           CollectionAdapter,
           ? extends RequestProcessor>> 
             requestProcessors) {
-        this.requestProcessors.clear();
-        this.requestProcessors.putAll(requestProcessors);
+        requestProcessors.clear();
+        requestProcessors.putAll(requestProcessors);
     }
 
     public void addRequestProcessor(
@@ -160,7 +161,7 @@ public abstract class AbstractProvider
       Class<? extends RequestProcessor> _class, 
       Predicate<RequestContext> predicate,
       WorkspaceManager workspaceManager) {
-        this.requestProcessors.put(
+        requestProcessors.put(
           type, 
           RequestProcessor.forClass(
             _class,
@@ -172,7 +173,7 @@ public abstract class AbstractProvider
         TargetType type, 
         Class<? extends RequestProcessor> _class,
         WorkspaceManager workspaceManager) {
-          this.requestProcessors.put(
+          requestProcessors.put(
             type, 
             RequestProcessor.forClass(
               _class,
@@ -186,11 +187,11 @@ public abstract class AbstractProvider
           CollectionAdapter,
           ? extends RequestProcessor>> 
             requestProcessors) {
-        this.requestProcessors.putAll(requestProcessors);
+        requestProcessors.putAll(requestProcessors);
     }
 
     public Map<TargetType, Function<CollectionAdapter,? extends RequestProcessor>> getRequestProcessors() {
-        return Collections.unmodifiableMap(this.requestProcessors);
+        return unmodifiableMap(this.requestProcessors);
     }
     
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractResponseContext.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractResponseContext.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractResponseContext.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractResponseContext.java Mon Nov  7 21:31:52 2011
@@ -213,7 +213,7 @@ public abstract class AbstractResponseCo
     public <T extends ResponseContext>T setContentType(String type, String charset) {
         if (type == null)
             return (T)removeHeader("Content-Type");
-        MimeType mimeType = MimeTypeHelper.create(type);
+        MimeType mimeType = MimeTypeHelper.unmodifiableMimeType(type);
         if (charset != null)
             mimeType.setParameter("charset", charset);
         return (T)setHeader("Content-Type", mimeType.toString());

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicCollectionInfo.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicCollectionInfo.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicCollectionInfo.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicCollectionInfo.java Mon Nov  7 21:31:52 2011
@@ -21,6 +21,8 @@ import java.io.Serializable;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 import com.google.common.base.Supplier;
 
 public class BasicCollectionInfo 
@@ -79,12 +81,7 @@ public class BasicCollectionInfo 
 
     @Override
     public int hashCode() {
-      final int prime = 31;
-      int result = 1;
-      result = prime * result + ((accepts == null) ? 0 : accepts.hashCode());
-      result = prime * result + ((href == null) ? 0 : href.hashCode());
-      result = prime * result + ((title == null) ? 0 : title.hashCode());
-      return result;
+      return MoreFunctions.genHashCode(1, accepts,href,title);
     }
 
     @Override

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicWorkspaceInfo.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicWorkspaceInfo.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicWorkspaceInfo.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicWorkspaceInfo.java Mon Nov  7 21:31:52 2011
@@ -21,6 +21,8 @@ import java.io.Serializable;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 import com.google.common.base.Supplier;
 import com.google.common.collect.Iterables;
 
@@ -79,11 +81,7 @@ public class BasicWorkspaceInfo
     }
 
     public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((collections == null) ? 0 : collections.hashCode());
-        result = prime * result + ((title == null) ? 0 : title.hashCode());
-        return result;
+      return MoreFunctions.genHashCode(1, collections,title);
     }
 
     public boolean equals(Object obj) {

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ProtocolException.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ProtocolException.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ProtocolException.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ProtocolException.java Mon Nov  7 21:31:52 2011
@@ -17,6 +17,8 @@
  */
 package org.apache.abdera2.common.protocol;
 
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 public class ProtocolException 
   extends RuntimeException {
 
@@ -30,10 +32,7 @@ public class ProtocolException 
 
     @Override
     public int hashCode() {
-      final int prime = 31;
-      int result = 1;
-      result = prime * result + code;
-      return result;
+      return MoreFunctions.genHashCode(1,code);
     }
 
     @Override

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java Mon Nov  7 21:31:52 2011
@@ -24,6 +24,9 @@ import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.LinkedHashMultimap;
@@ -112,11 +115,7 @@ public class RegexTargetResolver<R exten
     }
 
     public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((fields == null) ? 0 : fields.hashCode());
-        result = prime * result + ((patterns == null) ? 0 : patterns.hashCode());
-        return result;
+      return MoreFunctions.genHashCode(1, fields,patterns);
     }
 
     @SuppressWarnings("unchecked")
@@ -185,15 +184,9 @@ public class RegexTargetResolver<R exten
 
         @Override
         public int hashCode() {
-            final int PRIME = 31;
-            int result = 1;
-            String m = matcher.group(0);
-            String p = matcher.pattern().pattern();
-            result = PRIME * result + super.hashCode();
-            result = PRIME * result + ((m == null) ? 0 : m.hashCode());
-            result = PRIME * result + ((p == null) ? 0 : p.hashCode());
-            result = PRIME * result + ((type == null) ? 0 : type.hashCode());
-            return result;
+          String m = matcher.group(0);
+          String p = matcher.pattern().pattern();
+          return MoreFunctions.genHashCode(1, m,p,type);
         }
 
         @Override

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java Mon Nov  7 21:31:52 2011
@@ -22,6 +22,8 @@ import java.security.Principal;
 
 import javax.security.auth.Subject;
 
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 import com.google.common.base.Function;
 
 /**
@@ -68,10 +70,7 @@ public class SimpleSubjectResolver 
 
         @Override
         public int hashCode() {
-            final int PRIME = 31;
-            int result = 1;
-            result = PRIME * result + ((name == null) ? 0 : name.hashCode());
-            return result;
+          return MoreFunctions.genHashCode(1, name);
         }
 
         @Override
@@ -112,10 +111,7 @@ public class SimpleSubjectResolver 
         }
 
         public int hashCode() {
-            final int PRIME = 31;
-            int result = 1;
-            result = PRIME * result + ((name == null) ? 0 : name.hashCode());
-            return result;
+          return MoreFunctions.genHashCode(1, name);
         }
     }
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java Mon Nov  7 21:31:52 2011
@@ -19,6 +19,8 @@ package org.apache.abdera2.common.protoc
 
 import java.util.Iterator;
 
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 
 
 @SuppressWarnings("unchecked")
@@ -67,11 +69,7 @@ public class SimpleTarget
 
     @Override
     public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + ((context == null) ? 0 : context.hashCode());
-        result = PRIME * result + ((type == null) ? 0 : type.hashCode());
-        return result;
+      return MoreFunctions.genHashCode(1, context, type);
     }
 
     @Override

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetFunctionResolver.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetFunctionResolver.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetFunctionResolver.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetFunctionResolver.java Mon Nov  7 21:31:52 2011
@@ -11,6 +11,8 @@ import java.util.regex.Pattern;
 
 import org.apache.abdera2.common.iri.IRI;
 import org.apache.abdera2.common.misc.ExceptionHelper;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
@@ -61,10 +63,7 @@ public class TargetFunctionResolver<R ex
 
   @Override
   public int hashCode() {
-    final int prime = 31;
-    int result = 1;
-    result = prime * result + ((functions == null) ? 0 : functions.hashCode());
-    return result;
+    return MoreFunctions.genHashCode(1, functions);
   }
 
   @Override