Regions.java

package gov.usgs.earthquake.qdm;

import java.util.ArrayList;

/**
 * Set of regions.
 *
 * @author - Alan Jones, 1999.09.10 <br>
 *         2002.01.16: Convert from "regions" directory with above files to
 *         regions.xml file. <br>
 *         2003.01.06: Make class public, add support for non-file input so that
 *         we can read from a JAR, add isDefaultNetID method to check for the
 *         default network (US), add isAuthor method to check if the event is
 *         authoritative
 *
 *         2018-08-21: JMF, reimplement parsing logic outside class. Update code
 *         to Java 1.8+.
 */
public class Regions {

    /** Default network */
    public String defaultNetid;
    /** Array of network ids, e.g. nc, us, etc. */
    public ArrayList<String> netids;
    /** Array of regions */
    public ArrayList<Region> regions;

    /**
     * Create a new set of regions.
     */
    public Regions() {
        this.defaultNetid = "";
        this.netids = new ArrayList<String>();
        this.regions = new ArrayList<Region>();
    }

    /**
     * Is this netid in the set of regions? The default net covers the whole world
     * so it is always valid since it has no finite boundaries.
     *
     * @param netid A netid (nc, us, etc.)
     * @return boolean if netid is valid
     */
    public boolean isValidnetID(final String netid) {
        for (String i : this.netids) {
            if (netid.equalsIgnoreCase(i)) {
                return true;
            }
        }
        return false;
    }

    //
    // [KF] - add methods to check for the default network (US)
    //

    /**
     * Checks if network ID is the default network.
     *
     * @param netid network ID
     * @return true if default network.
     */
    public boolean isDefaultNetID(final String netid) {
        return this.defaultNetid.equalsIgnoreCase(netid);
    }

    /**
     * Checks if an event's network ID is the default network.
     *
     * @param eq EQ event
     * @return true if default network.
     */
    public boolean isDefaultNetID(final EQEvent eq) {
        return this.isDefaultNetID(eq.getNetID());
    }

    //
    // [KF] - add methods to determine if the event is from the authoritative
    // network.
    //

    /**
     * Determines if the event is from the authoritative network.
     *
     * @param netid network ID
     * @param p     event point
     * @return true if event is authoritative
     */
    public boolean isAuthor(final String netid, final Point p) {
        if (this.isDefaultNetID(netid)) {
            // if any non-default regions match, default is not authoritative
            for (Region region : this.regions) {
                if (region.netid.equalsIgnoreCase(netid)) {
                    continue;
                }
                if (region.inpoly(p)) {
                    // another region is authoritative
                    return false;
                }
            }
            // no other regions authoritative
            return true;
        } else {
            // if any network regions match, network is authoritative
            for (Region region : regions) {
                if (region.netid.equalsIgnoreCase(netid) && region.inpoly(p)) {
                    // network is authoritative
                    return true;
                }
            }
            // network is not authoritative
            return false;
        }
    }

    /**
     * Determines if the event is from the authoritative network.
     *
     * @param eq EQ event
     * @return true if event is authoritative
     */
    public boolean isAuthor(final EQEvent eq) {
        return this.isAuthor(eq.getNetID(), eq.getPoint());
    }

}