/**
* Copyright 2013 OpenSocial Foundation
* Copyright 2013 International Business Machines Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Utility library for working with Activity Streams Actions
* Requires underscorejs.
*
* @author James M Snell (jasnell@us.ibm.com)
*/
package com.ibm.common.geojson;
import static com.ibm.common.geojson.BoundingBox.calculateBoundingBoxGeometries;
import java.io.ObjectStreamException;
import java.util.Iterator;
import com.google.common.collect.ImmutableList;
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
extends Geometry<GeometryCollection, Geometry<?,?>> {
public static final class Builder
extends GeoObject.Builder<GeometryCollection, Builder> {
private final ImmutableList.Builder<Geometry<?,?>> list =
ImmutableList.builder();
public Builder() {
type(GeoObject.Type.GEOMETRYCOLLECTION);
}
public Builder add(Geometry<?,?> geometry, Geometry<?,?>... geometries) {
list.add(geometry);
if (geometries != null)
list.add(geometries);
return this;
}
public Builder add(Iterable<Geometry<?,?>> geometries) {
list.addAll(geometries);
return this;
}
@Override
public void preGet() {
set("geometries", list.build());
}
@Override
public GeometryCollection doGet() {
return new GeometryCollection(this);
}
}
GeometryCollection(Builder builder) {
super(builder);
}
public Iterable<Geometry<?,?>> geometries() {
return this.<Iterable<Geometry<?,?>>>get(
"geometries",
ImmutableList.<Geometry<?,?>>of());
}
public int size() {
return Iterables.size(geometries());
}
@SuppressWarnings("unchecked")
public <G extends Geometry<?,?>>G get(int idx) {
return (G)Iterables.get(geometries(),idx);
}
public Iterator<Geometry<?,?>> iterator() {
return geometries().iterator();
}
@Override
public GeometryCollection makeWithBoundingBox() {
return new GeometryCollection.Builder()
.from(this)
.add(this)
.boundingBox(calculateBoundingBoxGeometries(this))
.get();
}
Object writeReplace() throws java.io.ObjectStreamException {
return new SerializedForm(this);
}
private static class SerializedForm
extends AbstractSerializedForm<GeometryCollection,GeometryCollection.Builder> {
private static final long serialVersionUID = -2060301713159936281L;
protected SerializedForm(GeometryCollection obj) {
super(obj);
}
Object readResolve() throws ObjectStreamException {
return doReadResolve();
}
@SuppressWarnings("unchecked")
@Override
protected boolean handle(Builder builder, String key, Object val) {
if ("geometries".equals(key)) {
Iterable<Geometry<?,?>> list = (Iterable<Geometry<?, ?>>) val;
builder.list.addAll(list);
return true;
}
return false;
}
@Override
protected GeometryCollection.Builder builder() {
return GeoMakers.geometryCollection();
}
}
}