/**
   * get all radar station within box.
   *
   * @param boundingBox the bounding box
   * @param cancel the cancel task
   * @return List Station objects
   * @throws IOException java io exception
   */
  public List<Station> getStations(LatLonRect boundingBox, ucar.nc2.util.CancelTask cancel)
      throws IOException {
    Collection<Station> sl = stationHMap.values();
    List<Station> dsl = new ArrayList();

    if (!boundingBox.containedIn(radarRegion)) {
      return null;
    }

    // for (Iterator it = sl.iterator(); it.hasNext(); ) {
    //    Station         s        = (Station) it.next();
    for (Station s : sl) {
      // LatLonPointImpl latlonPt = new LatLonPointImpl();
      // latlonPt.set(s.getLatitude(), s.getLongitude());
      // if (boundingBox.contains(latlonPt)) {
      if (boundingBox.contains(s.getLatLon())) {
        dsl.add(s);
      }
      if ((cancel != null) && cancel.isCancel()) {
        return null;
      }
    }

    return dsl;
  }
  /**
   * Getting data for a single radar station, with time range.
   *
   * @param sName radar station name
   * @param dateSelect the date time selection information
   * @param cancel _more_
   * @return list of radialDatasetSweep
   * @throws IOException _more_
   */
  public List getData(String sName, DateSelection dateSelect, ucar.nc2.util.CancelTask cancel)
      throws IOException {
    if ((cancel != null) && cancel.isCancel()) {
      return null;
    }
    TDSRadarDatasetInfo dri =
        queryRadarStation(sName, dateSelect.getStartFixedDate(), dateSelect.getEndFixedDate());
    List datasetList = new ArrayList();

    List datasetINVs = dateSelect.apply(dri.getInvList());

    Iterator it = datasetINVs.iterator();
    while (it.hasNext()) {
      InvDatasetInfo ifo = (InvDatasetInfo) it.next();
      InvDataset tdata = ifo.inv;
      ThreddsDataFactory tdFactory = new ThreddsDataFactory();
      ThreddsDataFactory.Result result;
      result = tdFactory.openFeatureDataset(tdata, null);
      datasetList.add(result.featureDataset);
      if ((cancel != null) && cancel.isCancel()) {
        return null;
      }
    }

    return datasetList;
  }
  /**
   * get all radar station.
   *
   * @return List of type Station objects
   */
  public List<Station> getRadarStations() {
    List<Station> slist = new ArrayList();
    Iterator it = this.stationHMap.values().iterator();
    while (it.hasNext()) {
      slist.add((Station) it.next());
    }

    return slist;
  }
  /**
   * Getting data for a single radar station.
   *
   * @param stnName radar station name
   * @param start of the time
   * @param end of the time
   * @return data URI list
   * @throws IOException java io exception
   */
  public List getRadarStationURIs(String stnName, Date start, Date end) throws IOException {

    TDSRadarDatasetInfo dri = queryRadarStation(stnName, start, end);
    List<DatasetURIInfo> uList = dri.getURIList();
    List<URI> datasetsURI = new ArrayList();
    for (DatasetURIInfo du : uList) {
      datasetsURI.add(du.uri);
    }

    return datasetsURI;
  }
  /**
   * get variable list from parent element
   *
   * @param elem _more_
   * @param ns _more_
   * @return list of varibles
   */
  public List<Product> readSelectVariable(Element elem, Namespace ns) {
    // look for stations
    List<Product> varlist = new ArrayList<Product>();
    Element v = elem.getChild("Variables", ns);

    List<Element> varInfo = v.getChildren();
    for (Element p : varInfo) {
      Product s;
      String id = p.getAttributeValue("name");
      if (id.contains("/")) {
        String c[] = id.split("/");
        s = new Product(c[0], c[1]);
        varlist.add(s);

      } else {
        String name = p.getAttributeValue("vocabulary_name");
        s = new Product(id, name);
        varlist.add(s);
      }
    }
    return varlist;
  }
  /**
   * Getting data Iterator for a single radar station.
   *
   * @param stnName radar station name
   * @param start of the time
   * @param end of the time
   * @return dataset list
   * @throws IOException java io exception
   */
  public List getRadarStationDatasets(String stnName, Date start, Date end) throws IOException {

    List datasetList = new ArrayList();

    TDSRadarDatasetInfo dri = queryRadarStation(stnName, start, end);
    List<InvDatasetInfo> iList = dri.getInvList();
    for (InvDatasetInfo iv : iList) {
      InvDataset tdata = iv.inv;
      ThreddsDataFactory tdFactory = new ThreddsDataFactory();
      ThreddsDataFactory.Result result;
      result = tdFactory.openFeatureDataset(tdata, null);
      datasetList.add(result.featureDataset);
    }

    return datasetList;
  }
  /**
   * get start and end elemnt form parent element
   *
   * @param elem _more_
   * @param ns _more_
   * @return list of times
   */
  public List<String> readSelectTime(Element elem, Namespace ns) {
    // look for stations

    Element region = elem.getChild("TimeSpan", ns);

    java.util.List regionInfo = region.getChildren();
    // lat, lon
    Element start = region.getChild("start", ns);
    String sv = start.getValue();
    Element end = region.getChild("end", ns);
    String ev = end.getValue();

    List<String> ll = new ArrayList<String>();
    ll.add(sv);
    ll.add(ev);
    return ll;
  }
  /**
   * getting data uri list
   *
   * @param sName station name
   * @param dateSelect the date selection
   * @param cancel the cancel task
   * @return the list of URIs
   * @throws IOException problem reading URIs
   */
  public List<URI> getDataURIs(
      String sName, DateSelection dateSelect, ucar.nc2.util.CancelTask cancel) throws IOException {
    if ((cancel != null) && cancel.isCancel()) {
      return null;
    }
    TDSRadarDatasetInfo dri =
        queryRadarStation(sName, dateSelect.getStartFixedDate(), dateSelect.getEndFixedDate());

    // create a list to hold URIs
    List<DatasetURIInfo> datasetsURIs = dateSelect.apply(dri.getURIList());
    List<URI> uriList = new ArrayList();

    for (DatasetURIInfo ufo : datasetsURIs) {
      URI u = ufo.uri;
      uriList.add(u);
      if ((cancel != null) && cancel.isCancel()) {
        return null;
      }
    }

    return uriList;
  }
  /**
   * Getting invDataset list for a single radar station.
   *
   * @param stnName radar station name
   * @param productID _more_
   * @param start of the time
   * @param end of the time
   * @return list of invDataset
   * @throws IOException java io exception
   */
  private TDSRadarDatasetInfo queryRadarStation(
      String stnName, String productID, Date start, Date end) throws IOException {
    // http://motherlode.ucar.edu:9080/thredds/idd/radarLevel2?returns=catalog&stn=KFTG&dtime=latest
    StringBuilder queryb = new StringBuilder();
    String baseURI = dsc_location.replaceFirst("/dataset.xml", "?");
    queryb.append(baseURI);
    queryb.append("&stn=" + stnName);
    if (productID != null) {
      queryb.append("&var=" + productID);
    }
    if ((start == null) && (end == null)) {
      queryb.append("&time=present");
    } else if (end == null) {
      String stime = DateUtil.getTimeAsISO8601(start).replaceAll("GMT", "");
      queryb.append("&time_start=" + stime);
      queryb.append("&time_end=present");
    } else {
      String stime = DateUtil.getTimeAsISO8601(start).replaceAll("GMT", "");
      String etime = DateUtil.getTimeAsISO8601(end).replaceAll("GMT", "");
      queryb.append("&time_start=" + stime);
      queryb.append("&time_end=" + etime);
    }

    URI catalogURI;
    try {
      catalogURI = new URI(queryb.toString());
    } catch (java.net.URISyntaxException e) {
      throw new IOException("** MalformedURLException on URL <" + ">\n" + e.getMessage() + "\n");
    }

    InvCatalogFactory factory = new InvCatalogFactory("default", false);

    // visad.util.Trace.call1("TDSRadarDatasetCollection.readXML");
    InvCatalogImpl catalog = (InvCatalogImpl) factory.readXML(catalogURI);
    // visad.util.Trace.call2("TDSRadarDatasetCollection.readXML");
    StringBuilder buff = new StringBuilder();
    // visad.util.Trace.call1("TDSRadarDatasetCollection.checkCatalog");
    if (!catalog.check(buff)) {
      throw new IOException("Invalid catalog <" + catalogURI + ">\n" + buff.toString());
    }
    // visad.util.Trace.call2("TDSRadarDatasetCollection.checkCatalog");

    List<InvDataset> datasets = catalog.getDatasets();

    InvDataset idata = (InvDataset) datasets.get(0);

    List<InvDataset> dsets = idata.getDatasets();

    List<Date> absTimeList = new ArrayList<Date>();
    List<DatasetURIInfo> dURIList = new ArrayList<DatasetURIInfo>();
    List<InvDatasetInfo> dInvList = new ArrayList<InvDatasetInfo>();

    // visad.util.Trace.call1("TDSRadarDatasetCollection.getLists");
    for (InvDataset tdata : dsets) {
      List<InvAccess> acess = tdata.getAccess();
      List<DateType> dates = tdata.getDates();
      InvAccess ia = (InvAccess) acess.get(0);
      URI d = ia.getStandardUri();
      Date date = ((DateType) dates.get(0)).getDate();
      absTimeList.add(date);
      dURIList.add(new DatasetURIInfo(d, date));
      dInvList.add(new InvDatasetInfo(tdata, date));
    }
    // visad.util.Trace.call2("TDSRadarDatasetCollection.getLists");

    TDSRadarDatasetInfo dri = new TDSRadarDatasetInfo(absTimeList, dURIList, dInvList);

    return dri;
  }