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/10/20 00:33:52 UTC

svn commit: r1186541 [2/8] - in /abdera/abdera2: ./ .settings/ activities/ activities/.settings/ activities/src/main/java/org/apache/abdera2/activities/client/ activities/src/main/java/org/apache/abdera2/activities/extra/ activities/src/main/java/org/a...

Modified: abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/AbderaSession.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/AbderaSession.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/AbderaSession.java (original)
+++ abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/AbderaSession.java Wed Oct 19 22:33:04 2011
@@ -168,7 +168,7 @@ public class AbderaSession extends Sessi
                 if (d.getEntityTag() != null)
                     options.setIfMatch(d.getEntityTag());
                 else if (d.getLastModified() != null)
-                    options.setIfUnmodifiedSince(d.getLastModified());
+                    options.setIfUnmodifiedSince(d.getLastModified().toDate());
             }
         }
         return (T)wrap(execute("PUT", uri, new AbderaEntity(base), options));

Modified: abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/ClientResponseImpl.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/ClientResponseImpl.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/ClientResponseImpl.java (original)
+++ abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/ClientResponseImpl.java Wed Oct 19 22:33:04 2011
@@ -195,7 +195,7 @@ class ClientResponseImpl 
 
   public CacheControl getCacheControl() {
     String cc = getHeader("Cache-Control");
-    return cc != null ? new CacheControl(cc) : null;
+    return cc != null ? CacheControl.parse(cc) : null;
   }
 
   @SuppressWarnings("unchecked")

Modified: abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestHelper.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestHelper.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestHelper.java (original)
+++ abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestHelper.java Wed Oct 19 22:33:04 2011
@@ -47,8 +47,10 @@ import org.apache.http.client.params.Cli
 import org.apache.http.params.CoreProtocolPNames;
 import org.apache.http.params.HttpParams;
 
-public class RequestHelper {
+public final class RequestHelper {
 
+    private RequestHelper() {}
+  
     public static HttpUriRequest createRequest(
       String method, 
       String uri, 

Modified: abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestOptions.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestOptions.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestOptions.java (original)
+++ abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/RequestOptions.java Wed Oct 19 22:33:04 2011
@@ -476,7 +476,7 @@ public class RequestOptions extends Abst
      * Sets the value of the HTTP Cache-Control header
      */
     public RequestOptions setCacheControl(String cc) {
-        this.cacheControl = new CacheControl(cc);
+        this.cacheControl = CacheControl.parse(cc);
         return this;
     }
     

Modified: abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/Session.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/Session.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/Session.java (original)
+++ abdera/abdera2/client/src/main/java/org/apache/abdera2/protocol/client/Session.java Wed Oct 19 22:33:04 2011
@@ -72,7 +72,7 @@ public class Session {
     protected <T extends ClientResponse>T wrap(ClientResponse resp) {
       return (T)resp;
     }
-        
+    
     /**
      * Sends an HTTP GET request to the specified URI.
      * 

Added: abdera/abdera2/common/.classpath
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/.classpath?rev=1186541&view=auto
==============================================================================
--- abdera/abdera2/common/.classpath (added)
+++ abdera/abdera2/common/.classpath Wed Oct 19 22:33:04 2011
@@ -0,0 +1,12 @@
+<classpath>
+  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="target/maven-shared-archive-resources" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.5/commons-codec-1.5.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-activation_1.1_spec/1.1/geronimo-activation_1.1_spec-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/ibm/icu/icu4j/4.8.1.1/icu4j-4.8.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/javaee-web-api/6.0/javaee-web-api-6.0.jar"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+</classpath>
\ No newline at end of file

Propchange: abdera/abdera2/common/.classpath
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/.project
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/.project?rev=1186541&view=auto
==============================================================================
--- abdera/abdera2/common/.project (added)
+++ abdera/abdera2/common/.project Wed Oct 19 22:33:04 2011
@@ -0,0 +1,13 @@
+<projectDescription>
+  <name>abdera2-common</name>
+  <comment>Abdera2 Common Code Library. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Propchange: abdera/abdera2/common/.project
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/.settings/org.eclipse.jdt.core.prefs?rev=1186541&view=auto
==============================================================================
--- abdera/abdera2/common/.settings/org.eclipse.jdt.core.prefs (added)
+++ abdera/abdera2/common/.settings/org.eclipse.jdt.core.prefs Wed Oct 19 22:33:04 2011
@@ -0,0 +1,5 @@
+#Thu Sep 29 16:38:16 PDT 2011
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6

Propchange: abdera/abdera2/common/.settings/org.eclipse.jdt.core.prefs
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: abdera/abdera2/common/pom.xml
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/pom.xml?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/pom.xml (original)
+++ abdera/abdera2/common/pom.xml Wed Oct 19 22:33:04 2011
@@ -77,5 +77,10 @@
       <artifactId>icu4j</artifactId>
     </dependency>
 
+    <dependency>
+        <groupId>com.google.guava</groupId>
+        <artifactId>guava</artifactId>
+    </dependency>
+
   </dependencies>
 </project>

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/Discover.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/Discover.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/Discover.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/Discover.java Wed Oct 19 22:33:04 2011
@@ -29,10 +29,11 @@ import java.util.LinkedHashSet;
 import java.util.Set;
 
 import org.apache.abdera2.common.anno.AnnoUtil;
-import org.apache.abdera2.common.misc.MultiIterator;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import com.google.common.collect.Iterators;
+
 @SuppressWarnings("unchecked")
 public final class Discover {
 
@@ -174,7 +175,7 @@ public final class Discover {
                         new DefaultLoaderIterator<T>(loader, e.nextElement().openStream(), classesonly, args);
                     list.add(i);
                 }
-                return new MultiIterator<T>(list);
+                return Iterators.concat(list.iterator());
             } catch (Throwable t) {
                 throw new RuntimeException(t);
             }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/AnnoUtil.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/AnnoUtil.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/AnnoUtil.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/AnnoUtil.java Wed Oct 19 22:33:04 2011
@@ -24,8 +24,10 @@ import java.util.Set;
 import javax.xml.namespace.QName;
 
 
-public class AnnoUtil {
+public final class AnnoUtil {
 
+  private AnnoUtil() {}
+  
   /**
    * Retrieves the value of the Name attribute from the specified 
    * item. If the item is an instance object, the name is pulled from it's

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java?rev=1186541&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java Wed Oct 19 22:33:04 2011
@@ -0,0 +1,463 @@
+package org.apache.abdera2.common.date;
+
+import java.util.Calendar;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.apache.abdera2.common.selector.Selector;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.ISODateTimeFormat;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.Duration;
+import org.joda.time.Interval;
+
+import com.google.common.base.Equivalence;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.Range;
+import com.google.common.collect.Ranges;
+
+public final class DateTimes {
+
+  private DateTimes() {}
+  
+  private static final DateTimeFormatter DTF =
+    ISODateTimeFormat.dateTime();
+  
+  public static String formatNow() {
+    return DateTime.now().toString(DTF);
+  }
+  
+  public static String format(String dateTime) {
+    return DTF.print(new DateTime(dateTime));
+  }
+  
+  public static String format(DateTime dateTime) {
+    return DTF.print(dateTime);
+  }
+  
+  public static String format(Date date) {
+    return DTF.print(new DateTime(date));
+  }
+  
+  public static String format(Calendar cal) {
+    return DTF.print(new DateTime(cal));
+  }
+  
+  public static String format(long ms) {
+    return DTF.print(ms);
+  }
+  
+  public static Date parse(String t) {
+    return DateTime.parse(t).toDate();
+  }
+  
+  public static DateTime toUTC(DateTime dt) {
+    return dt.toDateTime(DateTimeZone.UTC);
+  }
+  
+  public static DateTime toTimeZone(DateTime dt, TimeZone tz) {
+    return dt.toDateTime(DateTimeZone.forTimeZone(tz));
+  }
+  
+  public static DateTime toTimeZone(DateTime dt, String id) {
+    return dt.toDateTime(DateTimeZone.forID(id));
+  }
+  
+  public DateTimeBuilder makeDateTime() {
+    return new DateTimeBuilder();
+  }
+  
+  public static class DateTimeBuilder implements Supplier<DateTime> {
+    private int year, month, day, hour, minute, second, millis;
+    private DateTimeZone dtz;
+    public DateTimeBuilder() {}
+    public DateTimeBuilder year(int year) {
+      this.year = year;
+      return this;
+    }
+    public DateTimeBuilder month(int month) {
+      this.month = month;
+      return this;
+    }
+    public DateTimeBuilder day(int day) {
+      this.day = day;
+      return this;
+    }
+    public DateTimeBuilder hour(int hour) {
+      this.hour = hour;
+      return this;
+    }
+    public DateTimeBuilder minute(int minute) {
+      this.minute = minute;
+      return this;
+    }
+    public DateTimeBuilder second(int second) {
+      this.second = second;
+      return this;
+    }
+    public DateTimeBuilder millisecond(int ms) {
+      this.millis = ms;
+      return this;
+    }
+    public DateTimeBuilder timezone(TimeZone tz) {
+      this.dtz = DateTimeZone.forTimeZone(tz);
+      return this;
+    }
+    public DateTimeBuilder timezone(String id) {
+      this.dtz = DateTimeZone.forID(id);
+      return this;
+    }
+    public DateTimeBuilder timezone(int offsetHours) {
+      this.dtz = DateTimeZone.forOffsetHours(offsetHours);
+      return this;
+    }
+    public DateTimeBuilder timezone(int offsetHours, int offsetMinutes) {
+      this.dtz = DateTimeZone.forOffsetHoursMinutes(offsetHours, offsetMinutes);
+      return this;
+    }
+    public DateTime get() {
+      return new DateTime(year,month,day,hour,minute,second,millis,dtz);
+    }
+  }
+  
+  public static abstract class DateTimeComparator<X> implements Comparator<X> {
+    public int innerCompare(DateTime d1, DateTime d2) {
+      if (d1 != null && d2 == null) return 1;
+      if (d1 == null && d2 != null) return -1;
+      if (d1 == null && d2 == null) return 0;
+      return d1.compareTo(d2);
+    }
+  }
+
+  public static Selector<DateTime> selectorForRange(Range<DateTime> range) {
+    return Selector.Utils.forPredicate(range);
+  }
+  
+  public static Range<DateTime> all() {
+    return Ranges.<DateTime>all();
+  }
+  
+  public static Range<DateTime> atOrAfterNow() {
+    return atOrAfter(DateTime.now());
+  }
+  
+  public static Range<DateTime> atOrAfter(DateTime dateTime) {
+    return Ranges.<DateTime>atLeast(dateTime);
+  }
+  
+  public static Range<DateTime> atOrBefore(DateTime dateTime) {
+    return Ranges.<DateTime>atMost(dateTime);
+  }
+  
+  public static Range<DateTime> atOrBetween(DateTime low, DateTime high) {
+    return Ranges.<DateTime>closed(low,high);
+  }
+  
+  public static Range<DateTime> atOrBetween(DateTime low, Duration duration) {
+    return atOrBetween(low,low.plus(duration));
+  }
+  
+  public static Range<DateTime> atOrBetween(Duration duration, DateTime high) {
+    return atOrBetween(high.minus(duration),high);
+  }
+  
+  public static Range<DateTime> atOrBetween(Interval interval) {
+    return atOrBetween(interval.getStart(),interval.getEnd());
+  }
+  
+  public static Range<DateTime> atBetweenOrBefore(DateTime low, DateTime high) {
+    return Ranges.<DateTime>closedOpen(low,high);
+  }
+  
+  public static Range<DateTime> atBetweenOrBefore(DateTime low, Duration duration) {
+    return atBetweenOrBefore(low,low.plus(duration));
+  }
+  
+  public static Range<DateTime> atBetweenOrBefore(Duration duration, DateTime high) {
+    return atBetweenOrBefore(high.minus(duration),high);
+  }
+  
+  public static Range<DateTime> atBetweenOrBefore(Interval interval) {
+    return atBetweenOrBefore(interval.getStart(),interval.getEnd());
+  }
+  
+  public static Range<DateTime> afterNow() {
+    return after(DateTime.now());
+  }
+  
+  public static Range<DateTime> after(DateTime dateTime) {
+    return Ranges.<DateTime>greaterThan(dateTime);
+  }
+  
+  public static Range<DateTime> beforeNow() {
+    return before(DateTime.now());
+  }
+  
+  public static Range<DateTime> before(DateTime dateTime) {
+    return Ranges.<DateTime>lessThan(dateTime);
+  }
+  
+  public static Range<DateTime> between(DateTime low, DateTime high) {
+    return Ranges.<DateTime>open(low,high);
+  }
+  
+  public static Range<DateTime> between(DateTime low, Duration duration) {
+    return between(low,low.plus(duration));
+  }
+  
+  public static Range<DateTime> between(Duration duration, DateTime high) {
+    return between(high.minus(duration), high);
+  }
+  
+  public static Range<DateTime> between(Interval interval) {
+    return between(interval.getStart(),interval.getEnd());
+  }
+  
+  public static Range<DateTime> afterBetweenOrAt(DateTime low, DateTime high) {
+    return Ranges.<DateTime>openClosed(low,high);
+  }
+  
+  public static Range<DateTime> afterBetweenOrAt(DateTime low, Duration duration) {
+    return afterBetweenOrAt(low,low.plus(duration));
+  }
+  
+  public static Range<DateTime> afterBetweenOrAt(Duration duration, DateTime high) {
+    return afterBetweenOrAt(high.minus(duration), high);
+  }
+  
+  public static Range<DateTime> exactlyNow() {
+    return exactly(DateTime.now());
+  }
+  
+  public static Range<DateTime> exactly(DateTime dateTime) {
+    return Ranges.<DateTime>singleton(dateTime);
+  }
+  
+  public static Range<DateTime> exactlyBefore(DateTime date, Duration duration) {
+    return exactly(date.minus(duration));
+  }
+  
+  public static Range<DateTime> exactlyAfter(DateTime date, Duration duration) {
+    return exactly(date.plus(duration));
+  }
+  
+  public static Range<DateTime> exactlyBeforeNow(Duration duration) {
+    return exactlyBefore(DateTime.now(),duration);
+  }
+  
+  public static Range<DateTime> exactlyAfterNow(Duration duration) {
+    return exactlyAfter(DateTime.now(),duration);
+  }
+  
+  public static final boolean equivalent(DateTime d1, DateTime d2) {
+    return Equivalence.equivalent(d1, d2);
+  }
+  
+  public static final boolean equivalent(DateTime d1, Date date) {
+    return equivalent(d1, new DateTime(date));
+  }
+  
+  public static final boolean equivalent(DateTime d1, Calendar cal) {
+    return equivalent(d1, new DateTime(cal));
+  }
+  
+  public static final boolean equivalent(DateTime d1, long time) {
+    return equivalent(d1, new DateTime(time));
+  }
+  
+  public static final boolean equivalent(DateTime d1, String obj) {
+    return equivalent(d1, new DateTime(obj));
+  }
+  
+  public static final boolean equivalent(Date d1, Date date) {
+    return equivalent(new DateTime(d1), new DateTime(date));
+  }
+  
+  public static final boolean equivalent(Date d1, Calendar cal) {
+    return equivalent(new DateTime(d1), new DateTime(cal));
+  }
+  
+  public static final boolean equivalent(Date d1, long time) {
+    return equivalent(new DateTime(d1), new DateTime(time));
+  }
+  
+  public static final boolean equivalent(Date d1, String obj) {
+    return equivalent(new DateTime(d1), new DateTime(obj));
+  }
+  
+  public static final boolean equivalent(Calendar c1, Calendar c2) {
+    return equivalent(new DateTime(c1),new DateTime(c2));
+  }
+  
+  public static final boolean equivalent(Calendar c1, long time) {
+    return equivalent(new DateTime(c1), new DateTime(time));
+  }
+  
+  public static final boolean equivalent(Calendar c1, String c2) {
+    return equivalent(new DateTime(c1), new DateTime(c2));
+  }
+  
+  public static final boolean equivalent(long c1, long c2) {
+    return equivalent(new DateTime(c1), new DateTime(c2));
+  }
+  
+  public static final boolean equivalent(long c1, String c2) {
+    return equivalent(new DateTime(c1), new DateTime(c2));
+  }
+  
+  public static final boolean equivalent(String c1, String c2) {
+    return equivalent(new DateTime(c1), new DateTime(c2));
+  }
+  
+  public static Predicate<DateTime> equivalentTo(Date date) {
+    return equivalentTo(new DateTime(date));
+  }
+  
+  public static Predicate<DateTime> equivalentTo(Calendar cal) {
+    return equivalentTo(new DateTime(cal));
+  }
+  
+  public static Predicate<DateTime> equivalentTo(long time) {
+    return equivalentTo(new DateTime(time));
+  }
+  
+  public static Predicate<DateTime> equivalentTo(String dt) {
+    return equivalentTo(new DateTime(dt));
+  }
+  
+  public static Predicate<DateTime> equivalentTo(DateTime dateTime) {
+    return Equivalence.equivalentTo(dateTime);
+  }
+  
+  public static final Equivalence<DateTime> Equivalence = equivalence();
+  
+  private static Equivalence<DateTime> equivalence() {
+    return new Equivalence<DateTime>() {
+      protected boolean doEquivalent(DateTime a, DateTime b) {
+        return a.compareTo(b) == 0;
+      }
+      protected int doHash(DateTime t) {
+        return toUTC(t).hashCode();
+      }
+    };
+  }
+  
+  public static Selector<DateTime> selectorForAll() {
+    return selectorForRange(all());
+  }
+  
+  public static Selector<DateTime> selectorForAtOrAfterNow() {
+    return selectorForRange(atOrAfterNow());
+  }
+  
+  public static Selector<DateTime> selectorForAtOrAfter(DateTime dateTime) {
+    return selectorForRange(atOrAfter(dateTime));
+  }
+  
+  public static Selector<DateTime> selectorForAtOrBefore(DateTime dateTime) {
+    return selectorForRange(atOrBefore(dateTime));
+  }
+  
+  public static Selector<DateTime> selectorForAtOrBetween(DateTime low, DateTime high) {
+    return selectorForRange(atOrBetween(low,high));
+  }
+  
+  public static Selector<DateTime> selectorForAtOrBetween(DateTime low, Duration duration) {
+    return selectorForRange(atOrBetween(low,low.plus(duration)));
+  }
+  
+  public static Selector<DateTime> selectorForAtOrBetween(Duration duration, DateTime high) {
+    return selectorForRange(atOrBetween(high.minus(duration),high));
+  }
+  
+  public static Selector<DateTime> selectorForAtOrBetween(Interval interval) {
+    return selectorForRange(atOrBetween(interval.getStart(),interval.getEnd()));
+  }
+  
+  public static Selector<DateTime> selectorForAtBetweenOrBefore(DateTime low, DateTime high) {
+    return selectorForRange(atBetweenOrBefore(low,high));
+  }
+  
+  public static Selector<DateTime> selectorForAtBetweenOrBefore(DateTime low, Duration duration) {
+    return selectorForRange(atBetweenOrBefore(low,duration));
+  }
+  
+  public static Selector<DateTime> selectorForAtBetweenOrBefore(Duration duration, DateTime high) {
+    return selectorForRange(atBetweenOrBefore(duration,high));
+  }
+  
+  public static Selector<DateTime> selectorForAtBetweenOrBefore(Interval interval) {
+    return selectorForRange(atBetweenOrBefore(interval));
+  }
+  
+  public static Selector<DateTime> selectorForAfterNow() {
+    return selectorForRange(afterNow());
+  }
+  
+  public static Selector<DateTime> selectorForAfter(DateTime dateTime) {
+    return selectorForRange(after(dateTime));
+  }
+  
+  public static Selector<DateTime> selectorForBeforeNow() {
+    return selectorForRange(beforeNow());
+  }
+  
+  public static Selector<DateTime> selectorForBefore(DateTime dateTime) {
+    return selectorForRange(before(dateTime));
+  }
+  
+  public static Selector<DateTime> selectorForBetween(DateTime low, DateTime high) {
+    return selectorForRange(between(low,high));
+  }
+  
+  public static Selector<DateTime> selectorForBetween(DateTime low, Duration duration) {
+    return selectorForRange(between(low,duration));
+  }
+  
+  public static Selector<DateTime> selectorForBetween(Duration duration, DateTime high) {
+    return selectorForRange(between(duration,high));
+  }
+  
+  public static Selector<DateTime> selectorForBetween(Interval interval) {
+    return selectorForRange(between(interval));
+  }
+  
+  public static Selector<DateTime> selectorForAfterBetweenOrAt(DateTime low, DateTime high) {
+    return selectorForRange(afterBetweenOrAt(low,high));
+  }
+  
+  public static Selector<DateTime> selectorForAfterBetweenOrAt(DateTime low, Duration duration) {
+    return selectorForRange(afterBetweenOrAt(low,duration));
+  }
+  
+  public static Selector<DateTime> selectorForAfterBetweenOrAt(Duration duration, DateTime high) {
+    return selectorForRange(afterBetweenOrAt(duration,high));
+  }
+  
+  public static Selector<DateTime> selectorForExactlyNow() {
+    return selectorForRange(exactlyNow());
+  }
+  
+  public static Selector<DateTime> selectorForExactly(DateTime dateTime) {
+    return selectorForRange(exactly(dateTime));
+  }
+  
+  public static Selector<DateTime> selectorForExactlyBefore(DateTime date, Duration duration) {
+    return selectorForRange(exactlyBefore(date,duration));
+  }
+  
+  public static Selector<DateTime> selectorForExactlyAfter(DateTime date, Duration duration) {
+    return selectorForRange(exactlyAfter(date,duration));
+  }
+  
+  public static Selector<DateTime> selectorForExactlyBeforeNow(Duration duration) {
+    return selectorForRange(exactlyBeforeNow(duration));
+  }
+  
+  public static Selector<DateTime> selectorForExactlyAfterNow(Duration duration) {
+    return selectorForRange(exactlyAfterNow(duration));
+  }
+}

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

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Box.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Box.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Box.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Box.java Wed Oct 19 22:33:04 2011
@@ -17,71 +17,90 @@
  */
 package org.apache.abdera2.common.geo;
 
+import java.util.Iterator;
+
+import static com.google.common.base.Preconditions.*;
 public class Box extends Multiple {
 
     private static final String TWO_COORDINATES = "A box must have two coordinates";
     private static final long serialVersionUID = 3994252648307511152L;
 
-    public Box() {
-        super();
-    }
-
-    public Box(Multiple multiple) {
-        super(multiple);
-        if (this.coordinates.size() != 2)
-            throw new IllegalArgumentException(TWO_COORDINATES);
-    }
-
-    public Box(Point lowerCorner, Point upperCorner) {
-        super(lowerCorner, upperCorner);
-    }
-
-    public Box(Coordinate lowerCorner, Coordinate upperCorner) {
-        super(lowerCorner,upperCorner);
-    }
-
-    public Box(Coordinates coordinates) {
-        super(coordinates);
-        if (this.coordinates.size() != 2)
-            throw new IllegalArgumentException(TWO_COORDINATES);
-    }
-
-    public Box(String value) {
-        super(value);
-        if (this.coordinates.size() != 2)
-            throw new IllegalArgumentException(TWO_COORDINATES);
-    }
-
-    public Box(Multiple... multiples) {
-        super(multiples);
-        if (this.coordinates.size() != 2)
-            throw new IllegalArgumentException(TWO_COORDINATES);
-    }
-
-    public Box(Point... points) {
-        super(points);
-        if (this.coordinates.size() != 2)
-            throw new IllegalArgumentException(TWO_COORDINATES);
-    }
-
-    public Box(double... values) {
-        super(values);
-        if (this.coordinates.size() != 2)
-            throw new IllegalArgumentException(TWO_COORDINATES);
-    }
-
-    @Override
-    public void setCoordinates(Coordinates coordinates) {
-        super.setCoordinates(coordinates);
-        if (this.coordinates.size() > 2)
-            throw new IllegalArgumentException(TWO_COORDINATES);
+    public static Box at(Iterable<Coordinate> coordinates) {
+      Iterator<Coordinate> i = coordinates.iterator();
+      return make().add(i.next()).add(i.next()).get();
+    }
+    
+    public static Box at(Coordinate lowerCorner, Coordinate upperCorner) {
+      return make().add(lowerCorner).add(upperCorner).get();
+    }
+    
+    public static Box at(String lowerCorner, String upperCorner) {
+      return make().add(lowerCorner).add(upperCorner).get();
+    }
+    
+    public static Box at(IsoPosition lowerCorner, IsoPosition upperCorner) {
+      return make().add(lowerCorner).add(upperCorner).get();
+    }
+    
+    public static Box at(double lowerCornerLat, double lowerCornerLong, double upperCornerLat, double upperCornerLong) {
+      return make().add(lowerCornerLat,lowerCornerLong).add(upperCornerLat,upperCornerLong).get();
+    }
+    
+    
+    public static Builder make(Iterable<Coordinate> coordinates) {
+      Iterator<Coordinate> i = coordinates.iterator();
+      return make().add(i.next()).add(i.next());
+    }
+    
+    public static Builder make(Coordinate lowerCorner, Coordinate upperCorner) {
+      return make().add(lowerCorner).add(upperCorner);
+    }
+    
+    public static Builder make(String lowerCorner, String upperCorner) {
+      return make().add(lowerCorner).add(upperCorner);
+    }
+    
+    public static Builder make(IsoPosition lowerCorner, IsoPosition upperCorner) {
+      return make().add(lowerCorner).add(upperCorner);
+    }
+    
+    public static Builder make(double lowerCornerLat, double lowerCornerLong, double upperCornerLat, double upperCornerLong) {
+      return make().add(lowerCornerLat,lowerCornerLong).add(upperCornerLat,upperCornerLong);
+    }
+    
+    
+    public static Builder make() {
+      return new Builder();
+    }
+    
+    public static class Builder 
+      extends Multiple.Builder<Box> {
+      
+      public Builder() {
+        noDuplicates()
+        .maximumCoordinates(2);
+      }
+      
+      public Box get() {
+        return new Box(this);
+      }
+    }
+ 
+    private final transient Coordinate lower, upper;
+    
+    public Box(Builder builder) {
+      super(builder);
+      checkArgument(size() == 2, TWO_COORDINATES);
+      Iterator<Coordinate> i = iterator();
+      this.lower = i.next();
+      this.upper = i.next();
     }
 
     public Coordinate getUpperCorner() {
-        return coordinates.size() > 1 ? coordinates.get(1) : null;
+        return upper;
     }
 
     public Coordinate getLowerCorner() {
-        return coordinates.size() > 0 ? coordinates.get(0) : null;
+        return lower;
     }
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Coordinate.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Coordinate.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Coordinate.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Coordinate.java Wed Oct 19 22:33:04 2011
@@ -18,56 +18,61 @@
 package org.apache.abdera2.common.geo;
 
 import java.io.Serializable;
+import static com.google.common.base.Preconditions.*;
 
-public class Coordinate implements Serializable, Cloneable, Comparable<Coordinate> {
+public class Coordinate 
+  implements Serializable, 
+             Cloneable, 
+             Comparable<Coordinate> {
 
+    public static Coordinate at(double latitude, double longitude) {      
+      return new Coordinate(latitude,longitude);
+    }
+    
+    public static Coordinate at(String position) {
+      return new Coordinate(position);
+    }
+    
+    public static Coordinate at(IsoPosition position) {
+      return new Coordinate(position);
+    }
+  
     private static final long serialVersionUID = -916272885213668761L;
 
-    private double latitude = 0.0f;
-    private double longitude = 0.0f;
-
-    public Coordinate() {
-    }
+    private final double latitude;
+    private final double longitude;
     
     public Coordinate(IsoPosition pos) {
       this(pos.getLatitude(),pos.getLongitude());
     }
 
     public Coordinate(double latitude, double longitude) {
-        setLatitude(latitude);
-        setLongitude(longitude);
+      checkArgument(!(Double.compare(latitude, 90.0d) > 0), "Latitude > 90.0 degrees");
+      checkArgument(!(Double.compare(latitude, -90.0d) < 0), "Latitude < -90.0 degrees");
+      checkArgument(!(Double.compare(longitude, 180.0d) >= 0), "Longitude >= 180.0 degrees");
+      checkArgument(!(Double.compare(longitude, -180.0d) <= 0), "Longitude <= -180.0 degrees");
+      this.latitude = latitude;
+      this.longitude = longitude;
     }
 
     public Coordinate(String value) {
-        Coordinate c = parse(value);
-        setLatitude(c.latitude);
-        setLongitude(c.longitude);
+      Coordinate c = parse(value);
+      this.latitude = c.latitude;
+      this.longitude = c.longitude;
+      checkArgument(!(Double.compare(latitude, 90.0d) > 0), "Latitude > 90.0 degrees");
+      checkArgument(!(Double.compare(latitude, -90.0d) < 0), "Latitude < -90.0 degrees");
+      checkArgument(!(Double.compare(longitude, 180.0d) >= 0), "Longitude >= 180.0 degrees");
+      checkArgument(!(Double.compare(longitude, -180.0d) <= 0), "Longitude <= -180.0 degrees");
     }
 
     public double getLatitude() {
         return latitude;
     }
 
-    public void setLatitude(double latitude) {
-        if (Double.compare(longitude, 90.0d) > 0)
-            throw new IllegalArgumentException("Latitude > 90.0 degrees");
-        if (Double.compare(longitude, -90.0d) < 0)
-            throw new IllegalArgumentException("Latitude < 90.0 degrees");
-        this.latitude = latitude;
-    }
-
     public double getLongitude() {
         return longitude;
     }
 
-    public void setLongitude(double longitude) {
-        if (Double.compare(longitude, 180.0d) > 0)
-            throw new IllegalArgumentException("Longitude > 180.0 degrees");
-        if (Double.compare(longitude, -180.0d) < 0)
-            throw new IllegalArgumentException("Longitude < 180.0 degrees");
-        this.longitude = longitude;
-    }
-
     public String toString() {
         return Double.toString(latitude) + " " + Double.toString(longitude);
     }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/IsoPosition.java Wed Oct 19 22:33:04 2011
@@ -27,6 +27,19 @@ import java.util.regex.Pattern;
 public final class IsoPosition 
   implements Serializable {
 
+  public static IsoPosition at(Coordinate coordinate) {
+    return new IsoPosition(coordinate.getLatitude(),coordinate.getLongitude());
+  }
+  
+  public static IsoPosition at(Point point) {
+    return new IsoPosition(
+      point.getCoordinate().getLatitude(),
+      point.getCoordinate().getLongitude(),
+      point.getElevation()
+    );
+  }
+ 
+ 
   private static final long serialVersionUID = -2330958817323976941L;
   private final Double alt, d_lat, d_lon;
   

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Line.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Line.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Line.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Line.java Wed Oct 19 22:33:04 2011
@@ -18,59 +18,83 @@
 package org.apache.abdera2.common.geo;
 
 public class Line extends Multiple {
+  
+  private static final long serialVersionUID = 2852975001208906285L;
 
-    private static final long serialVersionUID = 2852975001208906285L;
-
-    public Line() {
-    }
-
-    public Line(Multiple multiple) {
-        super(multiple);
-        verify();
-    }
-
-    public Line(Point point) {
-        super(point);
-        verify();
-    }
-
-    public Line(Coordinate... coordinates) {
-        super(coordinates);
-        verify();
-    }
-
-    public Line(Coordinates coordinates) {
-        super(coordinates);
-        verify();
-    }
-
-    public Line(String value) {
-        super(value);
-        verify();
-    }
-
-    public Line(Multiple... multiples) {
-        super(multiples);
-        verify();
-    }
-
-    public Line(Point... points) {
-        super(points);
-        verify();
+  public static Line with(Iterable<Coordinate> coordinates) {
+    Builder builder = make();
+    for (Coordinate c : coordinates)
+      builder.add(c);
+    return builder.get();    
+  }
+  
+  public static Line with(Coordinate... coordinates) {
+    Builder builder = make();
+    for (Coordinate c : coordinates)
+      builder.add(c);
+    return builder.get();
+  }
+  
+  public static Line with(String... positions) {
+    Builder builder = make();
+    for (String p : positions)
+      builder.add(p);
+    return builder.get();
+  }
+  
+  public static Line with(IsoPosition... positions) {
+    Builder builder = make();
+    for (IsoPosition p : positions)
+      builder.add(p);
+    return builder.get();
+  }
+  
+  
+  public static Builder make(Iterable<Coordinate> coordinates) {
+    Builder builder = make();
+    for (Coordinate c : coordinates)
+      builder.add(c);
+    return builder;    
+  }
+  
+  public static Builder make(Coordinate... coordinates) {
+    Builder builder = make();
+    for (Coordinate c : coordinates)
+      builder.add(c);
+    return builder;
+  }
+  
+  public static Builder make(String... positions) {
+    Builder builder = make();
+    for (String p : positions)
+      builder.add(p);
+    return builder;
+  }
+  
+  public static Builder make(IsoPosition... positions) {
+    Builder builder = make();
+    for (IsoPosition p : positions)
+      builder.add(p);
+    return builder;
+  }
+  
+    public static Builder make() {
+      return new Builder();
+    }
+  
+    public static class Builder extends Multiple.Builder<Line> {
+      
+      public Builder() {
+        noDuplicates();
+      }
+      
+      public Line get() {
+        return new Line(this);
+      }
+    }
+ 
+    public Line(Builder builder) {
+      super(builder);
     }
 
-    public Line(double... values) {
-        super(values);
-        verify();
-    }
-
-    @Override
-    public void setCoordinates(Coordinates coordinates) {
-        super.setCoordinates(coordinates);
-        verify();
-    }
-
-    public void verify() {
-        super.verify179Rule();
-    }
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Multiple.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Multiple.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Multiple.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Multiple.java Wed Oct 19 22:33:04 2011
@@ -17,67 +17,81 @@
  */
 package org.apache.abdera2.common.geo;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
-
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import static com.google.common.base.Preconditions.*;
+@SuppressWarnings("unchecked")
 public abstract class Multiple extends Position implements Iterable<Coordinate> {
+  
+  public static abstract class Builder<X extends Multiple> extends Position.Builder<X> {
 
+    protected Collection<Coordinate> coordinates = 
+      new ArrayList<Coordinate>();
+    protected int maxpoints = -1;
+    
+    public <P extends Builder<X>>P noDuplicates() {
+      this.coordinates = new LinkedHashSet<Coordinate>(coordinates);
+      return (P)this;
+    }
+    
+    public <P extends Builder<X>>P maximumCoordinates(int max) {
+      checkArgument(max > -1, "Maximum must not be negative");
+      this.maxpoints = max;
+      checkState(coordinates.size() <= max, "Maximum coordinates exceeded", maxpoints);
+      return (P)this;
+    }
+    
+    public <P extends Builder<X>>P add(Coordinate coordinate) {
+      checkState(maxpoints < 0 || coordinates.size()+1 <= maxpoints, "Maximum coordinates exceeded", maxpoints);
+      this.coordinates.add(coordinate);
+      return (P)this;
+    }
+    
+    public <P extends Builder<X>>P add(double latitude, double longitude) {
+      checkState(maxpoints < 0 || coordinates.size()+1 <= maxpoints, "Maximum coordinates exceeded", maxpoints);
+      this.coordinates.add(Coordinate.at(latitude,longitude));
+      return (P)this;
+    }
+    
+    public <P extends Builder<X>>P add(String position) {
+      checkState(maxpoints < 0 || coordinates.size()+1 <= maxpoints, "Maximum coordinates exceeded", maxpoints);
+      this.coordinates.add(Coordinate.at(position));
+      return (P)this;
+    }
+    
+    public <P extends Builder<X>>P add(IsoPosition position) {
+      checkState(maxpoints < 0 || coordinates.size()+1 <= maxpoints, "Maximum coordinates [%d] exceeded", maxpoints);
+      this.coordinates.add(Coordinate.at(position));
+      return (P)this;
+    }
+    
+  }
+  
   private static final long serialVersionUID = -401256381030284678L;
-    protected Coordinates coordinates;
-
-    public Multiple() {
-    }
-
-    public Multiple(Multiple... multiples) {
-        this.coordinates = new Coordinates();
-        for (Multiple m : multiples)
-            coordinates.add(m.getCoordinates());
-    }
-
-    public Multiple(Multiple multiple) {
-        this(multiple.getCoordinates().clone());
-    }
-
-    public Multiple(Point point) {
-        this(point.getCoordinate().clone());
-    }
-
-    public Multiple(Point... points) {
-        this.coordinates = new Coordinates();
-        for (Point p : points)
-            coordinates.add(p.getCoordinate());
-    }
-
-    public Multiple(Coordinates coordinates) {
-        this.coordinates = coordinates;
-    }
+  protected final Collection<Coordinate> coordinates;
 
-    public Multiple(Coordinate... coordinates) {
-        this.coordinates = new Coordinates(coordinates);
-    }
-
-    public Multiple(String value) {
-        this.coordinates = new Coordinates(value);
-    }
-
-    public Multiple(double... values) {
-        this.coordinates = new Coordinates();
-        for (int n = 0; n < values.length; n = n + 2) {
-            Coordinate c = new Coordinate(values[n], values[n + 1]);
-            this.coordinates.add(c);
-        }
-    }
-
-    public Coordinates getCoordinates() {
-        return coordinates;
-    }
-
-    public void setCoordinates(Coordinates coordinates) {
-        this.coordinates = coordinates;
+    protected Multiple(Builder<?> builder) {
+      super(builder);
+      this.coordinates = 
+        builder.coordinates instanceof Set ?
+          ImmutableSet.<Coordinate>copyOf(builder.coordinates) :
+        ImmutableList.<Coordinate>copyOf(builder.coordinates);
     }
 
     public Iterator<Coordinate> iterator() {
         return coordinates.iterator();
     }
+    
+    public int size() {
+      return coordinates.size();
+    }
 
     @Override
     public int hashCode() {
@@ -105,22 +119,36 @@ public abstract class Multiple extends P
     }
 
     public int compareTo(Position o) {
-        if (o == null || !this.getClass().isInstance(o) || equals(o))
-            return 0;
-        return coordinates.compareTo(((Multiple)o).coordinates);
+        throw new UnsupportedOperationException();
     }
 
-    protected void verify179Rule() {
-        for (Coordinate c1 : getCoordinates()) {
-            for (Coordinate c2 : getCoordinates()) {
-                check179(c1.getLatitude(), c2.getLatitude());
-                check179(c1.getLongitude(), c2.getLongitude());
+    public static Iterable<Coordinate> parseIso(String value) {
+      List<Coordinate> list = new ArrayList<Coordinate>();
+      try {
+          String[] points = value.trim().split("\\s+");
+          for (int n = 0; n < points.length; n = n + 2) {
+              IsoPosition pos = IsoPosition.parse(points[n]);
+              list.add(new Coordinate(pos));
+          }
+          return list;
+      } catch (Throwable t) {
+          throw new RuntimeException("Error parsing coordinate pairs", t);
+      }      
+    }
+    
+    public static Iterable<Coordinate> parse(String value) {
+      List<Coordinate> list = new ArrayList<Coordinate>();
+        try {
+            String[] points = value.trim().split("\\s+");
+            for (int n = 0; n < points.length; n = n + 2) {
+                double lat = Double.parseDouble(points[n]);
+                double lon = Double.parseDouble(points[n + 1]);
+                Coordinate c = new Coordinate(lat, lon);
+                list.add(c);
             }
+            return list;
+        } catch (Throwable t) {
+            throw new RuntimeException("Error parsing coordinate pairs", t);
         }
     }
-
-    private void check179(double d1, double d2) {
-        if (Math.abs(Math.max(d1, d2)) - Math.abs(Math.min(d1, d2)) > 179)
-            throw new RuntimeException("Values are greater than 179 degrees");
-    }
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Point.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Point.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Point.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Point.java Wed Oct 19 22:33:04 2011
@@ -19,52 +19,92 @@ package org.apache.abdera2.common.geo;
 
 public class Point extends Position {
 
-    private static final long serialVersionUID = 7540202474168797239L;
-
-    private Coordinate coordinate;
-
-    public Point() {}
-
-    public Point(Point point) {
-        this.coordinate = point.getCoordinate().clone();
+    public static Point at(Coordinate coordinate) {
+      return make().at(coordinate).get();
     }
-
-    public Point(Coordinate coordinate) {
-        this.coordinate = coordinate;
+    
+    public static Point at(IsoPosition position) {
+      return make().at(position).get();
     }
-
-    public Point(double latitude, double longitude) {
-        this.coordinate = new Coordinate(latitude, longitude);
+    
+    public static Point at(String position) {
+      return make().at(position).get();
     }
-
-    public Point(String value) {
-        this.coordinate = new Coordinate(value);
+    
+    public static Point at(double latitude, double longitude) {
+      return make().at(latitude,longitude).get();
     }
-
-    public Point(IsoPosition pos) {
-        this.coordinate = new Coordinate(pos);
+    
+    public static Builder make(Coordinate coordinate) {
+      return make().at(coordinate);
     }
     
-    public Coordinate getCoordinate() {
-        return coordinate;
+    public static Builder make(IsoPosition position) {
+      return make().at(position);
     }
-
-    public void setCoordinate(IsoPosition pos) {
-      this.coordinate = new Coordinate(pos);
+    
+    public static Builder make(String position) {
+      return make().at(position);
     }
     
-    public void setCoordinate(Coordinate coordinate) {
+    public static Builder make(double latitude, double longitude) {
+      return make().at(latitude,longitude);
+    }
+  
+    public static Builder make() {
+      return new Builder();
+    }
+  
+    public static class Builder extends Position.Builder<Point> {
+
+      private Coordinate coordinate;
+      
+      public Builder at(Coordinate coordinate) {
         this.coordinate = coordinate;
+        return this;
+      }
+      
+      public Builder at(double latitude, double longitude) {
+        this.coordinate = Coordinate.at(latitude, longitude);
+        return this;
+      }
+      
+      public Builder at(String position) {
+        this.coordinate = Coordinate.at(position);
+        return this;
+      }
+      
+      public Builder at(IsoPosition position) {
+        this.coordinate = Coordinate.at(position);
+        return this;
+      }
+      
+      public Point get() {
+        return new Point(this);
+      }
+      
     }
+  
+    private static final long serialVersionUID = 7540202474168797239L;
 
-    public void setCoordinate(double latitude, double longitude) {
-        this.coordinate = new Coordinate(latitude, longitude);
-    }
+    private final Coordinate coordinate;
 
-    public void setCoordinate(String value) {
-        this.coordinate = new Coordinate(value);
+    private Point(Builder builder) {
+      super(builder);
+      this.coordinate = builder.coordinate;
     }
 
+    public Coordinate getCoordinate() {
+        return coordinate;
+    }
+    
+    public IsoPosition asIsoPosition() {
+      return new IsoPosition(
+        coordinate.getLatitude(),
+        coordinate.getLongitude(),
+        elevation);
+    }
+    
     @Override
     public int hashCode() {
         final int PRIME = 31;

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Polygon.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Polygon.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Polygon.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Polygon.java Wed Oct 19 22:33:04 2011
@@ -21,57 +21,74 @@ public class Polygon extends Multiple {
 
     private static final long serialVersionUID = 5387230171535985909L;
 
-    public Polygon() {
-        super();
-    }
-
-    public Polygon(Multiple multiple) {
-        super(multiple);
-        verify();
-    }
-
-    public Polygon(Point point) {
-        super(point);
-        verify();
-    }
-
-    public Polygon(Coordinate... coordinates) {
-        super(coordinates);
-        verify();
-    }
-
-    public Polygon(Coordinates coordinates) {
-        super(coordinates);
-        verify();
-    }
-
-    public Polygon(String value) {
-        super(value);
-        verify();
-    }
-
-    public Polygon(Multiple... multiples) {
-        super(multiples);
-        verify();
-    }
-
-    public Polygon(Point... points) {
-        super(points);
-        verify();
-    }
-
-    public Polygon(double... values) {
-        super(values);
-        verify();
-    }
-
-    @Override
-    public void setCoordinates(Coordinates coordinates) {
-        super.setCoordinates(coordinates);
-        verify();
-    }
-
-    public void verify() {
-        super.verify179Rule();
+    public static Polygon with(Iterable<Coordinate> coordinates) {
+      Builder builder = make();
+      for (Coordinate c : coordinates)
+        builder.add(c);
+      return builder.get();    
+    }
+    
+    public static Polygon with(Coordinate... coordinates) {
+      Builder builder = make();
+      for (Coordinate c : coordinates)
+        builder.add(c);
+      return builder.get();
+    }
+    
+    public static Polygon with(String... positions) {
+      Builder builder = make();
+      for (String p : positions)
+        builder.add(p);
+      return builder.get();
+    }
+    
+    public static Polygon with(IsoPosition... positions) {
+      Builder builder = make();
+      for (IsoPosition p : positions)
+        builder.add(p);
+      return builder.get();
+    }
+    
+    
+    public static Builder make(Iterable<Coordinate> coordinates) {
+      Builder builder = make();
+      for (Coordinate c : coordinates)
+        builder.add(c);
+      return builder;    
+    }
+    
+    public static Builder make(Coordinate... coordinates) {
+      Builder builder = make();
+      for (Coordinate c : coordinates)
+        builder.add(c);
+      return builder;
+    }
+    
+    public static Builder make(String... positions) {
+      Builder builder = make();
+      for (String p : positions)
+        builder.add(p);
+      return builder;
+    }
+    
+    public static Builder make(IsoPosition... positions) {
+      Builder builder = make();
+      for (IsoPosition p : positions)
+        builder.add(p);
+      return builder;
+    }
+    
+    public static Builder make() {
+      return new Builder();
+    }
+    
+    public static class Builder extends Multiple.Builder<Polygon> {
+      public Polygon get() {
+        return new Polygon(this);
+      }
+    }
+ 
+    public Polygon(Builder builder) {
+      super(builder);
     }
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Position.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Position.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Position.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Position.java Wed Oct 19 22:33:04 2011
@@ -19,58 +19,87 @@ package org.apache.abdera2.common.geo;
 
 import java.io.Serializable;
 
-public abstract class Position implements Serializable, Cloneable, Comparable<Position> {
+import com.google.common.base.Supplier;
 
-  private static final long serialVersionUID = 2024463162259330581L;
+public abstract class Position 
+  implements Serializable, 
+             Cloneable, 
+             Comparable<Position> {
+  
+    @SuppressWarnings("unchecked")
+    public static abstract class Builder<P extends Position> implements Supplier<P> {
+
+      protected String featureTypeTag;
+      protected String relationshipTag;
+      protected Double elevation;
+      protected Double floor;
+      protected Double radius;
+      
+      public <X extends Builder<P>>X featureType(String tag) {
+        this.featureTypeTag = tag;
+        return (X)this;
+      }
+      
+      public <X extends Builder<P>>X relationship(String tag) {
+        this.relationshipTag = tag;
+        return (X)this;
+      }
+      
+      public <X extends Builder<P>>X elevation(double elevation) {
+        this.elevation = elevation;
+        return (X)this;
+      }
+      
+      public <X extends Builder<P>>X floor(double floor) {
+        this.floor = floor;
+        return (X)this;
+      }
+      
+      public <X extends Builder<P>>X radius(double radius) {
+        this.radius = radius;
+        return (X)this;
+      }
+      
+    }
+  
+    private static final long serialVersionUID = 2024463162259330581L;
     public static final String DEFAULT_FEATURE_TYPE_TAG = "location";
     public static final String DEFAULT_RELATIONSHIP_TAG = "is-located-at";
 
-    protected String featureTypeTag;
-    protected String relationshipTag;
-    protected Double elevation;
-    protected Double floor;
-    protected Double radius;
-
+    protected final String featureTypeTag;
+    protected final String relationshipTag;
+    protected final Double elevation;
+    protected final Double floor;
+    protected final Double radius;
+
+    protected Position(Builder<?> builder) {
+      this.featureTypeTag = builder.featureTypeTag;
+      this.relationshipTag = builder.relationshipTag;
+      this.elevation = builder.elevation;
+      this.floor = builder.floor;
+      this.radius = builder.radius;
+    }
+    
     public Double getElevation() {
         return elevation;
     }
 
-    public void setElevation(Double elevation) {
-        this.elevation = elevation;
-    }
-
     public String getFeatureTypeTag() {
         return featureTypeTag;
     }
 
-    public void setFeatureTypeTag(String featureTypeTag) {
-        this.featureTypeTag = featureTypeTag;
-    }
-
     public Double getFloor() {
         return floor;
     }
 
-    public void setFloor(Double floor) {
-        this.floor = floor;
-    }
-
     public Double getRadius() {
         return radius;
     }
 
-    public void setRadius(Double radius) {
-        this.radius = radius;
-    }
-
     public String getRelationshipTag() {
         return relationshipTag;
     }
 
-    public void setRelationshipTag(String relationshipTag) {
-        this.relationshipTag = relationshipTag;
-    }
-
     @Override
     public int hashCode() {
         final int PRIME = 31;

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Authentication.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Authentication.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Authentication.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Authentication.java Wed Oct 19 22:33:04 2011
@@ -16,7 +16,7 @@
  * directory of this distribution.
  */
 package org.apache.abdera2.common.http;
-
+import static com.google.common.base.Preconditions.*;
 import java.io.ByteArrayOutputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -30,14 +30,16 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.abdera2.common.text.CharUtils.Profile;
 import org.apache.abdera2.common.text.Codec;
 import static org.apache.abdera2.common.text.CharUtils.unquote;
 import static org.apache.abdera2.common.text.CharUtils.quotedIfNotToken;
-import static org.apache.abdera2.common.text.CharUtils.isToken;
 import static org.apache.abdera2.common.text.CharUtils.quoted;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.codec.binary.StringUtils;
 
+import com.google.common.base.Supplier;
+
 /**
  * Implementation of the HTTP Challenge/Credentials Construct. This is helpful when 
  * using custom authentication mechanisms with an HTTP Request. It provides
@@ -64,28 +66,33 @@ public class Authentication implements I
   private final static Set<String> ALWAYS = 
     new HashSet<String>();
   static {
-      ALWAYS.add("domain");
-      ALWAYS.add("nonce");
-      ALWAYS.add("opaque");
-      ALWAYS.add("qop");
-      ALWAYS.add("realm");
+      alwaysQuote(
+        "domain",
+        "nonce",
+        "opaque",
+        "qop",
+        "realm");
   }
   
-  public static void alwaysQuote(String name) {
-    if (name == null)
-      throw new IllegalArgumentException();
-    ALWAYS.add(name);
+  public static synchronized void alwaysQuote(String... names) {
+    checkNotNull(names);
+    checkArgument(names.length > 0);
+    for (String name : names)
+      ALWAYS.add(name);
   }
   
   public static Iterable<Authentication> parse(String challenge) {
+    checkNotNull(challenge);
     List<Authentication> challenges = new ArrayList<Authentication>();
     Matcher matcher = pattern.matcher(challenge);
     while (matcher.find()) {
       String scheme = matcher.group(1);
       String params = matcher.group(2);
       String b64token = matcher.group(3); 
-      Authentication chal = 
-        new Authentication(scheme,b64token);
+      Authentication.Builder auth = 
+        make()
+          .scheme(scheme)
+          .b64token(b64token);
       if (params != null) {
         Matcher mparams = param.matcher(params);
         while(mparams.find()) {
@@ -94,13 +101,60 @@ public class Authentication implements I
           String name = ps[0];
           if (name.charAt(name.length()-1)=='*')
             name = name.substring(0,name.length()-1);
-          chal.add(name, Codec.decode(unquote(ps[1])));
+          auth.param(name, Codec.decode(unquote(ps[1])));
         }
       }
-      challenges.add(chal);
+      challenges.add(auth.get());
     }
     return challenges;
   }
+
+  public static class Builder 
+    implements Supplier<Authentication> {
+    private String scheme;
+    private String b64token;
+    private Map<String,String> params = 
+      new HashMap<String,String>();
+    private Set<String> quoted = 
+      new HashSet<String>();
+    
+    public Authentication get() {
+      checkNotNull(scheme);
+      return new Authentication(this);
+    }
+   
+    public Builder param(String name, String val) {
+      params.put(name, val);
+      return this;
+    }
+    
+    public Builder quotedParam(String name, String val) {
+      param(name,val);
+      quoted.add(name);
+      return this;
+    }
+    
+    public Builder isQuoted(String name) {
+      quoted.add(name);
+      return this;
+    }
+    
+    public Builder scheme(String scheme) {
+      checkNotNull(scheme);
+      this.scheme = scheme.toLowerCase();
+      return this;
+    }
+    
+    public Builder b64token(String token) {
+      this.b64token = token;
+      return this;
+    }
+   
+  }
+  
+  public static Builder make() {
+    return new Builder();
+  }
   
   private final String scheme;
   private final String b64token;
@@ -114,14 +168,16 @@ public class Authentication implements I
   }
   
   public Authentication(String scheme, String b64token) {
-    if (scheme == null)
-      throw new IllegalArgumentException();
+    checkNotNull(scheme);
     this.scheme = scheme.toLowerCase(Locale.US);
     this.b64token = b64token;
   }
   
-  private void add(String name, String value) {
-    params.put(name,value);
+  private Authentication(Builder builder) {
+    this.scheme = builder.scheme;
+    this.b64token = builder.b64token;
+    this.params.putAll(builder.params);
+    this.quoted.addAll(builder.quoted);
   }
   
   public String getScheme() {
@@ -140,22 +196,6 @@ public class Authentication implements I
     return name != null ? ALWAYS.contains(name) : false;
   }
   
-  public void setParam(String name, String val) {
-    if (val == null)
-      params.remove(name);
-    else
-      params.put(name, val);
-  }
-  
-  public void setQuotedParam(String name, String val) {
-    setParam(name,val);
-    quoted.add(name);
-  }
-  
-  public void setQuotedParam(String name) {
-    quoted.add(name);
-  }
-  
   public boolean hasParam(String name) {
     return params.containsKey(name);
   }
@@ -183,7 +223,7 @@ public class Authentication implements I
         String val = getParam(param);
         buf.append(param);
         boolean always = is_always_quoted(param) || isquoted(param);
-        if (!isToken(val) && !always) {
+        if (Profile.TOKEN.check(val) && !always) {
           buf.append('*')
              .append('=')
              .append(Codec.encode(val,Codec.STAR));

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControl.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControl.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControl.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControl.java Wed Oct 19 22:33:04 2011
@@ -19,11 +19,178 @@ package org.apache.abdera2.common.http;
 
 import java.io.Serializable;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.base.Supplier;
+import com.google.common.collect.Iterables;
+
 public final class CacheControl implements Serializable {
 
+  public static Builder make() {
+    return new Builder();
+  }
+  
+  public static Builder make(CacheControl template) {
+    return new Builder(template);
+  }
+  
+  public static class Builder implements Supplier<CacheControl> {
+
+    protected int flags = 0;
+    protected String[] nocache_headers = {},
+                       private_headers = {};
+    protected long max_age = -1,
+                   max_stale = -1,
+                   min_fresh = -1,
+                   smax_age = -1,
+                   staleiferror = -1,
+                   stalewhilerevalidate = -1;
+    protected final HashMap<String,Object> exts =
+      new HashMap<String,Object>();
+    
+    public Builder() {
+      defaults();
+    }
+    
+    public Builder(CacheControl cc) {
+      from(cc);
+    }
+    
+    public Builder from(CacheControl cc) {
+      this.flags = cc.flags;
+      this.nocache_headers = cc.nocache_headers;
+      this.private_headers = cc.private_headers;
+      this.max_age = cc.max_age;
+      this.max_stale = cc.max_stale;
+      this.min_fresh = cc.min_fresh;
+      this.smax_age = cc.smax_age;
+      this.staleiferror = cc.staleiferror;
+      this.stalewhilerevalidate = cc.stalewhilerevalidate;
+      this.exts.putAll(cc.exts);
+      return this;
+    }
+    
+    public Builder defaults() {
+      return 
+         noCache(false)
+        .noStore(false)
+        .noTransform(false)
+        .onlyIfCached(false)
+        .maxAge(-1)
+        .maxStale(-1)
+        .minFresh(-1)
+        .staleIfError(-1)
+        .staleWhileRevalidate(-1)
+        .mustRevalidate(false)
+        .isPrivate(false)
+        .isPublic(false)
+        .maxAge(-1);
+    }
+    
+    public CacheControl get() {
+      return new CacheControl(this);
+    }
+    
+    public Builder extensions(Map<String,Object> exts) {
+      this.exts.putAll(exts);
+      return this;
+    }
+    
+    public Builder extension(String name, Object value) {
+      exts.put(name,value);
+      return this;
+    }
+    
+    public Builder staleIfError(long delta) {
+      this.staleiferror = Math.max(-1,delta);
+      return this;
+    }
+    
+    public Builder staleWhileRevalidate(long delta) {
+      this.stalewhilerevalidate = Math.max(-1,delta);
+      return this;
+    }
+    
+    public Builder maxAge(long max_age) {
+      this.max_age = Math.max(-1,max_age);
+      return this;
+    }
+
+    public Builder mustRevalidate(boolean val) {
+      toggle(val,REVALIDATE);
+      return this;
+    }
+
+    public Builder proxyRevalidate(boolean val) {
+      toggle(val,PROXYREVALIDATE);
+      return this;
+    }
+
+    public Builder noCache(boolean val) {
+      toggle(val,NOCACHE);
+      return this;
+    }
+
+    public Builder noStore(boolean val) {
+      toggle(val,NOSTORE);
+      return this;
+    }
+
+    public Builder noTransform(boolean val) {
+      toggle(val,NOTRANSFORM);
+      return this;
+    }
+    
+    public Builder isPublic(boolean val) {
+      toggle(val,PUBLIC);
+      return this;
+    }
+
+    public Builder isPrivate(boolean val) {
+      toggle(val,PRIVATE);
+      return this;
+    }
+
+    public Builder privateHeaders(String... headers) {
+      this.private_headers = headers;
+      return this;
+    }
+
+    public Builder noCacheHeaders(String... headers) {
+      this.nocache_headers = headers;
+      return this;
+    }
+
+    public Builder maxStale(long max_stale) {
+      this.max_stale = max_stale;
+      return this;
+    }
+
+    public Builder minFresh(long min_fresh) {
+      this.min_fresh = min_fresh;
+      return this;
+    }
+    
+    public Builder onlyIfCached(boolean val) {
+      toggle(val,ONLYIFCACHED);
+      return this;
+    }
+    
+    private void toggle(boolean val, int flag) {
+      if (val)
+          flags |= flag;
+      else
+          flags &= ~flag;
+    }
+  
+  }
+  
+  public static CacheControl parse(String cc) {
+    return CacheControlUtil.parseCacheControl(cc, make()).get();
+  }
+  
   private static final long serialVersionUID = 3554586802963893228L;
   public final static int NOCACHE = 1,
                           NOSTORE = 2,
@@ -33,68 +200,42 @@ public final class CacheControl implemen
                           REVALIDATE = 32,
                           PROXYREVALIDATE = 64,
                           ONLYIFCACHED = 128;
-  protected int flags = 0;
-  protected String[] nocache_headers = null,
-                     private_headers = null;
-  protected long max_age = -1,
-                 max_stale = -1,
-                 min_fresh = -1,
-                 smax_age = -1,
-                 staleiferror = -1,
-                 stalewhilerevalidate = -1;
+  protected final int flags;
+  protected final String[] nocache_headers,
+                     private_headers;
+  protected final long max_age,
+                 max_stale,
+                 min_fresh,
+                 smax_age,
+                 staleiferror,
+                 stalewhilerevalidate;
   protected HashMap<String,Object> exts =
     new HashMap<String,Object>();
   
-  public CacheControl() {}
-  
-  public CacheControl(String cc) {
-    CacheControlUtil.parseCacheControl(cc, this);
-  }
-  
-  public CacheControl setExtensions(Map<String,Object> exts) {
-    this.exts.putAll(exts);
-    return this;
-  }
-  
-  public CacheControl setExtension(String name, Object value) {
-    exts.put(name,value);
-    return this;
+  private CacheControl(Builder builder) {
+    this.flags = builder.flags;
+    this.nocache_headers = builder.nocache_headers;
+    this.private_headers = builder.private_headers;
+    this.max_age = builder.max_age;
+    this.max_stale = builder.max_stale;
+    this.min_fresh = builder.min_fresh;
+    this.smax_age = builder.smax_age;
+    this.staleiferror = builder.staleiferror;
+    this.stalewhilerevalidate = builder.stalewhilerevalidate;
+    this.exts.putAll(builder.exts);
   }
   
   public Object getExtension(String name) {
     return exts.get(name);
   }
   
-  public String[] listExtensions() {
-    return exts.keySet().toArray(new String[exts.size()]);
+  public Iterable<String> listExtensions() {
+    return Iterables.unmodifiableIterable(exts.keySet());
   }
   
   protected boolean check(int flag) {
     return (flags & flag) == flag;
   }
-
-  protected void toggle(boolean val, int flag) {
-      if (val)
-          flags |= flag;
-      else
-          flags &= ~flag;
-  }
-  
-  public void setDefaults() {
-    setNoCache(false);
-    setNoStore(false);
-    setNoTransform(false);
-    setOnlyIfCached(false);
-    setMaxAge(-1);
-    setMaxStale(-1);
-    setMinFresh(-1);
-    setStaleIfError(-1);
-    setStaleWhileRevalidate(-1);
-    setMustRevalidate(false);
-    setPrivate(false);
-    setPublic(false);
-    setMaxAge(-1);
-  }
   
   public boolean isNoCache() {
     return check(NOCACHE);
@@ -112,12 +253,12 @@ public final class CacheControl implemen
       return max_age;
   }
   
-  public String[] getNoCacheHeaders() {
-    return isNoCache() ? nocache_headers : null;
+  public Iterable<String> getNoCacheHeaders() {
+    return isNoCache() ? Arrays.asList(nocache_headers) : Collections.<String>emptySet();
   }
 
-  public String[] getPrivateHeaders() {
-    return isPrivate() ? private_headers : null;
+  public Iterable<String> getPrivateHeaders() {
+    return isPrivate() ? Arrays.asList(private_headers) : Collections.<String>emptySet();
   }
 
   public long getSMaxAge() {
@@ -147,67 +288,7 @@ public final class CacheControl implemen
   public long getStaleWhileRevalidate() {
     return stalewhilerevalidate;
   }
-  
-  public CacheControl setStaleIfError(long delta) {
-    this.staleiferror = Math.max(-1,delta);
-    return this;
-  }
-  
-  public CacheControl setStaleWhileRevalidate(long delta) {
-    this.stalewhilerevalidate = Math.max(-1,delta);
-    return this;
-  }
-  
-  public CacheControl setMaxAge(long max_age) {
-    this.max_age = Math.max(-1,max_age);
-    return this;
-  }
-
-  public CacheControl setMustRevalidate(boolean val) {
-    toggle(val,REVALIDATE);
-    return this;
-  }
-
-  public CacheControl setProxyRevalidate(boolean val) {
-    toggle(val,PROXYREVALIDATE);
-    return this;
-  }
-
-  public CacheControl setNoCache(boolean val) {
-    toggle(val,NOCACHE);
-    return this;
-  }
-
-  public CacheControl setNoStore(boolean val) {
-    toggle(val,NOSTORE);
-    return this;
-  }
-
-  public CacheControl setNoTransform(boolean val) {
-    toggle(val,NOTRANSFORM);
-    return this;
-  }
-  
-  public CacheControl setPublic(boolean val) {
-    toggle(val,PUBLIC);
-    return this;
-  }
-
-  public CacheControl setPrivate(boolean val) {
-    toggle(val,PRIVATE);
-    return this;
-  }
-
-  public CacheControl setPrivateHeaders(String... headers) {
-    this.private_headers = headers;
-    return this;
-  }
-
-  public CacheControl setNoCacheHeaders(String... headers) {
-    this.nocache_headers = headers;
-    return this;
-  }
-  
+    
   public boolean isOnlyIfCached() {
     return check(ONLYIFCACHED);
   }
@@ -220,21 +301,6 @@ public final class CacheControl implemen
     return min_fresh;
   }
   
-  public CacheControl setMaxStale(long max_stale) {
-    this.max_stale = max_stale;
-    return this;
-  }
-
-  public CacheControl setMinFresh(long min_fresh) {
-    this.min_fresh = min_fresh;
-    return this;
-  }
-  
-  public CacheControl setOnlyIfCached(boolean val) {
-    toggle(val,ONLYIFCACHED);
-    return this;
-  }
-  
   public String toString() {
     return CacheControlUtil.buildCacheControl(this);
   }
@@ -287,33 +353,31 @@ public final class CacheControl implemen
   }
   
   public static CacheControl NOCACHE() {
-    CacheControl cc = new CacheControl();
-    cc.setNoCache(true);
-    return cc;
+    return make().noCache(true).get();
+  }
+  
+  public static CacheControl NONNOCACHE() {
+    return make().noCache(false).get();
   }
   
   public static CacheControl NOSTORE() {
-    CacheControl cc = new CacheControl();
-    cc.setNoStore(true);
-    return cc;
+    return make().noStore(true).get();
+  }
+  
+  public static CacheControl NONNOSTORE() {
+    return make().noStore(false).get();
   }
   
   public static CacheControl MAXAGE(long age) {
-    CacheControl cc = new CacheControl();
-    cc.setMaxAge(age);
-    return cc;
+    return make().maxAge(age).get();
   }
   
   public static CacheControl PUBLIC() {
-    CacheControl cc = new CacheControl();
-    cc.setPublic(true);
-    return cc;
+    return make().isPublic(true).get();
   }
   
   public static CacheControl PRIVATE() {
-    CacheControl cc = new CacheControl();
-    cc.setPrivate(true);
-    return cc;
+    return make().isPrivate(true).get();
   }
   
 }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControlUtil.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControlUtil.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControlUtil.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControlUtil.java Wed Oct 19 22:33:04 2011
@@ -25,11 +25,16 @@ import java.util.regex.Pattern;
 
 import org.apache.abdera2.common.text.CharUtils;
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.Iterables;
+
 /**
  * Provides parsing and properly handling of the HTTP Cache-Control header.
  */
-public class CacheControlUtil {
+public final class CacheControlUtil {
 
+    private CacheControlUtil() {}
+  
     private static long value(String val) {
         return (val != null) ? Long.parseLong(val) : -1;
     }
@@ -40,6 +45,8 @@ public class CacheControlUtil {
         buf.append(value);
     }
 
+    private static final Joiner joiner = Joiner.on(',').skipNulls();
+    
     /**
      * Construct the Cache-Control header from info in the request object
      */
@@ -47,13 +54,10 @@ public class CacheControlUtil {
         StringBuilder buf = new StringBuilder();
         if (cacheControl.isPrivate()) {
             append(buf, "private");
-            String[] headers = cacheControl.getPrivateHeaders();
-            if (headers != null && headers.length > 0) {
+            Iterable<String> headers = cacheControl.getPrivateHeaders();
+            if (!Iterables.isEmpty(headers)) {
               buf.append("=\"");
-              for (int n = 0; n < headers.length; n++) {
-                if (n > 0) buf.append(",");
-                buf.append(headers[n]);
-              }
+              joiner.appendTo(buf, headers);
               buf.append("\"");
             }
         }
@@ -61,13 +65,10 @@ public class CacheControlUtil {
             append(buf, "public");
         if (cacheControl.isNoCache()) {
             append(buf, "no-cache");
-            String[] headers = cacheControl.getNoCacheHeaders();
-            if (headers != null && headers.length > 0) {
+            Iterable<String> headers = cacheControl.getNoCacheHeaders();
+            if (!Iterables.isEmpty(headers)) {
               buf.append("=\"");
-              for (int n = 0; n < headers.length; n++) {
-                if (n > 0) buf.append(",");
-                buf.append(headers[n]);
-              }
+              joiner.appendTo(buf,headers);
               buf.append("\"");
             }   
         }
@@ -112,13 +113,14 @@ public class CacheControlUtil {
     /**
      * Parse the Cache-Control header
      */
-    public static void parseCacheControl(String cc, CacheControl cacheControl) {
-        if (cc == null) return;
-        cacheControl.setDefaults();
+    public static CacheControl.Builder parseCacheControl(String cc, CacheControl.Builder builder) {
+        if (cc == null) return builder;
+        builder.defaults();
         CacheControlParser parser = new CacheControlParser(cc);
         for (Directive directive : parser)
-          directive.set(cacheControl, parser);
-        cacheControl.setExtensions(parser.getExtensions());
+          directive.set(builder, parser);
+        builder.extensions(parser.getExtensions());
+        return builder;
     }
 
     /**
@@ -149,48 +151,48 @@ public class CacheControlUtil {
             return UNKNOWN;
         }
         
-        public void set(CacheControl cacheControl, CacheControlParser parser) {
+        public void set(CacheControl.Builder builder, CacheControlParser parser) {
           switch (this) {
           case NOCACHE:
-              cacheControl.setNoCache(true);
-              cacheControl.setNoCacheHeaders(parser.getValues(this));
+              builder.noCache(true);
+              builder.noCacheHeaders(parser.getValues(this));
               break;
           case NOSTORE:
-              cacheControl.setNoStore(true);
+              builder.noStore(true);
               break;
           case NOTRANSFORM:
-              cacheControl.setNoTransform(true);
+              builder.noTransform(true);
               break;
           case ONLYIFCACHED:
-              cacheControl.setOnlyIfCached(true);
+              builder.onlyIfCached(true);
               break;
           case MAXAGE:
-              cacheControl.setMaxAge(value(parser.getValue(this)));
+              builder.maxAge(value(parser.getValue(this)));
               break;
           case MAXSTALE:
-              cacheControl.setMaxStale(value(parser.getValue(this)));
+              builder.maxStale(value(parser.getValue(this)));
               break;
           case MINFRESH:
-              cacheControl.setMinFresh(value(parser.getValue(this)));
+              builder.minFresh(value(parser.getValue(this)));
               break;
           case STALEIFERROR:
-              cacheControl.setStaleIfError(value(parser.getValue(this)));
+              builder.staleIfError(value(parser.getValue(this)));
               break;
           case MUSTREVALIDATE:
-              cacheControl.setMustRevalidate(true);
+              builder.mustRevalidate(true);
               break;
           case PROXYREVALIDATE:
-              cacheControl.setProxyRevalidate(true);
+              builder.proxyRevalidate(true);
               break;
           case PUBLIC:
-              cacheControl.setPublic(true);
+              builder.isPublic(true);
               break;
           case PRIVATE:
-              cacheControl.setPrivate(true);
-              cacheControl.setPrivateHeaders(parser.getValues(this));
+              builder.isPrivate(true);
+              builder.privateHeaders(parser.getValues(this));
             break;
           case STALEWHILEREVALIDATE:
-            cacheControl.setStaleWhileRevalidate(value(parser.getValue(this)));
+            builder.staleWhileRevalidate(value(parser.getValue(this)));
             break;
           }
         }

Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Preference.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Preference.java?rev=1186541&r1=1186540&r2=1186541&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Preference.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Preference.java Wed Oct 19 22:33:04 2011
@@ -17,6 +17,8 @@ import static org.apache.abdera2.common.
 import org.apache.abdera2.common.text.Codec;
 import org.apache.abdera2.common.text.CharUtils.Profile;
 
+import com.google.common.base.Supplier;
+
 /**
  * Implementation of the Prefer HTTP Header, e.g.
  * 
@@ -55,6 +57,45 @@ public class Preference implements Seria
   public static final Preference PREF_RETURN_CONTENT =
     new Preference(RETURN_CONTENT);
   
+  public static Builder make() {
+    return new Builder();
+  }
+  
+  public static class Builder implements Supplier<Preference> {
+
+    private String token;
+    private String value;
+    private final Map<String,String> params = 
+      new HashMap<String,String>();
+    
+    public Preference get() {
+      return new Preference(this);
+    }
+    
+    public Builder token(String token) {
+      this.token = token;
+      return this;
+    }
+    
+    public Builder value(String value) {
+      this.value = value;
+      return this;
+    }
+    
+    public Builder param(String key, String val) {
+      if (key == null || reserved(key)) 
+        throw new IllegalArgumentException();
+      this.params.put(key,val);
+      return this;
+    }
+    
+    public Builder params(Map<String,String> params) {
+      this.params.putAll(params);
+      return this;
+    }
+    
+  }
+  
   /**
    * The "return-status" token indicates that the client prefers that the
    * server include an entity describing the status of the request in the
@@ -69,12 +110,18 @@ public class Preference implements Seria
   private final Map<String,String> params = 
     new HashMap<String,String>();
   
+  private Preference(Builder builder) {
+    this.token = builder.token;
+    this.value = builder.value;
+    this.params.putAll(builder.params);
+  }
+  
   public Preference(String token) {
     this(token,null);
   }
   
   public Preference(String token, String value) {
-    CharUtils.verify(token, Profile.TOKEN);
+    Profile.TOKEN.verify(token);
     this.token = token.toLowerCase();
     this.value = value;
   }
@@ -96,16 +143,6 @@ public class Preference implements Seria
     return reserved.contains(name);
   }
   
-  public void addParam(String name, String value) {
-    if (name == null || reserved(name)) 
-      throw new IllegalArgumentException();
-    if (value == null && params.containsKey(name))
-      params.remove(name);
-    else {
-      params.put(name, value);
-    }
-  }
-  
   public boolean matches(String token) {
     if (token == null) return false;
     return this.token.equalsIgnoreCase(token.toLowerCase());
@@ -214,17 +251,17 @@ public class Preference implements Seria
           tokenval = Codec.decode(CharUtils.unquote(ps[1]));
       }
       
-      Preference preference = new Preference(token,tokenval);
-      prefs.add(preference);
-      
+      Preference.Builder maker = 
+        Preference.make().token(token).value(tokenval);   
       if (params != null) {
         Matcher mparams = param.matcher(params);
         while(mparams.find()) {
           String p = mparams.group(1);
           String[] ps = p.split("\\s*=\\s*", 2);
-          preference.addParam(ps[0], Codec.decode(CharUtils.unquote(ps[1])));
+          maker.param(ps[0], Codec.decode(CharUtils.unquote(ps[1])));
         }
       }
+      prefs.add(maker.get());
     }
     return prefs;
   }