CurvePolygon.java

package org.cugos.wkg;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * A CurvePolygon is Surface made up of Curves.
 * @author Jared Erickson
 */
public class CurvePolygon extends Surface {

    /**
     * The outer Curve
     */
    private final Curve outerCurve;

    /**
     * The List of inner Curves
     */
    private final List<Curve> innerCurves;

    /**
     * Create a new CurvePolygon
     * @param outerCurve The outer Curve
     * @param innerCurves The List of inner Curves
     * @param dimension The Dimension
     * @param srid The SRID
     */
    public CurvePolygon(Curve outerCurve, List<Curve> innerCurves, Dimension dimension, String srid) {
        super(dimension, srid);
        this.outerCurve = outerCurve;
        this.innerCurves = Collections.unmodifiableList(innerCurves);
    }

    /**
     * Create a new CurvePolygon
     * @param outerCurve The outer Curve
     * @param innerCurves The List of inner Curves
     * @param dimension The Dimension
     */
    public CurvePolygon(Curve outerCurve, List<Curve> innerCurves, Dimension dimension) {
        this(outerCurve, innerCurves, dimension, null);
    }

    /**
     * Get the outer Curve
     * @return The outer Curve
     */
    public Curve getOuterCurve() {
        return outerCurve;
    }

    /**
     * Get the List of inner Curves
     * @return The List of inner Curves
     */
    public List<Curve> getInnerCurves() {
        return innerCurves;
    }

    @Override
    public boolean isEmpty() {
        return outerCurve == null | outerCurve.isEmpty();
    }

    @Override
    public int getNumberOfCoordinates() {
        int numberOfCoordinates = outerCurve.getNumberOfCoordinates();
        for(Curve curve : innerCurves) {
            numberOfCoordinates += curve.getNumberOfCoordinates();
        }
        return numberOfCoordinates;
    }

    @Override
    public List<Coordinate> getCoordinates() {
        List<Coordinate> coordinates = new ArrayList<Coordinate>();
        coordinates.addAll(outerCurve.getCoordinates());
        for(Curve curve : innerCurves) {
            coordinates.addAll(curve.getCoordinates());
        }
        return Collections.unmodifiableList(coordinates);
    }

    /**
     * Create an empty CurvePolygon
     * @return An empty CurvePolygon
     */
    public static CurvePolygon createEmpty() {
        return new CurvePolygon(
                new CircularString(new ArrayList<Coordinate>(), Dimension.Two, null),
                new ArrayList<Curve>(),
                Dimension.Two, null);
    }
}