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 [1/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...
Author: jmsnell
Date: Mon Nov 7 21:31:52 2011
New Revision: 1198949
URL: http://svn.apache.org/viewvc?rev=1198949&view=rev
Log:
General code design improvements, bug fixes, immutability of objects for thread-safety
Added:
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Pair.java (with props)
Modified:
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/AdaptedType.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/GsonIO.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/MimeTypeAdapter.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/Verb.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/AnnoUtil.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Context.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/DefaultImplementation.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Name.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Namespace.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Param.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/QName.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URIRoute.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URITemplate.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Version.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Coordinate.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Multiple.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Point.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/geo/Position.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Authentication.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControl.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/CacheControlUtil.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/EntityTag.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Method.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Preference.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/QualityHelper.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/WebLink.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/CharsetSniffingInputStream.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/Compression.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/FilteredCharReader.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/io/PeekAheadInputStream.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/AbstractScheme.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/iri/IRI.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Lang.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Range.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/Subtag.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/lang/SubtagSet.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/mediatype/MimeTypeHelper.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Chain.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/Comparisons.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MapRed.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/misc/MoreFunctions.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractCollectionAdapter.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractProvider.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/AbstractResponseContext.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicCollectionInfo.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/BasicWorkspaceInfo.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ProtocolException.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetFunctionResolver.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetType.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/pusher/AbstractPusher.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/security/ApiKey.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/security/KeyBase.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/security/Otp.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/templates/DefaultingContext.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/templates/Expression.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/templates/MapContext.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/templates/ObjectContext.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/templates/Route.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/templates/Template.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/templates/TemplateManager.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/CharUtils.java
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/text/Slug.java
abdera/abdera2/core/src/main/java/org/apache/abdera2/Abdera.java
abdera/abdera2/core/src/main/java/org/apache/abdera2/factory/AbstractExtensionFactory.java
abdera/abdera2/core/src/main/java/org/apache/abdera2/model/selector/CollectionAcceptSelector.java
abdera/abdera2/core/src/main/java/org/apache/abdera2/parser/axiom/FOMAttribute.java
abdera/abdera2/core/src/main/java/org/apache/abdera2/parser/axiom/FOMCollection.java
abdera/abdera2/core/src/main/java/org/apache/abdera2/parser/filter/UnacceptableException.java
abdera/abdera2/core/src/main/java/org/apache/abdera2/protocol/error/AbderaProtocolException.java
abdera/abdera2/examples/src/main/java/org/apache/abdera2/examples/activities/MapRedExample.java
abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/features/Feature.java
abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/features/FeatureSelector.java
abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/media/MediaContent.java
abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/rss/RssEnclosure.java
abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/serializer/AbstractConventions.java
abdera/abdera2/ext/src/main/java/org/apache/abdera2/ext/thread/InReplyTo.java
abdera/abdera2/server/src/main/java/org/apache/abdera2/protocol/server/impl/SimpleCategoriesInfo.java
abdera/abdera2/server/src/main/java/org/apache/abdera2/protocol/server/impl/SimpleCategoryInfo.java
abdera/abdera2/server/src/main/java/org/apache/abdera2/protocol/server/impl/SimpleCollectionInfo.java
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/AdaptedType.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/AdaptedType.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/AdaptedType.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/AdaptedType.java Mon Nov 7 21:31:52 2011
@@ -3,6 +3,7 @@ package org.apache.abdera2.activities.io
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -11,6 +12,7 @@ import java.lang.annotation.Target;
* Intended to be used on TypeAdapter instances to
* identify the adapted type
*/
+@Documented
@Retention(RUNTIME)
@Target( {TYPE})
@Inherited
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/GsonIO.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/GsonIO.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/GsonIO.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/GsonIO.java Mon Nov 7 21:31:52 2011
@@ -85,6 +85,7 @@ public class GsonIO extends IO {
gb.registerTypeHierarchyAdapter(Lang.class, new LangAdapter());
gb.registerTypeHierarchyAdapter(ASBase.class, asbs);
gb.registerTypeHierarchyAdapter(Multimap.class, new MultimapAdapter());
+ gb.registerTypeHierarchyAdapter(MimeType.class, new MimeTypeAdapter());
gb.registerTypeAdapter(ASBase.class, asbs);
gb.registerTypeAdapter(Date.class, new DateAdapter());
gb.registerTypeAdapter(DateTime.class, new DateTimeAdapter());
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/MimeTypeAdapter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/MimeTypeAdapter.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/MimeTypeAdapter.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/io/gson/MimeTypeAdapter.java Mon Nov 7 21:31:52 2011
@@ -19,16 +19,14 @@ package org.apache.abdera2.activities.io
import javax.activation.MimeType;
+import org.apache.abdera2.common.mediatype.MimeTypeHelper;
+
@AdaptedType(MimeType.class)
public class MimeTypeAdapter
extends SimpleAdapter<MimeType> {
protected MimeType deserialize(String v) {
- try {
- return new MimeType(v);
- } catch (Throwable t) {
- throw new RuntimeException(t);
- }
+ return MimeTypeHelper.unmodifiableMimeType(v);
}
}
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/ASBase.java Mon Nov 7 21:31:52 2011
@@ -34,9 +34,13 @@ import org.apache.abdera2.activities.mod
import org.apache.abdera2.common.http.EntityTag;
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.mediatype.MimeTypeParseException;
+import org.apache.abdera2.common.misc.ExceptionHelper;
+import org.apache.abdera2.common.misc.MoreFunctions;
import static com.google.common.base.Preconditions.*;
+
import com.google.common.base.Function;
import com.google.common.collect.Iterators;
@@ -109,16 +113,13 @@ public class ASBase
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((exts == null) ? 0 : exts.hashCode());
- return result;
+ return MoreFunctions.genHashCode(1,exts);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
- return true;
+ return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
@@ -151,7 +152,7 @@ public class ASBase
t.base = base;
return type.cast(t);
} catch (Throwable t) {
- throw new RuntimeException(t);
+ throw ExceptionHelper.propogate(t);
}
}
@@ -233,15 +234,11 @@ public class ASBase
}
public void setContentType(String mimeType) {
- try {
- this.contentType = new MimeType(mimeType);
- } catch (javax.activation.MimeTypeParseException t) {
- throw new MimeTypeParseException(t);
- }
+ this.contentType = MimeTypeHelper.unmodifiableMimeType(mimeType);
}
public void setContentType(MimeType mimeType) {
- this.contentType = mimeType;
+ this.contentType = MimeTypeHelper.unmodifiableMimeType(mimeType);
}
public DateTime getLastModified() {
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/Verb.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/Verb.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/Verb.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/Verb.java Mon Nov 7 21:31:52 2011
@@ -20,6 +20,8 @@ package org.apache.abdera2.activities.mo
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
/**
* Activity Verbs... contains the core set of verbs and allows the creation
* of new verbs on the fly.
@@ -99,10 +101,7 @@ public abstract class Verb {
@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
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/model/objects/FileObject.java Mon Nov 7 21:31:52 2011
@@ -23,6 +23,7 @@ import javax.activation.MimeTypeParseExc
import org.apache.abdera2.activities.model.ASObject;
import org.apache.abdera2.common.anno.Name;
import org.apache.abdera2.common.iri.IRI;
+import org.apache.abdera2.common.mediatype.MimeTypeHelper;
@Name("file")
public class FileObject
@@ -55,15 +56,11 @@ public class FileObject
}
public void setMimeType(MimeType mimeType) {
- setProperty("mimeType", mimeType);
+ setProperty("mimeType", MimeTypeHelper.unmodifiableMimeType(mimeType));
}
public void setMimeType(String mimeType) {
- try {
- setProperty("mimeType", new MimeType(mimeType));
- } catch (MimeTypeParseException e) {
- throw new org.apache.abdera2.common.mediatype.MimeTypeParseException(e);
- }
+ setProperty("mimeType", MimeTypeHelper.unmodifiableMimeType(mimeType));
}
public static <T extends FileObject>FileObjectGenerator<T> makeFile() {
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ActivitiesResponseContext.java Mon Nov 7 21:31:52 2011
@@ -24,6 +24,7 @@ import java.io.OutputStream;
import javax.activation.MimeType;
import org.apache.abdera2.activities.model.ASBase;
+import org.apache.abdera2.common.mediatype.MimeTypeHelper;
import org.apache.abdera2.common.protocol.AbstractResponseContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -79,11 +80,7 @@ public class ActivitiesResponseContext<T
}
public MimeType getContentType() {
- try {
- return new MimeType("application/json");
- } catch (Throwable t) {
- throw new RuntimeException(t); // won't happen
- }
+ return MimeTypeHelper.unmodifiableMimeType("application/json");
}
public long getContentLength() {
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/ProtocolException.java Mon Nov 7 21:31:52 2011
@@ -17,6 +17,8 @@
*/
package org.apache.abdera2.activities.protocol;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
public class ProtocolException extends RuntimeException {
private static final long serialVersionUID = 1017447143200419489L;
@@ -40,13 +42,9 @@ public class ProtocolException extends R
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- String message = error != null ? error.getDisplayName() : null;
- int code = error != null ? error.getCode() : 0;
- result = prime * result + ((message == null) ? 0 : message.hashCode());
- result = prime * result + code;
- return result;
+ String message = error != null ? error.getDisplayName() : null;
+ int code = error != null ? error.getCode() : 0;
+ return MoreFunctions.genHashCode(1,message,code);
}
@Override
Modified: abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java (original)
+++ abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/protocol/basic/BasicAdapter.java Mon Nov 7 21:31:52 2011
@@ -35,7 +35,6 @@ import org.apache.abdera2.activities.pro
import org.apache.abdera2.common.mediatype.MimeTypeHelper;
import org.apache.abdera2.common.protocol.RequestContext;
import org.apache.abdera2.common.protocol.ResponseContext;
-import org.apache.abdera2.common.protocol.ProviderHelper;
import org.apache.abdera2.common.protocol.Target;
import org.apache.abdera2.common.protocol.TargetType;
import org.apache.abdera2.common.protocol.RequestContext.Scope;
@@ -46,6 +45,7 @@ import org.joda.time.DateTime;
import com.google.common.base.Function;
import static com.google.common.base.Preconditions.*;
import static org.apache.abdera2.common.misc.ExceptionHelper.*;
+import static org.apache.abdera2.common.protocol.ProviderHelper.*;
/**
* The BasicAdapter provides a simplistic interface for working with Atompub collections with a restricted set of
@@ -133,7 +133,7 @@ public abstract class BasicAdapter exten
MimeType mimeType = request.getContentType();
String contentType = mimeType == null ? null : mimeType.toString();
if (contentType != null && !MimeTypeHelper.isJson(contentType))
- return ProviderHelper.notsupported(request);
+ return notsupported(request);
ASBase base = getEntryFromRequest(request);
Target target = request.getTarget();
@@ -176,11 +176,11 @@ public abstract class BasicAdapter exten
.setStatus(createFlag?201:200)
.setLocation(loc);
} else
- return ProviderHelper.notfound(request);
+ return notfound(request);
} else
- return ProviderHelper.notallowed(request);
+ return notallowed(request);
} catch (Exception e) {
- return ProviderHelper.servererror(request, e.getMessage(), e);
+ return servererror(request, e.getMessage(), e);
}
}
@@ -199,10 +199,10 @@ public abstract class BasicAdapter exten
String entryId = target.getParameter(BasicProvider.PARAM_ENTRY);
try {
return deleteItem(entryId) ?
- ProviderHelper.nocontent() :
- ProviderHelper.notfound(input);
+ nocontent() :
+ notfound(input);
} catch (Exception e) {
- return ProviderHelper.servererror(
+ return servererror(
input, e.getMessage(), e);
}
}
@@ -228,9 +228,9 @@ public abstract class BasicAdapter exten
return
new ActivitiesResponseContext<ASObject>(object)
.setStatus(200);
- } else return ProviderHelper.notfound(input);
+ } else return notfound(input);
} catch (Exception e) {
- return ProviderHelper.servererror(input, e.getMessage(), e);
+ return servererror(input, e.getMessage(), e);
}
}
};
@@ -247,9 +247,9 @@ public abstract class BasicAdapter exten
return
new ActivitiesResponseContext<Collection<ASObject>>(collection)
.setStatus(200);
- } else return ProviderHelper.notfound(input);
+ } else return notfound(input);
} catch (Exception e) {
- return ProviderHelper.servererror(input, e.getMessage(), e);
+ return servererror(input, e.getMessage(), e);
}
}
};
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -17,12 +17,19 @@
*/
package org.apache.abdera2.common.anno;
+import java.lang.annotation.Annotation;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import javax.xml.namespace.QName;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
+import com.google.common.base.Equivalence;
+import com.google.common.base.Predicate;
+
public final class AnnoUtil {
private AnnoUtil() {}
@@ -126,4 +133,187 @@ public final class AnnoUtil {
return qNameFromAnno(_class.getAnnotation(org.apache.abdera2.common.anno.QName.class));
return null;
}
+
+ public static Equivalence<Version> versionEquivalence() {
+ return versionEquivalence(true);
+ }
+
+ public static Equivalence<Version> versionEquivalence(final boolean ignoreStatus) {
+ return new Equivalence<Version>() {
+ protected boolean doEquivalent(Version a, Version b) {
+ if (!a.name().equalsIgnoreCase(b.name())) return false;
+ if (!a.uri().equals(b.uri())) return false;
+ if (!a.value().equals(b.value())) return false;
+ if (!ignoreStatus && !a.status().equals(b.status())) return false;
+ int cmp = a.major() - b.major();
+ if(cmp == 0 && a.minor() > -1 && b.minor() > -1)
+ cmp = a.minor() - b.minor();
+ if(cmp == 0 && a.revision() > -1 && b.revision() > -1)
+ cmp = a.revision() - b.revision();
+ return cmp == 0;
+ }
+ protected int doHash(Version t) {
+ return t.hashCode();
+ }
+ };
+ }
+
+ public static final Predicate<Version> equalOrGreater(
+ final Version version) {
+ return new Predicate<Version>() {
+ public boolean apply(Version input) {
+ int cmp = input.major() - version.major();
+ if(cmp == 0)
+ if(input.minor() > -1 && version.minor() > -1)
+ cmp = input.minor() - version.minor();
+ else
+ cmp = input.minor();
+ if(cmp == 0)
+ if(input.revision() > -1 && version.revision() > -1)
+ cmp = input.revision() - version.revision();
+ else
+ cmp = input.revision();
+ return cmp <= 0;
+ }
+ };
+ }
+
+ public static final Comparator<Version> VERSION_COMPARATOR =
+ new Comparator<Version>() {
+ public int compare(Version v1, Version v2) {
+ int cmp = v1.major() - v2.major();
+ if(cmp == 0)
+ cmp = v1.minor() - v2.minor();
+ if(cmp == 0)
+ cmp = v1.revision() - v2.revision();
+ return cmp;
+ }
+ };
+
+
+ public static final Version version(String value, String name, String uri) {
+ return new VersionImpl(value,name,uri,0,0,0,Version.Status.STABLE);
+ }
+
+ public static final Version version(
+ String value,
+ String name,
+ String uri,
+ int major,
+ int minor,
+ int revision,
+ Version.Status status) {
+ return new VersionImpl(
+ value,
+ name,
+ uri,
+ major,
+ minor,
+ revision,
+ status);
+ }
+
+ private static class VersionImpl
+ implements Version {
+
+ @Override
+ public int hashCode() {
+ return MoreFunctions.genHashCode(1,
+ major,minor,name,revision,uri,value,status);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ VersionImpl other = (VersionImpl) obj;
+ if (major != other.major)
+ return false;
+ if (minor != other.minor)
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (revision != other.revision)
+ return false;
+ if (uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!uri.equals(other.uri))
+ return false;
+ if (value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!value.equals(other.value))
+ return false;
+ if (status == null) {
+ if (other.status != null)
+ return false;
+ } else if (!status.equals(other.status))
+ return false;
+ return true;
+ }
+
+ private final String value;
+ private final String name;
+ private final String uri;
+ private final int major,minor,revision;
+ private final Version.Status status;
+
+ VersionImpl(
+ String value,
+ String name,
+ String uri,
+ int major,
+ int minor,
+ int revision,
+ Version.Status status) {
+ this.value = value;
+ this.name = name;
+ this.uri = uri;
+ this.major = major;
+ this.minor = minor;
+ this.revision = revision;
+ this.status = status;
+ }
+
+ public Class<? extends Annotation> annotationType() {
+ return Version.class;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ public String name() {
+ return name;
+ }
+
+ public String uri() {
+ return uri;
+ }
+
+ public int major() {
+ return major;
+ }
+
+ public int minor() {
+ return minor;
+ }
+
+ public int revision() {
+ return revision;
+ }
+
+ public Status status() {
+ return status;
+ }
+
+ }
}
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Context.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Context.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Context.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Context.java Mon Nov 7 21:31:52 2011
@@ -3,6 +3,7 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -12,6 +13,7 @@ import java.lang.annotation.Target;
* default context. Each Context Annotation contains a
* list of static Param annotations
*/
+@Documented
@Retention(RUNTIME)
@Target( {TYPE})
public @interface Context {
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/DefaultImplementation.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/DefaultImplementation.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/DefaultImplementation.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/DefaultImplementation.java Mon Nov 7 21:31:52 2011
@@ -20,6 +20,7 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -27,6 +28,7 @@ import java.lang.annotation.Target;
* Used on Interface classes to identify the default implementation
* class when using the Abdera Discover mechanism
*/
+@Documented
@Retention(RUNTIME)
@Target( {TYPE})
public @interface DefaultImplementation {
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Name.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Name.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Name.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Name.java Mon Nov 7 21:31:52 2011
@@ -22,10 +22,12 @@ import static java.lang.annotation.Eleme
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
+@Documented
@Retention(RUNTIME)
@Target( {TYPE,FIELD,METHOD})
@Inherited
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Namespace.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Namespace.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Namespace.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Namespace.java Mon Nov 7 21:31:52 2011
@@ -19,6 +19,7 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -26,6 +27,7 @@ import java.lang.annotation.Target;
* Used by Extension Factory classes to specify the XML namespaces
* handled by the factory
*/
+@Documented
@Retention(RUNTIME)
@Target( {TYPE})
public @interface Namespace {
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Param.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Param.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Param.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Param.java Mon Nov 7 21:31:52 2011
@@ -3,6 +3,7 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -10,6 +11,7 @@ import java.lang.annotation.Target;
* Used with the Context Annotation to establish a static context
* primarily for use with the URI Template implementation
*/
+@Documented
@Retention(RUNTIME)
@Target( {TYPE})
public @interface Param {
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/QName.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/QName.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/QName.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/QName.java Mon Nov 7 21:31:52 2011
@@ -20,6 +20,7 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -27,6 +28,7 @@ import java.lang.annotation.Target;
/**
* Used primarily to associate an XML Qualified name with an interface
*/
+@Documented
@Retention(RUNTIME)
@Target( {TYPE})
@Inherited
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URIRoute.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URIRoute.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URIRoute.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URIRoute.java Mon Nov 7 21:31:52 2011
@@ -20,6 +20,7 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -29,6 +30,7 @@ import java.lang.annotation.Target;
* be automatically mapped to URI Template variable names. Alternative varnames can be specified for each field/getter
* using the VarName annotation
*/
+@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface URIRoute {
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URITemplate.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URITemplate.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URITemplate.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/URITemplate.java Mon Nov 7 21:31:52 2011
@@ -20,6 +20,7 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -29,6 +30,7 @@ import java.lang.annotation.Target;
* be automatically mapped to URI Template variable names. Alternative varnames can be specified for each field/getter
* using the VarName annotation
*/
+@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface URITemplate {
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Version.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Version.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Version.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/anno/Version.java Mon Nov 7 21:31:52 2011
@@ -20,15 +20,26 @@ package org.apache.abdera2.common.anno;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
+@Documented
@Retention(RUNTIME)
@Target( {TYPE})
@Inherited
public @interface Version {
+ public static enum Status {
+ STABLE,
+ DEVELOPMENT,
+ DEPRECATED
+ }
String value(); // Version Number
String name(); // App Name
String uri(); // App URI
+ int major() default 0; // major code
+ int minor() default 0; // minor code
+ int revision() default 0; // revision code
+ Status status() default Status.DEVELOPMENT;
}
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -18,7 +18,11 @@
package org.apache.abdera2.common.geo;
import java.io.Serializable;
+
+import org.apache.abdera2.common.misc.MoreFunctions;
+
import static com.google.common.base.Preconditions.*;
+import static java.lang.Double.compare;
public class Coordinate
implements Serializable,
@@ -46,11 +50,30 @@ public class Coordinate
this(pos.getLatitude(),pos.getLongitude());
}
+ private static final String LAT = "Latitude %s %s90.0 degrees";
+ private static final String LONG = "Longitude %s= %s180.0 degrees";
+
+ private void checkLatitude(double latitude) {
+ checkArgument(
+ !(compare(latitude, 90.0d) > 0),
+ String.format(LAT,'>','+'));
+ checkArgument(
+ !(compare(latitude, -90.0d) < 0),
+ String.format(LAT,'<','-'));
+ }
+
+ private void checkLongitude(double longitude) {
+ checkArgument(
+ !(compare(longitude, 180.0d) >= 0),
+ String.format(LONG,'>','+'));
+ checkArgument(
+ !(compare(longitude, -180.0d) <= 0),
+ String.format(LONG,'<','-'));
+ }
+
public Coordinate(double latitude, double 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");
+ checkLatitude(latitude);
+ checkLongitude(longitude);
this.latitude = latitude;
this.longitude = longitude;
}
@@ -59,10 +82,8 @@ public class Coordinate
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");
+ checkLatitude(latitude);
+ checkLongitude(longitude);
}
public double getLatitude() {
@@ -95,14 +116,9 @@ public class Coordinate
@Override
public int hashCode() {
- final int PRIME = 31;
- int result = 1;
- long temp;
- temp = Double.doubleToLongBits(latitude);
- result = PRIME * result + (int)(temp ^ (temp >>> 32));
- temp = Double.doubleToLongBits(longitude);
- result = PRIME * result + (int)(temp ^ (temp >>> 32));
- return result;
+ return MoreFunctions.genHashCode(1,
+ latitude,
+ longitude);
}
@Override
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -24,6 +24,8 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import static com.google.common.base.Preconditions.*;
@@ -41,33 +43,37 @@ public abstract class Multiple extends P
return (P)this;
}
+ private static void checkMaxPoints(int points, int max) {
+ checkState(points <= max, "Maximum coordinates exceeded", max);
+ }
+
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);
+ checkMaxPoints(coordinates.size(),max);
return (P)this;
}
public <P extends Builder<X>>P add(Coordinate coordinate) {
- checkState(maxpoints < 0 || coordinates.size()+1 <= maxpoints, "Maximum coordinates exceeded", maxpoints);
+ checkMaxPoints(coordinates.size()+1,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);
+ checkMaxPoints(coordinates.size()+1,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);
+ checkMaxPoints(coordinates.size()+1,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);
+ checkMaxPoints(coordinates.size()+1,maxpoints);
this.coordinates.add(Coordinate.at(position));
return (P)this;
}
@@ -95,10 +101,7 @@ public abstract class Multiple extends P
@Override
public int hashCode() {
- final int PRIME = 31;
- int result = super.hashCode();
- result = PRIME * result + ((coordinates == null) ? 0 : coordinates.hashCode());
- return result;
+ return MoreFunctions.genHashCode(super.hashCode(),coordinates);
}
@Override
@@ -148,7 +151,7 @@ public abstract class Multiple extends P
}
return list;
} catch (Throwable t) {
- throw new RuntimeException("Error parsing coordinate pairs", t);
+ throw new RuntimeException("Error parsing coordinate pairs", t);
}
}
}
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -17,6 +17,8 @@
*/
package org.apache.abdera2.common.geo;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
public class Point extends Position {
public static Point at(Coordinate coordinate) {
@@ -107,10 +109,7 @@ public class Point extends Position {
@Override
public int hashCode() {
- final int PRIME = 31;
- int result = super.hashCode();
- result = PRIME * result + ((coordinate == null) ? 0 : coordinate.hashCode());
- return result;
+ return MoreFunctions.genHashCode(super.hashCode(),coordinate);
}
@Override
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -19,6 +19,8 @@ package org.apache.abdera2.common.geo;
import java.io.Serializable;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
import com.google.common.base.Supplier;
public abstract class Position
@@ -102,19 +104,13 @@ public abstract class Position
@Override
public int hashCode() {
- final int PRIME = 31;
- // int result = super.hashCode();
- int result = this.getClass().hashCode();
- result = PRIME * result + ((elevation == null) ? 0 : elevation.hashCode());
- result =
- PRIME * result
- + ((featureTypeTag == null) ? DEFAULT_FEATURE_TYPE_TAG.hashCode() : featureTypeTag.hashCode());
- result = PRIME * result + ((floor == null) ? 0 : floor.hashCode());
- result = PRIME * result + ((radius == null) ? 0 : radius.hashCode());
- result =
- PRIME * result
- + ((relationshipTag == null) ? DEFAULT_RELATIONSHIP_TAG.hashCode() : relationshipTag.hashCode());
- return result;
+ return MoreFunctions.genHashCode(
+ getClass().hashCode(),
+ elevation,
+ featureTypeTag == null ? DEFAULT_FEATURE_TYPE_TAG : featureTypeTag,
+ floor, radius,
+ relationshipTag == null ? DEFAULT_RELATIONSHIP_TAG : relationshipTag
+ );
}
@Override
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -31,8 +31,11 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.abdera2.common.misc.MoreFunctions;
import org.apache.abdera2.common.text.CharUtils.Profile;
import org.apache.abdera2.common.text.Codec;
+
+import static org.apache.abdera2.common.text.CharUtils.appendcomma;
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.quoted;
@@ -41,6 +44,8 @@ import org.apache.commons.codec.binary.S
import com.google.common.base.Function;
import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterators;
/**
* Implementation of the HTTP Challenge/Credentials Construct. This is helpful when
@@ -66,15 +71,13 @@ public class Authentication implements I
Pattern.compile("("+PARAM+")");
private final static Set<String> ALWAYS =
- new HashSet<String>();
- static {
- alwaysQuote(
+ new HashSet<String>(
+ ImmutableSet.of(
"domain",
"nonce",
"opaque",
"qop",
- "realm");
- }
+ "realm"));
public static synchronized void alwaysQuote(String... names) {
checkNotNull(names);
@@ -124,9 +127,9 @@ public class Authentication implements I
implements Supplier<Authentication> {
private String scheme;
private String b64token;
- private Map<String,String> params =
+ private final Map<String,String> params =
new LinkedHashMap<String,String>();
- private Set<String> quoted =
+ private final Set<String> quoted =
new HashSet<String>();
public Authentication get() {
@@ -171,8 +174,7 @@ public class Authentication implements I
private final String b64token;
private final Map<String,String> params =
new LinkedHashMap<String,String>();
- private final Set<String> quoted =
- new HashSet<String>();
+ private final Set<String> quoted;
public Authentication(String scheme) {
this(scheme,null);
@@ -182,13 +184,14 @@ public class Authentication implements I
checkNotNull(scheme);
this.scheme = scheme.toLowerCase(Locale.US);
this.b64token = b64token;
+ this.quoted = ImmutableSet.<String>of();
}
private Authentication(Builder builder) {
this.scheme = builder.scheme;
this.b64token = builder.b64token;
this.params.putAll(builder.params);
- this.quoted.addAll(builder.quoted);
+ this.quoted = ImmutableSet.copyOf(builder.quoted);
}
public String getScheme() {
@@ -212,7 +215,7 @@ public class Authentication implements I
}
public Iterator<String> iterator() {
- return params.keySet().iterator();
+ return Iterators.unmodifiableIterator(params.keySet().iterator());
}
private boolean isquoted(String param) {
@@ -228,9 +231,7 @@ public class Authentication implements I
else {
boolean first = true;
for (String param : this) {
- if (!first) {
- buf.append(',').append(' ');
- } else first = false;
+ first = appendcomma(first,buf);
String val = getParam(param);
buf.append(param);
boolean always = is_always_quoted(param) || isquoted(param);
@@ -248,12 +249,7 @@ public class Authentication implements I
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((b64token == null) ? 0 : b64token.hashCode());
- result = prime * result + ((params == null) ? 0 : params.hashCode());
- result = prime * result + ((scheme == null) ? 0 : scheme.hashCode());
- return result;
+ return MoreFunctions.genHashCode(1,b64token,params,scheme);
}
@Override
@@ -284,11 +280,11 @@ public class Authentication implements I
}
public static Authentication basic(String userid, String password) {
- String b64token =
+ return new Authentication(
+ BASIC,
StringUtils.newStringUsAscii(
Base64.encodeBase64(
- bytes(userid,":",password)));
- return new Authentication(BASIC, b64token);
+ bytes(userid,":",password))));
}
private static byte[] bytes(String val, String... vals) {
@@ -316,8 +312,7 @@ public class Authentication implements I
StringBuilder buf = new StringBuilder();
boolean first = true;
for (Authentication auth : auths) {
- if (!first) buf.append(", ");
- else first = !first;
+ first = appendcomma(first,buf);
buf.append(auth.toString());
}
return buf.toString();
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -18,17 +18,28 @@
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.LinkedHashMap;
+import java.util.Locale;
import java.util.Map;
+import java.util.Set;
+
+import org.apache.abdera2.common.misc.MoreFunctions;
import com.google.common.base.Function;
import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkArgument;
public final class CacheControl implements Serializable {
+ private static final Set<String> reserved =
+ ImmutableSet.of(
+ "private","public","no-cache","no-store","no-transform","only-if-cached",
+ "must-revalidate", "proxy-revalidate", "max-age", "max-stale", "min-fresh",
+ "stale-if-error", "stale-while-revalidate");
+
public static Builder make() {
return new Builder();
}
@@ -40,16 +51,17 @@ public final class CacheControl implemen
public static class Builder implements Supplier<CacheControl> {
protected int flags = 0;
- protected String[] nocache_headers = {},
- private_headers = {};
+ protected Iterable<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>();
+ protected final Map<String,Object> exts =
+ new LinkedHashMap<String,Object>();
public Builder() {
defaults();
@@ -94,13 +106,31 @@ public final class CacheControl implemen
return new CacheControl(this);
}
+ private void checkReserved(String name) {
+ checkNotNull(name);
+ checkArgument(!reserved.contains(name.toLowerCase()), "Reserved directive", name);
+ }
+
public Builder extensions(Map<String,Object> exts) {
- this.exts.putAll(exts);
+ for (Map.Entry<String, Object> entry : exts.entrySet()) {
+ String name = entry.getKey().toLowerCase(Locale.US);
+ checkReserved(name);
+ exts.put(
+ name,
+ entry.getValue());
+ }
return this;
}
public Builder extension(String name, Object value) {
- exts.put(name,value);
+ checkReserved(name);
+ exts.put(name.toLowerCase(Locale.US),value);
+ return this;
+ }
+
+ public Builder extension(String name) {
+ checkReserved(name);
+ exts.put(name.toLowerCase(Locale.US),null);
return this;
}
@@ -119,48 +149,85 @@ public final class CacheControl implemen
return this;
}
+ public Builder mustRevalidate() {
+ toggle(true,REVALIDATE);
+ return this;
+ }
+
public Builder mustRevalidate(boolean val) {
toggle(val,REVALIDATE);
return this;
}
+ public Builder proxyRevalidate() {
+ toggle(true,PROXYREVALIDATE);
+ return this;
+ }
+
public Builder proxyRevalidate(boolean val) {
toggle(val,PROXYREVALIDATE);
return this;
}
+ public Builder noCache() {
+ toggle(true,NOCACHE);
+ return this;
+ }
+
public Builder noCache(boolean val) {
toggle(val,NOCACHE);
return this;
}
+ public Builder noStore() {
+ toggle(true,NOSTORE);
+ return this;
+ }
+
public Builder noStore(boolean val) {
toggle(val,NOSTORE);
return this;
}
+ public Builder noTransform() {
+ toggle(true,NOTRANSFORM);
+ return this;
+ }
+
public Builder noTransform(boolean val) {
toggle(val,NOTRANSFORM);
return this;
}
+ public Builder isPublic() {
+ toggle(true,PUBLIC);
+ return this;
+ }
+
public Builder isPublic(boolean val) {
toggle(val,PUBLIC);
return this;
}
+ public Builder isPrivate() {
+ toggle(true,PRIVATE);
+ return this;
+ }
+
public Builder isPrivate(boolean val) {
toggle(val,PRIVATE);
return this;
}
public Builder privateHeaders(String... headers) {
- this.private_headers = headers;
+ this.private_headers = ImmutableSet.copyOf(headers);
+ if (headers.length > 0) isPrivate();
return this;
}
public Builder noCacheHeaders(String... headers) {
- this.nocache_headers = headers;
+ this.nocache_headers = ImmutableSet.copyOf(headers);
+ if (headers.length > 0) noCache();
return this;
}
@@ -174,16 +241,19 @@ public final class CacheControl implemen
return this;
}
+ public Builder onlyIfCached() {
+ toggle(true,ONLYIFCACHED);
+ 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;
+ if (val) flags |= flag;
+ else flags &= ~flag;
}
}
@@ -209,21 +279,28 @@ public final class CacheControl implemen
PROXYREVALIDATE = 64,
ONLYIFCACHED = 128;
protected final int flags;
- protected final String[] nocache_headers,
- private_headers;
+ protected final Iterable<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>();
+ protected final Map<String,Object> exts =
+ new LinkedHashMap<String,Object>();
private CacheControl(Builder builder) {
this.flags = builder.flags;
- this.nocache_headers = builder.nocache_headers;
- this.private_headers = builder.private_headers;
+ this.nocache_headers =
+ builder.nocache_headers != null ?
+ builder.nocache_headers :
+ ImmutableSet.<String>of();
+ this.private_headers =
+ builder.private_headers != null ?
+ builder.private_headers :
+ ImmutableSet.<String>of();
this.max_age = builder.max_age;
this.max_stale = builder.max_stale;
this.min_fresh = builder.min_fresh;
@@ -262,11 +339,15 @@ public final class CacheControl implemen
}
public Iterable<String> getNoCacheHeaders() {
- return isNoCache() ? Arrays.asList(nocache_headers) : Collections.<String>emptySet();
+ return isNoCache() ?
+ nocache_headers :
+ ImmutableSet.<String>of();
}
public Iterable<String> getPrivateHeaders() {
- return isPrivate() ? Arrays.asList(private_headers) : Collections.<String>emptySet();
+ return isPrivate() ?
+ private_headers :
+ ImmutableSet.<String>of();
}
public long getSMaxAge() {
@@ -315,19 +396,16 @@ public final class CacheControl implemen
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + flags;
- result = prime * result + (int) (max_age ^ (max_age >>> 32));
- result = prime * result + (int) (max_stale ^ (max_stale >>> 32));
- result = prime * result + (int) (min_fresh ^ (min_fresh >>> 32));
- result = prime * result + Arrays.hashCode(nocache_headers);
- result = prime * result + Arrays.hashCode(private_headers);
- result = prime * result + (int) (smax_age ^ (smax_age >>> 32));
- result = prime * result + (int) (staleiferror ^ (staleiferror >>> 32));
- result = prime * result
- + (int) (stalewhilerevalidate ^ (stalewhilerevalidate >>> 32));
- return result;
+ return MoreFunctions.genHashCode(
+ 1, flags,
+ max_age,
+ max_stale,
+ min_fresh,
+ nocache_headers,
+ private_headers,
+ smax_age,
+ staleiferror,
+ stalewhilerevalidate);
}
@Override
@@ -347,9 +425,9 @@ public final class CacheControl implemen
return false;
if (min_fresh != other.min_fresh)
return false;
- if (!Arrays.equals(nocache_headers, other.nocache_headers))
+ if (!Iterables.elementsEqual(nocache_headers, other.nocache_headers))
return false;
- if (!Arrays.equals(private_headers, other.private_headers))
+ if (!Iterables.elementsEqual(private_headers, other.private_headers))
return false;
if (smax_age != other.smax_age)
return false;
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -17,16 +17,17 @@
*/
package org.apache.abdera2.common.http;
-import java.util.HashMap;
+import java.util.Collections;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.abdera2.common.text.CharUtils;
+import com.google.common.collect.Iterators;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Iterables;
+import static java.lang.String.format;
+import static org.apache.abdera2.common.text.CharUtils.*;
/**
* Provides parsing and properly handling of the HTTP Cache-Control header.
@@ -38,73 +39,39 @@ public final class CacheControlUtil {
private static long value(String val) {
return (val != null) ? Long.parseLong(val) : -1;
}
-
- private static void append(StringBuilder buf, String value) {
- if (buf.length() > 0)
- buf.append(", ");
- buf.append(value);
- }
-
- private static final Joiner joiner = Joiner.on(',').skipNulls();
/**
* Construct the Cache-Control header from info in the request object
*/
- public static String buildCacheControl(CacheControl cacheControl) {
+ public static String buildCacheControl(CacheControl cc) {
StringBuilder buf = new StringBuilder();
- if (cacheControl.isPrivate()) {
- append(buf, "private");
- Iterable<String> headers = cacheControl.getPrivateHeaders();
- if (!Iterables.isEmpty(headers)) {
- buf.append("=\"");
- joiner.appendTo(buf, headers);
- buf.append("\"");
- }
- }
- if (cacheControl.isPublic())
- append(buf, "public");
- if (cacheControl.isNoCache()) {
- append(buf, "no-cache");
- Iterable<String> headers = cacheControl.getNoCacheHeaders();
- if (!Iterables.isEmpty(headers)) {
- buf.append("=\"");
- joiner.appendTo(buf,headers);
- buf.append("\"");
- }
- }
- if (cacheControl.isNoStore())
- append(buf, "no-store");
- if (cacheControl.isNoTransform())
- append(buf, "no-transform");
- if (cacheControl.isOnlyIfCached())
- append(buf, "only-if-cached");
- if (cacheControl.isMustRevalidate())
- append(buf, "must-revalidate");
- if (cacheControl.isProxyRevalidate())
- append(buf, "proxy-revalidate");
- if (cacheControl.getMaxAge() != -1)
- append(buf, String.format("max-age=%d", cacheControl.getMaxAge()));
- if (cacheControl.getMaxStale() != -1)
- append(buf, String.format("max-stale=%d", cacheControl.getMaxStale()));
- if (cacheControl.getMinFresh() != -1)
- append(buf, String.format("min-fresh=%d", cacheControl.getMinFresh()));
- if (cacheControl.getStaleIfError() != -1)
- append(buf, String.format("stale-if-error=%d", cacheControl.getStaleIfError()));
- if (cacheControl.getStaleWhileRevalidate() != -1)
- append(buf, String.format("stale-while-revalidate=%d", cacheControl.getStaleWhileRevalidate()));
- for (String ext : cacheControl.listExtensions()) {
+ appendif(cc.isPrivate(), buf, "private");
+ appendif(cc.isPrivate(), buf, cc.getPrivateHeaders());
+ appendif(cc.isPublic(), buf, "public");
+ appendif(cc.isNoCache(), buf, "no-cache");
+ appendif(cc.isNoCache(), buf, cc.getNoCacheHeaders());
+ appendif(cc.isNoStore(), buf, "no-store");
+ appendif(cc.isNoTransform(), buf, "no-transform");
+ appendif(cc.isOnlyIfCached(), buf, "only-if-cached");
+ appendif(cc.isMustRevalidate(), buf, "must-revalidate");
+ appendif(cc.isProxyRevalidate(), buf, "proxy-revalidate");
+ appendif(cc.getMaxAge() != -1, buf, "max-age=%d", cc.getMaxAge());
+ appendif (cc.getMaxStale() != -1, buf, "max-stale=%d", cc.getMaxStale());
+ appendif (cc.getMinFresh() != -1, buf, "min-fresh=%d", cc.getMinFresh());
+ appendif (cc.getStaleIfError() != -1, buf, "stale-if-error=%d", cc.getStaleIfError());
+ appendif (cc.getStaleWhileRevalidate() != -1, buf, "stale-while-revalidate=%d", cc.getStaleWhileRevalidate());
+ for (String ext : cc.listExtensions()) {
append(buf, ext);
- Object val = cacheControl.getExtension(ext);
- if (val instanceof Long || val instanceof Integer || val instanceof Short || val instanceof Byte) {
- buf.append('=')
- .append(val);
- } else {
- String v = val.toString();
- if (val != null && v.length() > 0)
- buf.append('=')
- .append('"')
- .append(val)
- .append('"');
+ Object val = cc.getExtension(ext);
+ if (val != null) {
+ if (Number.class.isAssignableFrom(val.getClass()))
+ buf.append('=').append(val);
+ else {
+ String v = val.toString();
+ if (v.length() > 0)
+ buf.append(
+ format("=%s",quotedIfNotToken(v)));
+ }
}
}
return buf.toString();
@@ -154,17 +121,17 @@ public final class CacheControlUtil {
public void set(CacheControl.Builder builder, CacheControlParser parser) {
switch (this) {
case NOCACHE:
- builder.noCache(true);
+ builder.noCache();
builder.noCacheHeaders(parser.getValues(this));
break;
case NOSTORE:
- builder.noStore(true);
+ builder.noStore();
break;
case NOTRANSFORM:
- builder.noTransform(true);
+ builder.noTransform();
break;
case ONLYIFCACHED:
- builder.onlyIfCached(true);
+ builder.onlyIfCached();
break;
case MAXAGE:
builder.maxAge(value(parser.getValue(this)));
@@ -179,16 +146,16 @@ public final class CacheControlUtil {
builder.staleIfError(value(parser.getValue(this)));
break;
case MUSTREVALIDATE:
- builder.mustRevalidate(true);
+ builder.mustRevalidate();
break;
case PROXYREVALIDATE:
- builder.proxyRevalidate(true);
+ builder.proxyRevalidate();
break;
case PUBLIC:
- builder.isPublic(true);
+ builder.isPublic();
break;
case PRIVATE:
- builder.isPrivate(true);
+ builder.isPrivate();
builder.privateHeaders(parser.getValues(this));
break;
case STALEWHILEREVALIDATE:
@@ -209,8 +176,10 @@ public final class CacheControlUtil {
private static final Pattern pattern = Pattern.compile(REGEX);
- private final HashMap<Directive, String> values = new HashMap<Directive, String>();
- private final HashMap<String,Object> exts = new HashMap<String,Object>();
+ private final Map<Directive, String> values =
+ new LinkedHashMap<Directive, String>();
+ private final Map<String,Object> exts =
+ new LinkedHashMap<String,Object>();
public CacheControlParser(String value) {
Matcher matcher = pattern.matcher(value);
@@ -225,33 +194,33 @@ public final class CacheControlUtil {
Long l = Long.parseLong(val);
exts.put(d, l);
} catch (Throwable t) {
- exts.put(d, val != null ? CharUtils.unquote(val) : "");
+ exts.put(d, unquote(val!=null?val:""));
}
}
}
}
public Map<String,Object> getExtensions() {
- return exts;
+ return Collections.unmodifiableMap(exts);
}
public Map<Directive, String> getValues() {
- return values;
+ return Collections.unmodifiableMap(values);
}
public String getValue(Directive directive) {
- return values.get(directive);
+ return values.get(directive);
}
public Iterator<Directive> iterator() {
- return values.keySet().iterator();
+ return Iterators.unmodifiableIterator(values.keySet().iterator());
}
public String[] getValues(Directive directive) {
- String value = getValue(directive);
- return value == null ?
- null :
- CharUtils.splitAndTrim(value);
+ String value = getValue(directive);
+ return value == null ?
+ null :
+ splitAndTrim(value);
}
}
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/EntityTag.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/EntityTag.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/EntityTag.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/EntityTag.java Mon Nov 7 21:31:52 2011
@@ -26,11 +26,16 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import org.apache.abdera2.common.misc.ExceptionHelper;
+import org.apache.abdera2.common.misc.MoreFunctions;
import org.apache.abdera2.common.text.UrlEncoding;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSet;
+
import static com.google.common.base.Preconditions.*;
+import static org.apache.abdera2.common.text.CharUtils.*;
/**
* Implements an EntityTag.
@@ -49,9 +54,8 @@ public class EntityTag
boolean wild =
entity_tag.charAt(0) == '*' && l == 0;
if (wild) return EntityTag.WILD;
- boolean weak = (entity_tag.charAt(0) == 'W' ||
- entity_tag.charAt(0) == 'w');
- checkArgument(!(weak && entity_tag.charAt(1) !='/'),"Invalid");
+ boolean weak = Character.toUpperCase(entity_tag.charAt(0)) == 'W';
+ checkArgument(!weak || entity_tag.charAt(1) =='/',"Invalid");
int pos = weak?2:0;
checkArgument(
entity_tag.charAt(pos) == '"' &&
@@ -63,14 +67,14 @@ public class EntityTag
public static Iterable<EntityTag> parseTags(String entity_tags) {
if (entity_tags == null ||
entity_tags.length() == 0)
- return Collections.emptyList();
+ return ImmutableSet.<EntityTag>of();
String[] tags =
entity_tags.split("((?<=\")\\s*,\\s*(?=([wW]/)?\"|\\*))");
List<EntityTag> etags =
new ArrayList<EntityTag>();
for (String tag : tags)
etags.add(EntityTag.parse(tag.trim()));
- return etags;
+ return ImmutableSet.<EntityTag>copyOf(etags);
}
public static Predicate<String> matchesAny(final EntityTag tag) {
@@ -296,26 +300,19 @@ public class EntityTag
public String toString() {
StringBuilder buf = new StringBuilder();
- if (wild) {
+ if (wild)
buf.append("*");
- } else {
- if (weak)
- buf.append("W/");
- buf.append('"')
- .append(tag)
- .append('"');
+ else {
+ appendif(weak,buf,"W/");
+ buf.append(quoted(tag,true));
}
return buf.toString();
}
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((tag == null) ? 0 : tag.hashCode());
- result = prime * result + (weak ? 1231 : 1237);
- result = prime * result + (wild ? 1231 : 1237);
- return result;
+ return MoreFunctions.genHashCode(
+ 1,tag,weak,wild);
}
@Override
@@ -450,28 +447,19 @@ public class EntityTag
StringBuilder buf = new StringBuilder();
boolean first = true;
for (EntityTag tag : tags) {
- if (!first) buf.append(", ");
- else first = !first;
+ first = appendcomma(first,buf);
buf.append(tag.toString());
}
return buf.toString();
}
public int compareTo(EntityTag o) {
- if (o.isWild() && !isWild())
- return 1;
- if (isWild() && !o.isWild())
- return -1;
- if (o.isWeak() && !isWeak())
- return -1;
- if (isWeak() && !o.isWeak())
- return 1;
- return tag.compareTo(o.tag);
+ return o.wild && !wild || weak && !o.weak ?
+ 1 : wild && !o.wild || o.weak && !weak ?
+ -1 : tag.compareTo(o.tag);
}
- public static interface EntityTagGenerator<T> {
- EntityTag generateFor(T t);
- }
+ public static interface EntityTagGenerator<T> extends Function<T,EntityTag> {}
@Retention(RUNTIME)
@Target( {TYPE})
@@ -483,27 +471,23 @@ public class EntityTag
public static <T>EntityTag generate(T t) {
EntityTag etag = null;
try {
- if (t == null)
- throw new IllegalArgumentException();
- Class<?> _class = t.getClass();
+ Class<?> _class = checkNotNull(t).getClass();
if (_class.isAnnotationPresent(ETagGenerator.class)) {
ETagGenerator g = _class.getAnnotation(ETagGenerator.class);
Class<? extends EntityTagGenerator<T>> gen =
(Class<? extends EntityTagGenerator<T>>) g.value();
EntityTagGenerator<T> etg =
gen.newInstance();
- etag = etg.generateFor(t);
+ etag = etg.apply(t);
} else etag = generate(new String[] {t.toString()});
} catch (Throwable e) {
- throw new RuntimeException(e);
+ throw ExceptionHelper.propogate(e);
}
return etag;
}
- public static <T>EntityTag generator(T t, EntityTagGenerator<T> gen) {
- if (t == null)
- throw new IllegalArgumentException();
- return gen.generateFor(t);
+ public static <T>EntityTag generate(T t, EntityTagGenerator<T> gen) {
+ return gen.apply(checkNotNull(t));
}
}
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Method.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Method.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Method.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/Method.java Mon Nov 7 21:31:52 2011
@@ -20,6 +20,8 @@ package org.apache.abdera2.common.http;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
public final class Method {
private static final Map<String, Method> methods =
@@ -120,12 +122,8 @@ public final class Method {
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + (idempotent ? 1231 : 1237);
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- result = prime * result + (safe ? 1231 : 1237);
- return result;
+ return MoreFunctions.genHashCode(
+ 1, idempotent, name, safe);
}
@Override
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=1198949&r1=1198948&r2=1198949&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 Mon Nov 7 21:31:52 2011
@@ -6,18 +6,25 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Locale;
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 org.apache.abdera2.common.text.CharUtils;
+
+import static org.apache.abdera2.common.text.CharUtils.appendcomma;
import static org.apache.abdera2.common.text.CharUtils.quotedIfNotToken;
import org.apache.abdera2.common.text.Codec;
import org.apache.abdera2.common.text.CharUtils.Profile;
+import static com.google.common.base.Preconditions.*;
import com.google.common.base.Supplier;
+import com.google.common.collect.Iterables;
/**
* Implementation of the Prefer HTTP Header, e.g.
@@ -75,7 +82,7 @@ public class Preference implements Seria
private String token;
private String value;
private final Map<String,String> params =
- new HashMap<String,String>();
+ new LinkedHashMap<String,String>();
public Preference get() {
return new Preference(this);
@@ -112,14 +119,20 @@ public class Preference implements Seria
}
public Builder param(String key, String val) {
- if (key == null || reserved(key))
- throw new IllegalArgumentException();
+ checkNotNull(key);
+ key = key.toLowerCase(Locale.US);
+ checkArgument(!reserved(key));
this.params.put(key,val);
return this;
}
public Builder params(Map<String,String> params) {
- this.params.putAll(params);
+ checkNotNull(params);
+ for (Map.Entry<String,String> entry : params.entrySet()) {
+ String name = entry.getKey().toLowerCase(Locale.US);
+ checkArgument(!reserved(name));
+ this.params.put(name,entry.getValue());
+ }
return this;
}
@@ -151,7 +164,7 @@ public class Preference implements Seria
public Preference(String token, String value) {
Profile.TOKEN.verify(token);
- this.token = token.toLowerCase();
+ this.token = token.toLowerCase(Locale.US);
this.value = value;
}
@@ -180,10 +193,8 @@ public class Preference implements Seria
}
private static final Set<String> reserved =
- new HashSet<String>();
- static {
- // no reserved yet
- }
+ new HashSet<String>(); // no reserved yet
+
private static boolean reserved(String name) {
return reserved.contains(name);
}
@@ -195,12 +206,8 @@ public class Preference implements Seria
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((params == null) ? 0 : params.hashCode());
- result = prime * result + ((token == null) ? 0 : token.hashCode());
- result = prime * result + ((value == null) ? 0 : value.hashCode());
- return result;
+ return MoreFunctions.genHashCode(
+ 1, params, token, value);
}
@Override
@@ -231,8 +238,9 @@ public class Preference implements Seria
}
public String getParam(String name) {
- if (name == null || reserved(name))
- throw new IllegalArgumentException();
+ checkNotNull(name);
+ name = name.toLowerCase(Locale.US);
+ checkArgument(!reserved(name));
return params.get(name);
}
@@ -308,7 +316,7 @@ public class Preference implements Seria
}
prefs.add(maker.get());
}
- return prefs;
+ return Iterables.unmodifiableIterable(prefs);
}
public static String toString(
@@ -328,8 +336,7 @@ public class Preference implements Seria
StringBuilder buf = new StringBuilder();
boolean first = true;
for (Preference pref : preferences) {
- if (!first) buf.append(',');
- else first = !first;
+ first = appendcomma(first,buf);
buf.append(pref.toString());
}
return buf.toString();
Modified: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/QualityHelper.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/QualityHelper.java?rev=1198949&r1=1198948&r2=1198949&view=diff
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/QualityHelper.java (original)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/http/QualityHelper.java Mon Nov 7 21:31:52 2011
@@ -20,6 +20,8 @@ package org.apache.abdera2.common.http;
import java.io.Serializable;
import java.util.Arrays;
+import org.apache.abdera2.common.misc.MoreFunctions;
+
import com.google.common.base.Function;
public final class QualityHelper {
@@ -59,13 +61,8 @@ public final class QualityHelper {
}
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- long temp;
- temp = Double.doubleToLongBits(qvalue);
- result = prime * result + (int) (temp ^ (temp >>> 32));
- result = prime * result + ((token == null) ? 0 : token.hashCode());
- return result;
+ return MoreFunctions.genHashCode(
+ 1, qvalue, token);
}
@Override
public boolean equals(Object obj) {