Merge pull request #6 from jasnell/20140417-generalimprovements

Mostly javadoc improvements. A few minor api tweaks as well.
This commit is contained in:
James M Snell 2014-04-17 14:42:39 -07:00
commit eb6a561e5c
32 changed files with 1175 additions and 13 deletions

View File

@ -30,6 +30,11 @@ import com.ibm.common.activitystreams.ASObject;
/** /**
* Represents an Activity Streams 1.0 style position object * Represents an Activity Streams 1.0 style position object
* see (https://github.com/activitystreams/activity-schema/blob/master/activity-schema.md)
*
* Use of the AS1Position object is deprecated. Use the GeoJSON mechanisms
* instead
*
* @author james * @author james
* @deprecated Use Position * @deprecated Use Position
*/ */
@ -43,14 +48,29 @@ public final class AS1Position
objectType("position"); objectType("position");
} }
/**
* Set the latitude
* @param latitude float
* @return Builder
*/
public Builder latitude(float latitude) { public Builder latitude(float latitude) {
return set("latitude", max(0f,min(90.0f,latitude))); return set("latitude", max(0f,min(90.0f,latitude)));
} }
/**
* Set the longitude
* @param longitude float
* @return Builder
*/
public Builder longitude(float longitude) { public Builder longitude(float longitude) {
return set("longitude", max(-180.0f,min(180.0f,longitude))); return set("longitude", max(-180.0f,min(180.0f,longitude)));
} }
/**
* Set the altitude
* @param altitude float
* @return Builder
*/
public Builder altitude(float altitude) { public Builder altitude(float altitude) {
return set("altitude", altitude); return set("altitude", altitude);
} }
@ -66,18 +86,33 @@ public final class AS1Position
super(builder); super(builder);
} }
/**
* Get the latitude
* @return float
*/
public float latitude() { public float latitude() {
return max(0f,min(90.0f,getFloat("latitude"))); return max(0f,min(90.0f,getFloat("latitude")));
} }
/**
* Get the longitude
* @return float
*/
public float longitude() { public float longitude() {
return max(-180.0f,min(180.0f,getFloat("longitude"))); return max(-180.0f,min(180.0f,getFloat("longitude")));
} }
/**
* Get the altitude. If the altitude property is not set, this
* will return Float.MIN_VALUE;
* @return float
*/
public float altitude() { public float altitude() {
return getFloat("altitude"); return getFloat("altitude", Float.MIN_VALUE);
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -25,6 +25,14 @@ import java.io.ObjectStreamException;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* A simple non-GeoJSON Address object modelled after the
* legacy Activity Streams 1.0 Address object
* (see https://github.com/activitystreams/activity-schema/blob/master/activity-schema.md)
*
* @author james
*
*/
public final class Address public final class Address
extends ASObject { extends ASObject {
@ -35,30 +43,65 @@ public final class Address
objectType("address"); objectType("address");
} }
/**
* The full mailing address formatted for display or use
* with a printed mailing label.
* @param formatted String
* @return Builder
*/
public Builder formatted(String formatted) { public Builder formatted(String formatted) {
return set("formatted", formatted); return set("formatted", formatted);
} }
/**
* The street address including house number, street name, P.O. Box,
* apartment or unit number and extended multi-line address information.
* @param streetAddress String
* @return Builder
*/
public Builder streetAddress(String streetAddress) { public Builder streetAddress(String streetAddress) {
return set("streetAddress", streetAddress); return set("streetAddress", streetAddress);
} }
/**
* The city or locality
* @param locality String
* @return Builder
*/
public Builder locality(String locality) { public Builder locality(String locality) {
return set("locality", locality); return set("locality", locality);
} }
/**
* The state or region
* @param region String
* @return Builder
*/
public Builder region(String region) { public Builder region(String region) {
return set("region", region); return set("region", region);
} }
/**
* The zip or postal code
* @param postalCode String
* @return Builder
*/
public Builder postalCode(String postalCode) { public Builder postalCode(String postalCode) {
return set("postalCode", postalCode); return set("postalCode", postalCode);
} }
/**
* The country name component
* @param country String
* @return Builder
*/
public Builder country(String country) { public Builder country(String country) {
return set("country", country); return set("country", country);
} }
/**
* Get the completed Address object
*/
@Override @Override
public Address get() { public Address get() {
return new Address(this); return new Address(this);
@ -70,30 +113,58 @@ public final class Address
super(builder); super(builder);
} }
/**
* The full mailing address formatted for display or use
* with a printed mailing label.
* @return String
*/
public String formatted() { public String formatted() {
return getString("formatted"); return getString("formatted");
} }
/**
* The street address including house number, street name, P.O. Box,
* apartment or unit number and extended multi-line address information.
* @return String
*/
public String streetAddress() { public String streetAddress() {
return getString("streetAddress"); return getString("streetAddress");
} }
/**
* The city or locality
* @return String
*/
public String locality() { public String locality() {
return getString("locality"); return getString("locality");
} }
/**
* The state or region
* @return String
*/
public String region() { public String region() {
return getString("region"); return getString("region");
} }
/**
* The zip or postal code
* @return String
*/
public String postalCode() { public String postalCode() {
return getString("postalCode"); return getString("postalCode");
} }
/**
* The country name component
* @return String
*/
public String country() { public String country() {
return getString("country"); return getString("country");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -31,6 +31,10 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
/**
* A GeoJSON Bounding Box (see http://geojson.org/geojson-spec.html#bounding-boxes)
* @author james
*/
public final class BoundingBox public final class BoundingBox
implements Iterable<Float>, Serializable { implements Iterable<Float>, Serializable {
@ -114,6 +118,11 @@ public final class BoundingBox
zset.build()); zset.build());
} }
/**
* Calculate the Bounding Box for a collection of Polygon objects
* @param polygons Iterable&ltPolygon>
* @return BoundingBox
*/
public static BoundingBox calculateBoundingBoxPolygons(Iterable<Polygon> polygons) { public static BoundingBox calculateBoundingBoxPolygons(Iterable<Polygon> polygons) {
ImmutableSortedSet.Builder<Float> xset = ImmutableSortedSet.Builder<Float> xset =
ImmutableSortedSet.naturalOrder(); ImmutableSortedSet.naturalOrder();

View File

@ -30,6 +30,11 @@ import com.google.common.base.Objects;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
/**
* A GeoJSON Coordinate Reference System description
* see http://geojson.org/geojson-spec.html#coordinate-reference-system-objects
* @author james
*/
public final class CRS public final class CRS
implements Iterable<String>, Serializable { implements Iterable<String>, Serializable {

View File

@ -30,6 +30,11 @@ import java.util.Map;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
/**
* A GeoJSON Feature Object
* see http://geojson.org/geojson-spec.html#feature-objects
* @author james
*/
public final class Feature public final class Feature
extends GeoObject<Feature> extends GeoObject<Feature>
implements Iterable<String> { implements Iterable<String> {

View File

@ -30,6 +30,12 @@ import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
/**
* A GeoJSON FeatureCollection object
* see http://geojson.org/geojson-spec.html#feature-collection-objects
* @author james
*
*/
public final class FeatureCollection public final class FeatureCollection
extends GeoObject<FeatureCollection> extends GeoObject<FeatureCollection>
implements Iterable<Feature> { implements Iterable<Feature> {

View File

@ -21,6 +21,11 @@
*/ */
package com.ibm.common.geojson; package com.ibm.common.geojson;
/**
* Makers for the various GeoJSON object types
* @author james
*
*/
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public final class GeoMakers { public final class GeoMakers {

View File

@ -30,6 +30,13 @@ import com.google.common.base.Supplier;
import static com.google.common.collect.ImmutableMap.copyOf; import static com.google.common.collect.ImmutableMap.copyOf;
import static com.google.common.collect.Maps.newLinkedHashMap; import static com.google.common.collect.Maps.newLinkedHashMap;
/**
* The base class for all GeoJSON objects. The type of object is identified
* by the type() property.
* @author james
*
* @param <G>
*/
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public abstract class GeoObject<G extends GeoObject<G>> public abstract class GeoObject<G extends GeoObject<G>>
implements Serializable { implements Serializable {
@ -57,29 +64,60 @@ public abstract class GeoObject<G extends GeoObject<G>>
protected Map<String,Object> data = protected Map<String,Object> data =
newLinkedHashMap(); newLinkedHashMap();
/**
* Auto-calculate the bounding box when the object is created
* @return Builder
*/
public B calculateBoundingBox() { public B calculateBoundingBox() {
this.withBoundingBox = true; this.withBoundingBox = true;
return (B)this; return (B)this;
} }
/**
* Use the given object as a template when creating this one
* @param geo GeObject&lt;?>
* @return Builder
*/
protected B from(GeoObject<?> geo) { protected B from(GeoObject<?> geo) {
data.putAll(geo.data); data.putAll(geo.data);
return (B)this; return (B)this;
} }
/**
* Set the object type
* @param type Type
* @return Builder
*/
public B type(Type type) { public B type(Type type) {
this.type = type; this.type = type;
return (B)this; return (B)this;
} }
/**
* Set the CRS
* @param crs CRS
* @return Builder
*/
public B crs(CRS crs) { public B crs(CRS crs) {
return set("crs", crs); return set("crs", crs);
} }
/**
* Set the bounding box explicitly
* @param bbox BoundingBox
* @return Builder
* @see GeoObject.Builder.calculateBoundingBox()
*/
public B boundingBox(BoundingBox bbox) { public B boundingBox(BoundingBox bbox) {
return set("bbox", bbox); return set("bbox", bbox);
} }
/**
* Set an additional property on this object
* @param name String
* @param val Object
* @return Builder
*/
public B set(String name, Object val) { public B set(String name, Object val) {
if (val != null) if (val != null)
this.data.put(name,val); this.data.put(name,val);
@ -88,6 +126,9 @@ public abstract class GeoObject<G extends GeoObject<G>>
return (B)this; return (B)this;
} }
/**
* Get the built object
*/
public final G get() { public final G get() {
preGet(); preGet();
G g = doGet(); G g = doGet();
@ -107,6 +148,10 @@ public abstract class GeoObject<G extends GeoObject<G>>
this.data = copyOf(builder.data); this.data = copyOf(builder.data);
} }
/**
* Return the type of object
* @return Type
*/
public Type type() { public Type type() {
return type; return type;
} }
@ -124,14 +169,26 @@ public abstract class GeoObject<G extends GeoObject<G>>
return data.containsKey(name); return data.containsKey(name);
} }
/**
* Return the CRS for this object
* @return CRS
*/
public CRS crs() { public CRS crs() {
return this.<CRS>get("crs", null); return this.<CRS>get("crs", null);
} }
/**
* Return the bounding box for this object
* @return BoundingBox
*/
public BoundingBox boundingBox() { public BoundingBox boundingBox() {
return this.<BoundingBox>get("bbox", null); return this.<BoundingBox>get("bbox", null);
} }
/**
* Return a copy of this object with a calculated bounding box
* @return G (a copy of this object)
*/
public final G withBoundingBox() { public final G withBoundingBox() {
return has("bbox") ? return has("bbox") ?
(G)this : makeWithBoundingBox(); (G)this : makeWithBoundingBox();

View File

@ -29,6 +29,12 @@ import java.util.Iterator;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
/**
* A GeoJSON GeometryCollection object
* see http://geojson.org/geojson-spec.html#geometry-collection
* @author james
*
*/
public final class GeometryCollection public final class GeometryCollection
extends Geometry<GeometryCollection, Geometry<?,?>> { extends Geometry<GeometryCollection, Geometry<?,?>> {

View File

@ -35,6 +35,34 @@ import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.ibm.common.geojson.Geometry.CoordinateGeometry; import com.ibm.common.geojson.Geometry.CoordinateGeometry;
/**
* A GeoJSON LineString object
* See http://geojson.org/geojson-spec.html#linestring.
*
* The LineString can optionally be a Linear Ring if there are at least four
* positions and the first and last position are equivalent.
*
* <pre>
* LineString regularLineString =
* GeoMakers.linestring()
* .add(1,2)
* .add(2,3)
* .get();
* // includes points (1,2) and (2,3)
*
* LineString linearRing =
* GeoMakers.linestring()
* .linearRing()
* .add(1,2)
* .add(2,3)
* .add(3,4)
* .get()
* // includes points (1,2), (2,3), (3,4) and (1,2)
* </pre>
*
* @author james
*
*/
public final class LineString public final class LineString
extends CoordinateGeometry<LineString,Position,Iterable<Position>> { extends CoordinateGeometry<LineString,Position,Iterable<Position>> {
@ -56,6 +84,10 @@ public final class LineString
type(Type.LINESTRING); type(Type.LINESTRING);
} }
/**
* Specify that this LineString is a linearring
* @return Builder
*/
public Builder linearRing() { public Builder linearRing() {
return linearRing(true); return linearRing(true);
} }
@ -65,6 +97,12 @@ public final class LineString
return this; return this;
} }
/**
* Add one or more positions to this linestring
* @param position Position
* @param positions Position[] optional vararg
* @return Builder
*/
public Builder add(Position position, Position... positions) { public Builder add(Position position, Position... positions) {
this.positions.add(position); this.positions.add(position);
if (positions != null) if (positions != null)
@ -73,19 +111,42 @@ public final class LineString
return this; return this;
} }
/**
* Add a single position to this linestring
* @param x float
* @param y float
* @return Builder
*/
public Builder add(float x, float y) { public Builder add(float x, float y) {
return add(GeoObject.position(x, y)); return add(GeoObject.position(x, y));
} }
/**
* Add a single position to this linestring
* @param position Supplier&lt;Position>
* @return Builder
*/
public Builder add(Supplier<Position> position) { public Builder add(Supplier<Position> position) {
return add(position.get()); return add(position.get());
} }
/**
* Add one or more positions to this linestring
* @param positions Iterable&lt;Position>
* @return Builder
*/
public Builder add(Iterable<Position> positions) { public Builder add(Iterable<Position> positions) {
this.positions.addAll(positions); this.positions.addAll(positions);
return this; return this;
} }
/**
* Add a single position to this linestring
* @param x float
* @param y float
* @param z float
* @return Builder
*/
public Builder add(float x, float y, float z) { public Builder add(float x, float y, float z) {
return add(GeoObject.position(x,y,z)); return add(GeoObject.position(x,y,z));
} }
@ -122,6 +183,10 @@ public final class LineString
} }
@Override @Override
/**
* Get this LineStrings positions
* @return Iterable&lt;Position>
*/
public Iterable<Position> coordinates() { public Iterable<Position> coordinates() {
Iterable<Position> pos = super.coordinates(); Iterable<Position> pos = super.coordinates();
if (!ring) if (!ring)
@ -138,6 +203,9 @@ public final class LineString
return coordinates().iterator(); return coordinates().iterator();
} }
/**
* Return a copy of this linestring with a calculated bounding box
*/
@Override @Override
public LineString makeWithBoundingBox() { public LineString makeWithBoundingBox() {
return new LineString.Builder() return new LineString.Builder()
@ -147,6 +215,8 @@ public final class LineString
.get(); .get();
} }
// Java Serialization support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -30,6 +30,12 @@ import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.ibm.common.geojson.Geometry.CoordinateGeometry; import com.ibm.common.geojson.Geometry.CoordinateGeometry;
/**
* A GeoJSON MultiLineString object
* see http://geojson.org/geojson-spec.html#multilinestring
* @author james
*
*/
public final class MultiLineString public final class MultiLineString
extends CoordinateGeometry<MultiLineString,LineString,Iterable<LineString>> { extends CoordinateGeometry<MultiLineString,LineString,Iterable<LineString>> {
@ -43,6 +49,12 @@ public final class MultiLineString
type(Type.MULTILINESTRING); type(Type.MULTILINESTRING);
} }
/**
* Add one or more LineStrings
* @param line LineString
* @param lines LineString[] optional vararg
* @return Builder
*/
public Builder add(LineString line, LineString... lines) { public Builder add(LineString line, LineString... lines) {
this.strings.add(line); this.strings.add(line);
if (lines != null) if (lines != null)
@ -51,10 +63,20 @@ public final class MultiLineString
return this; return this;
} }
/**
* Add a single LineString
* @param line Supplier&lt;LineString>
* @return Builder
*/
public Builder add(Supplier<LineString> line) { public Builder add(Supplier<LineString> line) {
return add(line.get()); return add(line.get());
} }
/**
* Add one or more LineStrings
* @param lines Iterable&lt;LineString>
* @return Builder
*/
public Builder add(Iterable<LineString> lines) { public Builder add(Iterable<LineString> lines) {
this.strings.addAll(lines); this.strings.addAll(lines);
return this; return this;
@ -64,6 +86,10 @@ public final class MultiLineString
return new MultiLineString(this); return new MultiLineString(this);
} }
/**
* Get this objects collection of LineStrings
* @return Iterable&lt;LineString>
*/
@Override @Override
protected Iterable<LineString> coordinates() { protected Iterable<LineString> coordinates() {
return strings.build(); return strings.build();
@ -81,6 +107,10 @@ public final class MultiLineString
return coordinates().iterator(); return coordinates().iterator();
} }
/**
* Copy this object with a calculated bounding box
* @return MultiLineString
*/
@Override @Override
protected MultiLineString makeWithBoundingBox() { protected MultiLineString makeWithBoundingBox() {
return new MultiLineString.Builder() return new MultiLineString.Builder()

View File

@ -30,6 +30,12 @@ import com.ibm.common.geojson.Geometry.CoordinateGeometry;
import static com.ibm.common.geojson.BoundingBox.calculateBoundingBoxPositions; import static com.ibm.common.geojson.BoundingBox.calculateBoundingBoxPositions;
/**
* A GeoJSON MultiPoint object
* see http://geojson.org/geojson-spec.html#multipoint
* @author james
*
*/
public final class MultiPoint public final class MultiPoint
extends CoordinateGeometry<MultiPoint,Position,Iterable<Position>> { extends CoordinateGeometry<MultiPoint,Position,Iterable<Position>> {
@ -43,6 +49,12 @@ public final class MultiPoint
type(GeoObject.Type.MULTIPOINT); type(GeoObject.Type.MULTIPOINT);
} }
/**
* Add one or more positions
* @param position Position
* @param positions Position[] optional vararg
* @return Builder
*/
public Builder add(Position position, Position... positions) { public Builder add(Position position, Position... positions) {
list.add(position); list.add(position);
if (positions != null) if (positions != null)
@ -50,19 +62,42 @@ public final class MultiPoint
return this; return this;
} }
/**
* Add one or more positions
* @param positions Iterable&lt;Position>
* @return Builder
*/
public Builder add(Iterable<Position> positions) { public Builder add(Iterable<Position> positions) {
list.addAll(positions); list.addAll(positions);
return this; return this;
} }
/**
* Add a position
* @param pos Supplier&lt;Position>
* @return Builder
*/
public Builder add(Supplier<Position> pos) { public Builder add(Supplier<Position> pos) {
return add(pos.get()); return add(pos.get());
} }
/**
* Add a position
* @param x float
* @param y float
* @return Builder
*/
public Builder add(float x, float y) { public Builder add(float x, float y) {
return add(GeoObject.position(x, y)); return add(GeoObject.position(x, y));
} }
/**
* Add a position
* @param x float
* @param y float
* @param z float
* @return Builder
*/
public Builder add(float x, float y, float z) { public Builder add(float x, float y, float z) {
return add(GeoObject.position(x,y,z)); return add(GeoObject.position(x,y,z));
} }
@ -89,6 +124,10 @@ public final class MultiPoint
return coordinates().iterator(); return coordinates().iterator();
} }
/**
* Return a copy of this object with a calculated bounding box
* @return MultiPoint
*/
@Override @Override
protected MultiPoint makeWithBoundingBox() { protected MultiPoint makeWithBoundingBox() {
return new MultiPoint.Builder() return new MultiPoint.Builder()

View File

@ -30,6 +30,12 @@ import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.ibm.common.geojson.Geometry.CoordinateGeometry; import com.ibm.common.geojson.Geometry.CoordinateGeometry;
/**
* A GeoJSON MultiPolygon object.
* see http://geojson.org/geojson-spec.html#multipolygon
* @author james
*
*/
public final class MultiPolygon public final class MultiPolygon
extends CoordinateGeometry<MultiPolygon, Polygon, Iterable<Polygon>>{ extends CoordinateGeometry<MultiPolygon, Polygon, Iterable<Polygon>>{
@ -43,6 +49,12 @@ public final class MultiPolygon
type(Type.MULTIPOLYGON); type(Type.MULTIPOLYGON);
} }
/**
* Add one or more Polygons
* @param poly Polygon
* @param polys Polygon[] optional vararg
* @return Builder
*/
public Builder add(Polygon poly, Polygon... polys) { public Builder add(Polygon poly, Polygon... polys) {
// TODO: Check hole requirement // TODO: Check hole requirement
this.strings.add(poly); this.strings.add(poly);
@ -52,10 +64,20 @@ public final class MultiPolygon
return this; return this;
} }
/**
* Add a Polygon
* @param poly Supplier&lt;Polygon>
* @return Builder
*/
public Builder add(Supplier<Polygon> poly) { public Builder add(Supplier<Polygon> poly) {
return add(poly.get()); return add(poly.get());
} }
/**
* Add one ore more Polygons
* @param polygons Iterable&lt;Polygon>
* @return Builder
*/
public Builder add(Iterable<Polygon> polygons) { public Builder add(Iterable<Polygon> polygons) {
this.strings.addAll(polygons); this.strings.addAll(polygons);
return this; return this;
@ -82,6 +104,10 @@ public final class MultiPolygon
return coordinates().iterator(); return coordinates().iterator();
} }
/**
* Return a copy of this object with a calculated bounding box
* @return MultiPolygon
*/
@Override @Override
protected MultiPolygon makeWithBoundingBox() { protected MultiPolygon makeWithBoundingBox() {
return new MultiPolygon.Builder() return new MultiPolygon.Builder()

View File

@ -26,6 +26,15 @@ import java.io.ObjectStreamException;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* A legacy Activity Streams 1.0 Place object
* see https://github.com/activitystreams/activity-schema/blob/master/activity-schema.md.
*
* Place objects have additional address, position and geo properties that
* describe the location.
* @author james
*
*/
public final class Place extends ASObject { public final class Place extends ASObject {
public static final class Builder public static final class Builder
@ -35,25 +44,52 @@ public final class Place extends ASObject {
objectType("place"); objectType("place");
} }
/**
* Set the address
* @param address Address
* @return Builder
*/
public Builder address(Address address) { public Builder address(Address address) {
return set("address", address); return set("address", address);
} }
/**
* Set the address
* @param address Supplier&lt;Address>
* @return Builder
*/
public Builder address(Supplier<Address> address) { public Builder address(Supplier<Address> address) {
return address(address.get()); return address(address.get());
} }
@SuppressWarnings("deprecation") /**
* Set the position
* @deprecated
* @param position AS1Position
* @return Builder
*/
public Builder position(AS1Position position) { public Builder position(AS1Position position) {
return set("position", position); return set("position", position);
} }
@SuppressWarnings("deprecation") /**
* Set the position
* @deprecated
* @param position Supplier&lt;AS1Position>
* @return Builder
*/
public Builder position(Supplier<AS1Position> position) { public Builder position(Supplier<AS1Position> position) {
return position(position.get()); return position(position.get());
} }
@SuppressWarnings("deprecation") /**
* Set the position
* @param latitude float
* @param longitude float
* @param altitude float
* @return Builder
* @deprecated
*/
public Builder position( public Builder position(
float latitude, float latitude,
float longitude, float longitude,
@ -61,10 +97,20 @@ public final class Place extends ASObject {
return position(GeoMakers.as1Position(latitude, longitude, altitude)); return position(GeoMakers.as1Position(latitude, longitude, altitude));
} }
/**
* Set the geo property
* @param geo GeoObject&lt;?> Any GeoJSON object can be used
* @return Builder
*/
public Builder geo(GeoObject<?> geo) { public Builder geo(GeoObject<?> geo) {
return set("geo", geo); return set("geo", geo);
} }
/**
* Set the geo property
* @param geo Supplier&lt;? extends GeoObject&lt;?>> Any GeoJSON object can be used
* @return Builder
*/
public Builder geo(Supplier<? extends GeoObject<?>> geo) { public Builder geo(Supplier<? extends GeoObject<?>> geo) {
return geo(geo.get()); return geo(geo.get());
} }
@ -80,15 +126,27 @@ public final class Place extends ASObject {
super(builder); super(builder);
} }
/**
* Get the address
* @return Address
*/
public Address address() { public Address address() {
return this.<Address>get("address"); return this.<Address>get("address");
} }
@SuppressWarnings("deprecation") /**
* Get the position
* @deprecated
* @return AS1Position
*/
public AS1Position position() { public AS1Position position() {
return this.<AS1Position>get("position"); return this.<AS1Position>get("position");
} }
/**
* Get the geo property
* @return &lt;G extends GeoObject&lt;?>>G
*/
public <G extends GeoObject<?>>G geo() { public <G extends GeoObject<?>>G geo() {
return this.<G>get("geo"); return this.<G>get("geo");
} }

View File

@ -31,6 +31,15 @@ import static com.ibm.common.geojson.BoundingBox.calculateBoundingBox;
import com.ibm.common.geojson.Geometry.CoordinateGeometry; import com.ibm.common.geojson.Geometry.CoordinateGeometry;
/**
* A GeoJSON Point object
* see http://geojson.org/geojson-spec.html#point.
*
* A Point object represents a single Position
*
* @author james
*
*/
public final class Point public final class Point
extends CoordinateGeometry<Point,Position,Position> { extends CoordinateGeometry<Point,Position,Position> {
@ -43,21 +52,44 @@ public final class Point
type(GeoObject.Type.POINT); type(GeoObject.Type.POINT);
} }
public Builder position(float x, float y, float z) { /**
this.position = GeoObject.position(x, y, z); * Set the position
* @param northing float
* @param easting float
* @param altitude float
* @return Builder
*/
public Builder position(float northing, float easting, float altitude) {
this.position = GeoObject.position(northing, easting, altitude);
return this; return this;
} }
public Builder position(float x, float y) { /**
this.position = GeoObject.position(x,y); * Set the position
* @param northing float
* @param easting float
* @return Builder
*/
public Builder position(float northing, float easting) {
this.position = GeoObject.position(northing,easting);
return this; return this;
} }
/**
* Set the position
* @param position Position
* @return Builder
*/
public Builder position(Position position) { public Builder position(Position position) {
this.position = position; this.position = position;
return this; return this;
} }
/**
* Set the position
* @param position Supplier&lt;Position>
* @return Builder
*/
public Builder position(Supplier<Position> position) { public Builder position(Supplier<Position> position) {
return position(position.get()); return position(position.get());
} }

View File

@ -31,6 +31,12 @@ import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.ibm.common.geojson.Geometry.CoordinateGeometry; import com.ibm.common.geojson.Geometry.CoordinateGeometry;
/**
* A GeoJSON Polygon object
* see http://geojson.org/geojson-spec.html#polygon
* @author james
*
*/
public final class Polygon public final class Polygon
extends CoordinateGeometry<Polygon,LineString, Iterable<LineString>> { extends CoordinateGeometry<Polygon,LineString, Iterable<LineString>> {
@ -44,6 +50,12 @@ public final class Polygon
type(Type.POLYGON); type(Type.POLYGON);
} }
/**
* Add one or more LineStrings
* @param line LineString
* @param lines LineString[] optional vararg
* @return Builder
*/
public Builder add(LineString line, LineString... lines) { public Builder add(LineString line, LineString... lines) {
checkArgument(line.linearRing(), "Polygon coordinates MUST be Linear Rings"); checkArgument(line.linearRing(), "Polygon coordinates MUST be Linear Rings");
// TODO: Check hole requirement // TODO: Check hole requirement
@ -54,10 +66,20 @@ public final class Polygon
return this; return this;
} }
/**
* Add a LineString
* @param line Supplier&lt;LineString>
* @return Builder
*/
public Builder add(Supplier<LineString> line) { public Builder add(Supplier<LineString> line) {
return add(line.get()); return add(line.get());
} }
/**
* Add one or more LineStrings
* @param lines Iterable&lt;LineString>
* @return Builder
*/
public Builder add(Iterable<LineString> lines) { public Builder add(Iterable<LineString> lines) {
this.strings.addAll(lines); this.strings.addAll(lines);
return this; return this;

View File

@ -33,6 +33,16 @@ import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Floats; import com.google.common.primitives.Floats;
/**
* A GeoJSON Position
* see http://geojson.org/geojson-spec.html#positions.
*
* Position objects consist primarily of three distinct values:
* a northing (latitude or x), easting (longitude or y) and altitude (z).
*
* @author james
*
*/
public final class Position public final class Position
implements Iterable<Float>, Serializable { implements Iterable<Float>, Serializable {

View File

@ -32,6 +32,21 @@ import com.ibm.common.geojson.Address;
import com.ibm.common.geojson.GeoObject; import com.ibm.common.geojson.GeoObject;
import com.ibm.common.geojson.Place; import com.ibm.common.geojson.Place;
/**
* Enables the use of the GeoJSON extensions with Activity Streams 2.0
*
* <pre>
* import com.ibm.common.geojson.as2.GeoModule;
* import com.ibm.common.activitystreams.IO;
*
* //...
*
* IO io = IO.makeDefault(GeoModule.instance);
*
* </pre>
* @author james
*
*/
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public final class GeoModule public final class GeoModule
implements Module { implements Module {

View File

@ -26,24 +26,50 @@ import java.io.ObjectStreamException;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* For the legacy "audio" and "video" objectTypes. These have
* a String "embedCode" property whose value specifies a
* snippet of HTML for embedding the resource and a stream
* MediaLink property.
*
* @author james
*/
public final class AudioVisual public final class AudioVisual
extends ASObject { extends ASObject {
public static final class Builder public static final class Builder
extends ASObject.AbstractBuilder<AudioVisual,Builder> { extends ASObject.AbstractBuilder<AudioVisual,Builder> {
/**
* Set the embedCode
* @param embed String
* @return Builder
*/
public Builder embedCode(String embed) { public Builder embedCode(String embed) {
return set("embedCode", embed); return set("embedCode", embed);
} }
/**
* Set the stream MediaLink
* @param mediaLink MediaLink
* @return Builder
*/
public Builder stream(MediaLink mediaLink) { public Builder stream(MediaLink mediaLink) {
return set("stream", mediaLink); return set("stream", mediaLink);
} }
/**
* Set the stream MediaLink
* @param mediaLink Supplier&lt;MediaLink>
* @return Builder
*/
public Builder stream(Supplier<? extends MediaLink> mediaLink) { public Builder stream(Supplier<? extends MediaLink> mediaLink) {
return stream(mediaLink.get()); return stream(mediaLink.get());
} }
/**
* Get the built AudioVisual object
*/
public AudioVisual get() { public AudioVisual get() {
return new AudioVisual(this); return new AudioVisual(this);
} }
@ -54,14 +80,24 @@ public final class AudioVisual
super(builder); super(builder);
} }
/**
* Get the embedCode property. This should be a snippet of HTML
* @return String
*/
public String embedCode() { public String embedCode() {
return getString("embedCode"); return getString("embedCode");
} }
/**
* Get the stream MediaLink or null if not provided
* @return MediaLink
*/
public MediaLink stream() { public MediaLink stream() {
return this.<MediaLink>get("stream"); return this.<MediaLink>get("stream");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -35,6 +35,22 @@ import com.google.common.io.BaseEncoding;
import com.google.common.net.MediaType; import com.google.common.net.MediaType;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* The legacy "binary" objectType.
*
* <pre>
* InputStream in = ...
* // will base64 encode, gzip compress and md5 sum the input data
* // will also set the length property accordingly
* Binary binary =
* LegacyMakers.binary()
* .gzipData(in)
* .get();
* </pre>
*
* @author james
*
*/
public final class Binary public final class Binary
extends ASObject { extends ASObject {
@ -45,20 +61,48 @@ public final class Binary
objectType("binary"); objectType("binary");
} }
/**
* Set the input data without any compression. Will automatically
* set calculate the md5 sum and length properties
* @param in InputStream
* @return Builder
* @throws IOException
*/
public Builder data( public Builder data(
InputStream in) InputStream in)
throws IOException { throws IOException {
return data(in,null); return data(in,null);
} }
/**
* Set the input data with GZip compression. Will automatically
* set calculate the md5 sum and length properties
* @param in InputStream
* @return Builder
* @throws IOException
*/
public Builder gzipData(InputStream in) throws IOException { public Builder gzipData(InputStream in) throws IOException {
return data(in, Compression.GZipCompression); return data(in, Compression.GZipCompression);
} }
/**
* Set the input data with Deflate compression. Will automatically
* set calculate the md5 sum and length properties
* @param in InputStream
* @return Builder
* @throws IOException
*/
public Builder deflateData(InputStream in) throws IOException { public Builder deflateData(InputStream in) throws IOException {
return data(in, Compression.DeflateCompression); return data(in, Compression.DeflateCompression);
} }
/**
* Set the input data the given Compression. Will automatically
* set calculate the md5 sum and length properties
* @param in InputStream
* @return Builder
* @throws IOException
*/
public Builder data( public Builder data(
InputStream in, InputStream in,
Compression<?,?> compression) Compression<?,?> compression)
@ -88,19 +132,40 @@ public final class Binary
return set("data",writer.toString()); return set("data",writer.toString());
} }
/**
* Manually set the md5 properties (this is not recommended. calling the data
* methods will automatically generate the md5 checksum for you)
*
* @param md5 String
* @return Builder
*/
public Builder md5(String md5) { public Builder md5(String md5) {
return set("md5", md5); return set("md5", md5);
} }
/**
* Set the fileUrl property
* @param fileUrl String
* @return Builder
*/
public Builder fileUrl(String fileUrl) { public Builder fileUrl(String fileUrl) {
return set("fileUrl", fileUrl); return set("fileUrl", fileUrl);
} }
/**
* Set the MIME Media Type using the Legacy "mimeType" property name
* rather than the AS 2.0 "mediaType" property name
* @param mt MediaType
* @return Builder
*/
@Override @Override
public Builder mediaType(MediaType mt) { public Builder mediaType(MediaType mt) {
return set("mimeType", mt); return set("mimeType", mt);
} }
/**
* Get the built Binary object
*/
public Binary get() { public Binary get() {
return new Binary(this); return new Binary(this);
} }
@ -111,34 +176,69 @@ public final class Binary
super(builder); super(builder);
} }
/**
* Get the fileUrl property
* @return String
*/
public String fileUrl() { public String fileUrl() {
return getString("fileUrl"); return getString("fileUrl");
} }
/**
* Get the length property
* @return long
*/
public long length() { public long length() {
return getLong("length"); return getLong("length");
} }
/**
* Get the compression property value (typically "gzip" or "deflate")
* @return String
*/
public String compression() { public String compression() {
return getString("compression"); return getString("compression");
} }
/**
* True if compression = gzip
* @return boolean
*/
public boolean isGzip() { public boolean isGzip() {
return "gzip".equalsIgnoreCase(compression()); return "gzip".equalsIgnoreCase(compression());
} }
/**
* True if compression = deflate
* @return boolean
*/
public boolean isDeflate() { public boolean isDeflate() {
return "deflate".equalsIgnoreCase(compression()); return "deflate".equalsIgnoreCase(compression());
} }
/**
* Return the md5 checksum
* @return String
*/
public String md5() { public String md5() {
return getString("md5"); return getString("md5");
} }
/**
* Return the literal string content of the data property.
* This will be base64 encoded and optionally compressed
* @return String
*/
public String data() { public String data() {
return getString("data"); return getString("data");
} }
/**
* Return an InputStream for reading the data. Will
* decompress and base64 decode as necessary
* @return InputStream
* @throws IOException
*/
public InputStream read() throws IOException { public InputStream read() throws IOException {
Compression<?,?> compression = Compression<?,?> compression =
isGzip() ? Compression.GZipCompression : isGzip() ? Compression.GZipCompression :
@ -147,6 +247,12 @@ public final class Binary
return read(compression); return read(compression);
} }
/**
* Return an InputStream for reading the data
* @param compression Compression
* @return InputStream
* @throws IOException
*/
public InputStream read(Compression<?,?> compression) throws IOException { public InputStream read(Compression<?,?> compression) throws IOException {
StringReader reader = new StringReader(data()); StringReader reader = new StringReader(data());
InputStream in = BaseEncoding.base64Url().decodingStream(reader); InputStream in = BaseEncoding.base64Url().decodingStream(reader);
@ -157,11 +263,17 @@ public final class Binary
return in; return in;
} }
/**
* Return the MIME MediaType using the legacy "mimeType" property name
* rather than the AS 2.0 "mediaType" name
*/
@Override @Override
public MediaType mediaType() { public MediaType mediaType() {
return this.<MediaType>get("mimeType"); return this.<MediaType>get("mimeType");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -25,6 +25,10 @@ import java.io.ObjectStreamException;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* The legacy "bookmark" objectType
* @author james
*/
public class Bookmark public class Bookmark
extends ASObject { extends ASObject {
@ -35,10 +39,18 @@ public class Bookmark
objectType("bookmark"); objectType("bookmark");
} }
/**
* Set the targetUrl property
* @param url String
* @return Builder
*/
public Builder targetUrl(String url) { public Builder targetUrl(String url) {
return set("targetUrl", url); return set("targetUrl", url);
} }
/**
* Get the built Bookmark object
*/
public Bookmark get() { public Bookmark get() {
return new Bookmark(this); return new Bookmark(this);
} }
@ -49,10 +61,16 @@ public class Bookmark
super(builder); super(builder);
} }
/**
* Get the targetUrl property
* @return String
*/
public String targetUrl() { public String targetUrl() {
return getString("targetUrl"); return getString("targetUrl");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -29,6 +29,13 @@ import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
/**
* Compression utility for use with the Binary object
* @author james
*
* @param &lt;O extends OutputStream>
* @param &lt;I extends InputStream>
*/
public interface Compression<O extends OutputStream, I extends InputStream> { public interface Compression<O extends OutputStream, I extends InputStream> {
String label(); String label();
O compressor(OutputStream wrap) throws IOException; O compressor(OutputStream wrap) throws IOException;

View File

@ -27,6 +27,10 @@ import com.google.common.base.Supplier;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
import com.ibm.common.activitystreams.Collection; import com.ibm.common.activitystreams.Collection;
/**
* The legacy "event" objectType
* @author james
*/
public class Event public class Event
extends ASObject { extends ASObject {
@ -37,54 +41,118 @@ public class Event
objectType("event"); objectType("event");
} }
/**
* Set the attendedBy Collection property
* @param collection Collection
* @return Builder
*/
public Builder attendedBy(Collection collection) { public Builder attendedBy(Collection collection) {
return set("attendedBy", collection); return set("attendedBy", collection);
} }
/**
* Set the attendedBy Collection property
* @param collection Collection
* @return Builder
*/
public Builder attendedBy(Supplier<? extends Collection> collection) { public Builder attendedBy(Supplier<? extends Collection> collection) {
return attendedBy(collection.get()); return attendedBy(collection.get());
} }
/**
* Set the attending Collection property
* @param collection Collection
* @return Builder
*/
public Builder attending(Collection collection) { public Builder attending(Collection collection) {
return set("attending", collection); return set("attending", collection);
} }
/**
* Set the attending Collection property
* @param collection Collection
* @return Builder
*/
public Builder attending(Supplier<? extends Collection> collection) { public Builder attending(Supplier<? extends Collection> collection) {
return attending(collection.get()); return attending(collection.get());
} }
/**
* Set the invited Collection property
* @param collection Collection
* @return Builder
*/
public Builder invited(Collection collection) { public Builder invited(Collection collection) {
return set("invited", collection); return set("invited", collection);
} }
/**
* Set the invited Collection property
* @param collection Collection
* @return Builder
*/
public Builder invited(Supplier<? extends Collection> collection) { public Builder invited(Supplier<? extends Collection> collection) {
return invited(collection.get()); return invited(collection.get());
} }
/**
* Set the maybeAttending Collection property
* @param collection Collection
* @return Builder
*/
public Builder maybeAttending(Collection collection) { public Builder maybeAttending(Collection collection) {
return set("maybeAttending", collection); return set("maybeAttending", collection);
} }
/**
* Set the maybeAttending Collection property
* @param collection Collection
* @return Builder
*/
public Builder maybeAttending(Supplier<? extends Collection> collection) { public Builder maybeAttending(Supplier<? extends Collection> collection) {
return maybeAttending(collection.get()); return maybeAttending(collection.get());
} }
/**
* Set the notAttendedBy Collection property
* @param collection Collection
* @return Builder
*/
public Builder notAttendedBy(Collection collection) { public Builder notAttendedBy(Collection collection) {
return set("notAttendedBy", collection); return set("notAttendedBy", collection);
} }
/**
* Set the notAttendedBy Collection property
* @param collection Collection
* @return Builder
*/
public Builder notAttendedBy(Supplier<? extends Collection> collection) { public Builder notAttendedBy(Supplier<? extends Collection> collection) {
return notAttendedBy(collection.get()); return notAttendedBy(collection.get());
} }
/**
* Set the notAttending Collection property
* @param collection Collection
* @return Builder
*/
public Builder notAttending(Collection collection) { public Builder notAttending(Collection collection) {
return set("notAttending", collection); return set("notAttending", collection);
} }
/**
* Set the notAttending Collection property
* @param collection Collection
* @return Builder
*/
public Builder notAttending(Supplier<? extends Collection> collection) { public Builder notAttending(Supplier<? extends Collection> collection) {
return notAttending(collection.get()); return notAttending(collection.get());
} }
/**
* Get the built Event object
* @return Event
*/
public Event get() { public Event get() {
return new Event(this); return new Event(this);
} }
@ -95,30 +163,56 @@ public class Event
super(builder); super(builder);
} }
/**
* Get the attendedBy Collection or null if not provided
* @return Collection
*/
public Collection attendedBy() { public Collection attendedBy() {
return this.<Collection>get("attendedBy"); return this.<Collection>get("attendedBy");
} }
/**
* Get the attending Collection or null if not provided
* @return Collection
*/
public Collection attending() { public Collection attending() {
return this.<Collection>get("attending"); return this.<Collection>get("attending");
} }
/**
* Get the invited Collection or null if not provided
* @return Collection
*/
public Collection invited() { public Collection invited() {
return this.<Collection>get("invited"); return this.<Collection>get("invited");
} }
/**
* Get the maybeAttending Collection or null if not provided
* @return Collection
*/
public Collection maybeAttending() { public Collection maybeAttending() {
return this.<Collection>get("maybeAttending"); return this.<Collection>get("maybeAttending");
} }
/**
* Get the notAttendedBy Collection or null if not provided
* @return Collection
*/
public Collection notAttendedBy() { public Collection notAttendedBy() {
return this.<Collection>get("notAttendedBy"); return this.<Collection>get("notAttendedBy");
} }
/**
* Get the notAttending Collection or null if not provided
* @return Collection
*/
public Collection notAttending() { public Collection notAttending() {
return this.<Collection>get("notAttending"); return this.<Collection>get("notAttending");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -26,6 +26,10 @@ import java.io.ObjectStreamException;
import com.google.common.net.MediaType; import com.google.common.net.MediaType;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* The legacy "file" objectType
* @author james
*/
public class File public class File
extends ASObject { extends ASObject {
@ -36,15 +40,27 @@ public class File
objectType("file"); objectType("file");
} }
/**
* Set the fileUrl property
* @param url String
* @return Builder
*/
public Builder fileUrl(String url) { public Builder fileUrl(String url) {
return set("fileUrl", url); return set("fileUrl", url);
} }
/**
* Set the MIME mediaType using the legacy "mimeType" property
* name rather than the AS 2.0 "mediaType" property name
*/
@Override @Override
public Builder mediaType(MediaType mt) { public Builder mediaType(MediaType mt) {
return set("mimeType", mt); return set("mimeType", mt);
} }
/**
* Get the built File object
*/
public File get() { public File get() {
return new File(this); return new File(this);
} }
@ -55,15 +71,25 @@ public class File
super(builder); super(builder);
} }
/**
* Get the MIME mediaType using the legacy "mimeType" property
* name rather than the AS 2.0 "mediaType" property
*/
@Override @Override
public MediaType mediaType() { public MediaType mediaType() {
return this.<MediaType>get("mimeType"); return this.<MediaType>get("mimeType");
} }
/**
* Get the fileUrl property
* @return
*/
public String fileUrl() { public String fileUrl() {
return getString("fileUrl"); return getString("fileUrl");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -26,6 +26,11 @@ import java.io.ObjectStreamException;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* The legacy "issue" objectType.
* @author james
*
*/
public class Issue public class Issue
extends ASObject { extends ASObject {
@ -36,6 +41,12 @@ public class Issue
objectType("issue"); objectType("issue");
} }
/**
* Set the "types" property
* @param type String
* @param types String... optional vararg of additional types to set
* @return Builder
*/
public Builder types(String type, String... types) { public Builder types(String type, String... types) {
ImmutableList.Builder<String> list = ImmutableList.Builder<String> list =
ImmutableList.builder(); ImmutableList.builder();
@ -46,10 +57,18 @@ public class Issue
return types(list.build()); return types(list.build());
} }
/**
* Set the "types" property
* @param types Iterable&lt;String>
* @return Builder
*/
public Builder types(Iterable<String> types) { public Builder types(Iterable<String> types) {
return set("types", types); return set("types", types);
} }
/**
* Get the built Issue object
*/
public Issue get() { public Issue get() {
return new Issue(this); return new Issue(this);
} }
@ -60,10 +79,16 @@ public class Issue
super(builder); super(builder);
} }
/**
* Get the listing of types
* @return Iterable&lt;String>
*/
public Iterable<String> types() { public Iterable<String> types() {
return this.<Iterable<String>>get("types"); return this.<Iterable<String>>get("types");
} }
// Java Serialization Support `
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -24,6 +24,10 @@ package com.ibm.common.activitystreams.legacy;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
import static com.ibm.common.activitystreams.Makers.object; import static com.ibm.common.activitystreams.Makers.object;
/**
* Makers for the various Legacy object types
* @author james
*/
public final class LegacyMakers { public final class LegacyMakers {
private LegacyMakers() {} private LegacyMakers() {}

View File

@ -31,7 +31,23 @@ import com.ibm.common.activitystreams.internal.Schema;
import com.ibm.common.activitystreams.internal.Schema.Builder; import com.ibm.common.activitystreams.internal.Schema.Builder;
import com.ibm.common.activitystreams.util.Module; import com.ibm.common.activitystreams.util.Module;
public class LegacyModule /**
* Adds support for legacy objectTypes defined by the original
* Activity Streams 1.0 Schema (see https://github.com/activitystreams/activity-schema/blob/master/activity-schema.md)
*
* <pre>
* import com.ibm.common.activitystreams.IO;
* import com.ibm.common.activitystreams.legacy.LegacyModule;
*
* //...
*
* IO io = IO.makeDefault(LegacyModule.instance);
*
* </pre>
* @author james
*
*/
public final class LegacyModule
implements Module { implements Module {
public static final Module instance = new LegacyModule(); public static final Module instance = new LegacyModule();

View File

@ -31,6 +31,11 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.ibm.common.activitystreams.util.AbstractWritable; import com.ibm.common.activitystreams.util.AbstractWritable;
/**
* An Activity Streams 1.0 Media Link object.
* @author james
*
*/
public final class MediaLink public final class MediaLink
extends AbstractWritable extends AbstractWritable
implements Iterable<String>, Serializable { implements Iterable<String>, Serializable {
@ -42,31 +47,67 @@ public final class MediaLink
private Map<String,Object> map = private Map<String,Object> map =
Maps.newHashMap(); Maps.newHashMap();
/**
* When the media link refers to a video or audio resource,
* the duration property indicates the total length in seconds
* @param duration int
* @return Builder
*/
public Builder duration(int duration) { public Builder duration(int duration) {
map.put("duration", duration); map.put("duration", duration);
return this; return this;
} }
/**
* When the media link refers to an object intended to be
* displayed visually, such as a video or image, the
* height property specifies the display height in terms
* of device independent pixels.
* @param height int
* @return Builder
*/
public Builder height(int height) { public Builder height(int height) {
map.put("height", height); map.put("height", height);
return this; return this;
} }
/**
* When the media link refers to an object intended to be
* displayed visually, such as a video or image, the
* width property specifies the display width in terms
* of device independent pixels.
* @param height int
* @return Builder
*/
public Builder width(int width) { public Builder width(int width) {
map.put("width", width); map.put("width", width);
return this; return this;
} }
/**
* The URL of the resource
* @param url String
* @return Builder
*/
public Builder url(String url) { public Builder url(String url) {
map.put("url", url); map.put("url", url);
return this; return this;
} }
/**
* Set an arbitrary property on the Media Link
* @param key String
* @param val Object
* @return Builder
*/
public Builder set(String key, Object val) { public Builder set(String key, Object val) {
map.put(key,val); map.put(key,val);
return this; return this;
} }
/**
* Get the built MediaLink object
*/
public MediaLink get() { public MediaLink get() {
return new MediaLink(this); return new MediaLink(this);
} }
@ -80,22 +121,50 @@ public final class MediaLink
this.map = ImmutableMap.copyOf(builder.map); this.map = ImmutableMap.copyOf(builder.map);
} }
/**
* Get the url property
* @return
*/
public String url() { public String url() {
return (String)map.get("url"); return (String)map.get("url");
} }
/**
* When the media link refers to a video or audio resource,
* the duration property indicates the total length in seconds
* @return int
*/
public int duration() { public int duration() {
return (Integer)map.get("duration"); return (Integer)map.get("duration");
} }
/**
* When the media link refers to an object intended to be
* displayed visually, such as a video or image, the
* height property specifies the display height in terms
* of device independent pixels.
* @return int
*/
public int height() { public int height() {
return (Integer)map.get("height"); return (Integer)map.get("height");
} }
/**
* When the media link refers to an object intended to be
* displayed visually, such as a video or image, the
* width property specifies the display width in terms
* of device independent pixels.
* @return int
*/
public int width() { public int width() {
return (Integer)map.get("width"); return (Integer)map.get("width");
} }
/**
* Return the given property
* @param key
* @return &lt;T>T
*/
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T>T get(String key) { public <T>T get(String key) {
return (T)map.get(key); return (T)map.get(key);
@ -105,6 +174,8 @@ public final class MediaLink
return map.keySet().iterator(); return map.keySet().iterator();
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -27,19 +27,40 @@ import com.google.common.base.Supplier;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
import com.ibm.common.activitystreams.Collection; import com.ibm.common.activitystreams.Collection;
/**
* For the legacy "role", "group" and "team" objectTypes.
* Membership objects include an additional "members"
* collection property.
*
* @author james
*
*/
public class Membership extends ASObject { public class Membership extends ASObject {
public static final class Builder public static final class Builder
extends ASObject.AbstractBuilder<Membership, Builder> { extends ASObject.AbstractBuilder<Membership, Builder> {
/**
* Set the members collection
* @param collection Collection
* @return Builder
*/
public Builder members(Collection collection) { public Builder members(Collection collection) {
return set("members", collection); return set("members", collection);
} }
/**
* Set the members collection
* @param collection Collection
* @return Builder
*/
public Builder members(Supplier<? extends Collection> collection) { public Builder members(Supplier<? extends Collection> collection) {
return members(collection.get()); return members(collection.get());
} }
/**
* Get the built Membership object
*/
public Membership get() { public Membership get() {
return new Membership(this); return new Membership(this);
} }
@ -50,10 +71,16 @@ public class Membership extends ASObject {
super(builder); super(builder);
} }
/**
* Return the members collection
* @return Collection
*/
public Collection members() { public Collection members() {
return this.<Collection>get("members"); return this.<Collection>get("members");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -28,6 +28,18 @@ import com.google.common.base.Supplier;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
import com.ibm.common.activitystreams.LinkValue; import com.ibm.common.activitystreams.LinkValue;
/**
* The legacy "question" object. Question objects
* have an additional "options" property that lists
* the possible answers to the question.
*
* This implementation varies from the Legacy AS 1.0
* model in that it allows AS 2.0 style LinkValues
* to be used as the value of the options property.
*
* @author james
*
*/
public class Question extends ASObject { public class Question extends ASObject {
public static final class Builder public static final class Builder
@ -37,6 +49,12 @@ public class Question extends ASObject {
objectType("question"); objectType("question");
} }
/**
* Add one or more answers to the question
* @param url String
* @param urls String[] optional vararg
* @return Builder
*/
public Builder option(String url, String... urls) { public Builder option(String url, String... urls) {
if (url != null) if (url != null)
link("options", url); link("options", url);
@ -46,6 +64,12 @@ public class Question extends ASObject {
return this; return this;
} }
/**
* Add one or more answers to the question
* @param url LinkValue
* @param urls LinkValue[] optional vararg
* @return Builder
*/
public Builder option(LinkValue link, LinkValue... links) { public Builder option(LinkValue link, LinkValue... links) {
if (link != null) if (link != null)
link("options", link); link("options", link);
@ -55,10 +79,18 @@ public class Question extends ASObject {
return this; return this;
} }
/**
* Add an answer to the question
* @param link Supplier&lt;? extends LinkValue>
* @return Builder
*/
public Builder option(Supplier<? extends LinkValue> link) { public Builder option(Supplier<? extends LinkValue> link) {
return option(link.get()); return option(link.get());
} }
/**
* Get the built question object
*/
public Question get() { public Question get() {
return new Question(this); return new Question(this);
} }
@ -69,14 +101,25 @@ public class Question extends ASObject {
super(builder); super(builder);
} }
/**
* Get the list of options for the question
* @return Iterable&lt;LinkValue>
*/
public Iterable<LinkValue> options() { public Iterable<LinkValue> options() {
return links("options"); return links("options");
} }
/**
* Get the list of options for the question
* @param filter Predicate&lt;? super LinkValue>
* @return Iterable&lt;LinkValue>
*/
public Iterable<LinkValue> options(Predicate<? super LinkValue> filter) { public Iterable<LinkValue> options(Predicate<? super LinkValue> filter) {
return links("options", filter); return links("options", filter);
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -35,6 +35,12 @@ import com.google.common.base.Supplier;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
import com.ibm.common.activitystreams.LinkValue; import com.ibm.common.activitystreams.LinkValue;
/**
* The Legacy "task" objectType. Task objects in AS 1.0 are essentially
* pending Activity statements.
* @author james
*
*/
public class Task public class Task
extends ASObject { extends ASObject {
@ -45,22 +51,48 @@ public class Task
objectType("task"); objectType("task");
} }
/**
* Set the actor
* @param actor ASObject
* @return Builder
*/
public Builder actor(ASObject actor) { public Builder actor(ASObject actor) {
return set("actor", actor); return set("actor", actor);
} }
/**
* Set the actor
* @param actor Supplier&lt;? extends ASObject>
* @return Builder
*/
public Builder actor(Supplier<? extends ASObject> actor) { public Builder actor(Supplier<? extends ASObject> actor) {
return actor(actor.get()); return actor(actor.get());
} }
/**
* Set the object
* @param object ASObject
* @return Builder
*/
public Builder object(ASObject object) { public Builder object(ASObject object) {
return set("object", object); return set("object", object);
} }
/**
* Set the object
* @param object Supplier&lt;? extends ASObject>
* @return Builder
*/
public Builder object(Supplier<? extends ASObject> object) { public Builder object(Supplier<? extends ASObject> object) {
return object(object.get()); return object(object.get());
} }
/**
* Set one or more prerequisite taskss
* @param task Task
* @param tasks Task[] optional vararg
* @return Builder
*/
public Builder prerequisites(Task task, Task... tasks) { public Builder prerequisites(Task task, Task... tasks) {
if (task != null) if (task != null)
link("prerequisites",task); link("prerequisites",task);
@ -70,10 +102,33 @@ public class Task
return this; return this;
} }
/**
* Set one or more prerequisite tasks
* @param tasks Iterable&lt;Task>
* @return Builder
*/
public Builder prerequisites(Iterable<Task> tasks) {
if (tasks != null)
for (Task task : tasks)
link("prerequisites", task);
return this;
}
/**
* Set an optional prerequisite
* @param task Supplier&lt;? extends Task>
* @return Builder
*/
public Builder prerequisites(Supplier<? extends Task> task) { public Builder prerequisites(Supplier<? extends Task> task) {
return prerequisites(task.get()); return prerequisites(task.get());
} }
/**
* Specify one or more other tasks that this task supersedes
* @param task Task
* @param tasks Task[] optional vararg
* @return Builder
*/
public Builder supersedes(Task task, Task... tasks) { public Builder supersedes(Task task, Task... tasks) {
if (task != null) if (task != null)
link("supersedes",task); link("supersedes",task);
@ -83,46 +138,115 @@ public class Task
return this; return this;
} }
/**
* Specify one or more other tasks that this task supersedes
* @param tasks Iterable&lt;Task>
* @return Builder
*/
public Builder supersedes(Iterable<Task> tasks) {
if (tasks != null)
for (Task task : tasks)
link("supersedes", task);
return this;
}
/**
* Specify a task that this task supersedes
* @param task Supplier&lt;? extends Task>
* @return Builder
*/
public Builder supersedes(Supplier<? extends Task> task) { public Builder supersedes(Supplier<? extends Task> task) {
return supersedes(task.get()); return supersedes(task.get());
} }
/**
* Indicates whether this task is required or not
* @param on boolean
* @return Builder
*/
public Builder required(boolean on) { public Builder required(boolean on) {
return set("required", on); return set("required", on);
} }
/**
* Indicates that this task is required
* @return Builder
*/
public Builder required() { public Builder required() {
return required(true); return required(true);
} }
/**
* Specifies the verb for this task
* @param verb String
* @return Builder
*/
public Builder verb(String verb) { public Builder verb(String verb) {
return set("verb", verb); return set("verb", verb);
} }
/**
* Specifies the due date for this task
* @param dt DateTime
* @return Builder
*/
public Builder by(DateTime dt) { public Builder by(DateTime dt) {
return this._dt("by", dt); return this._dt("by", dt);
} }
/**
* Specifies that this task is due right now
* @return Builder
*/
public Builder byNow() { public Builder byNow() {
return this._dtNow("by"); return this._dtNow("by");
} }
/**
* Specifies the due date for this task in terms of a specific
* duration of time from right now
* @param duration ReadableDuration
* @return Builder
*/
public Builder byFromNow(ReadableDuration duration) { public Builder byFromNow(ReadableDuration duration) {
return this._dtFromNow("by", duration); return this._dtFromNow("by", duration);
} }
/**
* Specifies the due date for this task in terms of a specific
* period of time from right now
* @param period ReadablePeriod
* @return Builder
*/
public Builder byFromNow(ReadablePeriod period) { public Builder byFromNow(ReadablePeriod period) {
return this._dtFromNow("by", period); return this._dtFromNow("by", period);
} }
/**
* Specifies the due date for this task in terms of a specific
* duration of time from the given instant;
* @param dt DateTime
* @param duration ReadableDuration
* @return Builder
*/
public Builder by(DateTime dt, ReadableDuration duration) { public Builder by(DateTime dt, ReadableDuration duration) {
return this._dtFrom("by", dt, duration); return this._dtFrom("by", dt, duration);
} }
/**
* Specifies the due date for this task in terms of a specific
* period of time from the given instant
* @param dt DateTime
* @param period ReadablePeriod
* @return Builder
*/
public Builder by(DateTime dt, ReadablePeriod period) { public Builder by(DateTime dt, ReadablePeriod period) {
return this._dtFrom("by", dt, period); return this._dtFrom("by", dt, period);
} }
/**
* Get the completed Task object
*/
public Task get() { public Task get() {
return new Task(this); return new Task(this);
} }
@ -133,30 +257,62 @@ public class Task
super(builder); super(builder);
} }
/**
* Get the actor
* @return &lt;A extends ASObject>A
*/
public <A extends ASObject>A actor() { public <A extends ASObject>A actor() {
return this.<A>get("actor"); return this.<A>get("actor");
} }
/**
* Get the object
* @return &lt;A extends ASObject>A
*/
public <A extends ASObject>A object() { public <A extends ASObject>A object() {
return this.<A>get("object"); return this.<A>get("object");
} }
/**
* Get the due date
* @return DateTime
*/
public DateTime by() { public DateTime by() {
return getDateTime("by"); return getDateTime("by");
} }
/**
* Get the verb
* @return String
*/
public String verb() { public String verb() {
return getString("verb"); return getString("verb");
} }
/**
* Return true if this task is required
* @return boolean
*/
public boolean required() { public boolean required() {
return getBoolean("required"); return getBoolean("required");
} }
/**
* Return the listing of other tasks superseded by this one
* (will return an empty iterable if there are no superseded
* tasks)
* @return Iterable&lt;Task>
*/
public Iterable<Task> supersedes() { public Iterable<Task> supersedes() {
return transform(links("supersedes",filter), transformer); return transform(links("supersedes",filter), transformer);
} }
/**
* Return the listing of other tasks upon which this task depends.
* (will return an empty iterable if there are no prerequisite
* tasks)
* @return Iterable&lt;Task>
*/
public Iterable<Task> prerequisites() { public Iterable<Task> prerequisites() {
return transform(links("prerequisites",filter), transformer); return transform(links("prerequisites",filter), transformer);
} }
@ -176,6 +332,8 @@ public class Task
}; };
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }

View File

@ -26,15 +26,33 @@ import java.io.ObjectStreamException;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.ibm.common.activitystreams.ASObject; import com.ibm.common.activitystreams.ASObject;
/**
* For the legacy "product" and "image" objectTypes. These
* include an additional "fullImage" property whose value
* is a MediaLink.
*
* @author james
*
*/
public class WithImage extends ASObject { public class WithImage extends ASObject {
public static final class Builder public static final class Builder
extends ASObject.AbstractBuilder<WithImage, Builder> { extends ASObject.AbstractBuilder<WithImage, Builder> {
/**
* Set the fullImage property
* @param link MediaLink
* @return Builder
*/
public Builder fullImage(MediaLink link) { public Builder fullImage(MediaLink link) {
return set("fullImage", link); return set("fullImage", link);
} }
/**
* Set the fullImage property
* @param link Supplier&lt;? extends MediaLink>
* @return Builder
*/
public Builder fullImage(Supplier<? extends MediaLink> link) { public Builder fullImage(Supplier<? extends MediaLink> link) {
return fullImage(link.get()); return fullImage(link.get());
} }
@ -49,10 +67,16 @@ public class WithImage extends ASObject {
super(builder); super(builder);
} }
/**
* Get the fullImage property
* @return MediaLink
*/
public MediaLink fullImage() { public MediaLink fullImage() {
return this.<MediaLink>get("fullImage"); return this.<MediaLink>get("fullImage");
} }
// Java Serialization Support
Object writeReplace() throws java.io.ObjectStreamException { Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this); return new SerializedForm(this);
} }