/**
   * using the time from the adapter to reset the time list
   *
   * @param realDateTimes _more_
   * @param times _more_
   * @return _more_
   */
  private List resetTimesList(DateTime[] realDateTimes, List<DateTime> times) {
    List results = new ArrayList();
    int len = realDateTimes.length;

    HashSet seenTimes = new HashSet();

    try {
      for (DateTime dateTime : times) {
        Date dttm = ucar.visad.Util.makeDate(dateTime);
        long minTimeDiff = -1;
        Date minDate = null;
        for (int i = 0; i < len; i++) {
          Date sourceDate = ucar.visad.Util.makeDate(realDateTimes[i]);
          long timeDiff = Math.abs(sourceDate.getTime() - dttm.getTime());
          if ((minTimeDiff < 0) || (timeDiff < minTimeDiff)) {
            minTimeDiff = timeDiff;
            minDate = sourceDate;
          }
        }
        if ((minDate != null) && !seenTimes.contains(minDate)) {
          results.add(new DateTime(minDate));
          seenTimes.add(minDate);
        }
      }
    } catch (Exception e) {
    }

    return results;
  }
Beispiel #2
0
  /**
   * Get a set of sounding obs based on the choice
   *
   * @param dataChoice DataChoice for data
   * @param subset subselection criteria
   * @return corresponding sounding observations
   * @throws RemoteException Java RMI problem
   * @throws VisADException VisAD problem
   */
  private Data getSoundingObs(DataChoice dataChoice, DataSelection subset)
      throws VisADException, RemoteException {
    Vector v = new Vector();
    List choices =
        (dataChoice instanceof CompositeDataChoice)
            ? ((CompositeDataChoice) dataChoice).getDataChoices()
            : Arrays.asList(new DataChoice[] {dataChoice});

    Object t = subset.getProperty(DataSelection.PROP_USESTIMEDRIVER);
    if ((t instanceof Boolean) && (useDriverTime == false)) {
      useDriverTime = ((Boolean) t).booleanValue();
    }

    if (useDriverTime) {
      // getAllTimesForTimeDriver(dataChoice, subset,
      //                         subset.getTimeDriverTimes());
      if (initTimes == null) {
        initTimes = subset.getTimeDriverTimes();
      }

      if (initTimes != null) { // reset the time for data choice if useDriverTime
        List<SoundingOb> soundingObs = getTimeMatchingSoundingObs(initTimes);
        choices = getTimeMatchingDataChoices(soundingObs);
      }
    }

    for (Iterator iter = choices.iterator(); iter.hasNext(); ) {
      DataChoice dc = (DataChoice) iter.next();
      Data ob = makeSoundingOb(dc, subset);
      if (ob != null) {
        v.add(ob);
      }
    }
    return (v.isEmpty()) ? null : new Tuple((Data[]) v.toArray(new Data[v.size()]), false);
  }
Beispiel #3
0
  /**
   * _more_
   *
   * @param dTimes _more_
   * @return _more_
   */
  protected List<SoundingOb> getTimeMatchingSoundingObs(List<DateTime> dTimes) {
    List soundingObs = getRDS().getSoundingObs();
    List newSoundingObs = new ArrayList<SoundingOb>();
    SoundingAdapter adapter = getRDS().adapter;

    for (Iterator iter = soundingObs.iterator(); iter.hasNext(); ) {
      SoundingOb ob = (SoundingOb) iter.next();

      for (Iterator itr = dTimes.iterator(); itr.hasNext(); ) {
        // Date       d      = (Date) itr.next();
        DateTime obTime = (DateTime) itr.next();
        SoundingOb ob1 = null;
        try {
          // obTime = new DateTime(d);
          ob1 = new SoundingOb(ob.getStation(), obTime);
          newSoundingObs.add(ob1);
        } catch (Exception e) {
        }
      }
    }

    raobDataSet = new RaobDataSet(adapter, newSoundingObs);

    return newSoundingObs;
  }
 /**
  * This is called when the CacheManager detects the need ot clear memory. It is intended to be
  * overwritten by derived classes that are holding cached data that is not in the normal putCache
  * facilities provided by this class since that data is actually managed by the CacheManager
  */
 public void clearCachedData() {
   super.clearCachedData();
   List<RadarAdapter> adapters = getAdapters();
   for (Iterator iter = adapters.iterator(); iter.hasNext(); ) {
     RadarAdapter adapter = (RadarAdapter) iter.next();
     adapter.clearCachedData();
   }
 }
Beispiel #5
0
  /**
   * Make the list of times associated with this DataSource for DataSelection.
   *
   * @return DateTimes as a list.
   */
  protected List doMakeDateTimes() {
    List timesList = new ArrayList();

    if (getProperty(AddeUtil.ABSOLUTE_TIMES, (Object) null) != null) {
      timesList.addAll((List) getProperty(AddeUtil.ABSOLUTE_TIMES));
    }
    return timesList; // Arrays.asList (
    //  new DateTime[] { traceAdapter.getBaseTime() });
  }
 /**
  * Construct a new radar data source.
  *
  * @param descriptor descriptor for this datasource
  * @param sources List of sources of data (filenames, URLs)
  * @param description Description of the files
  * @param properties hashtable of properties. Includes radar location
  * @throws VisADException couldn't create the data
  */
 public RadarDataSource(
     DataSourceDescriptor descriptor, List sources, String description, Hashtable properties)
     throws VisADException {
   super(
       descriptor,
       sources,
       (sources.size() == 1) ? (String) sources.get(0) : description,
       description,
       properties);
 }
  private boolean compareTimeLists(List<DateTime> timesA, List<DateTime> timesB) {
    if (timesA.size() != timesB.size()) return false;

    Collections.sort(timesA);
    Collections.sort(timesB);
    for (int i = 0; i < timesA.size(); i++) {
      DateTime a = timesA.get(i);
      DateTime b = timesB.get(i);

      double test = Math.abs(a.getValue() - b.getValue());
      if (test > 65.0) return false;
      // System.out.println("TTTTTTT =  " + test );
    }
    return true;
  }
Beispiel #8
0
 /**
  * _more_
  *
  * @param dataChoice _more_
  * @param selection _more_
  * @param timeDriverTimes _more_
  * @return _more_
  */
 public List getAllTimesForTimeDriver(
     DataChoice dataChoice, DataSelection selection, List<DateTime> timeDriverTimes) {
   List results = null;
   List<DateTime> collectionTimes = new ArrayList();
   DateTime[] soundingTimes = raobDataSet.getSoundingAdapter().getSoundingTimes();
   for (int i = 0; i < soundingTimes.length; i++) {
     collectionTimes.add(soundingTimes[i]);
   }
   try {
     results = DataUtil.selectTimesFromList(collectionTimes, timeDriverTimes);
   } catch (Exception e) {
   }
   initTimes = results;
   return results;
 }
Beispiel #9
0
  /**
   * _more_
   *
   * @param soundingObs _more_
   * @return _more_
   */
  protected List<DataChoice> getTimeMatchingDataChoices(List<SoundingOb> soundingObs) {
    List<DataChoice> newChoices = new ArrayList<DataChoice>();
    List categories = new ArrayList();

    DataCategory cat = new DataCategory(DataCategory.CATEGORY_RAOBSOUNDING);
    cat.setForDisplay(false);
    categories.add(cat);

    List compCategories = new ArrayList();
    DataCategory compCat = new DataCategory("None");
    compCat.setForDisplay(false);
    compCategories.add(compCat);

    Hashtable props = Misc.newHashtable(DataChoice.PROP_ICON, "/auxdata/ui/icons/Balloon.gif");

    for (Iterator iter = soundingObs.iterator(); iter.hasNext(); ) {
      SoundingOb ob = (SoundingOb) iter.next();
      String name = ob.getLabel();
      DateTime obTime = ob.getTimestamp();
      DataSelection timeSelect = null;
      if (obTime != null) {
        ArrayList times = new ArrayList(1);
        times.add(obTime);
        timeSelect = new DataSelection(times);
      }

      DataChoice choice =
          new DirectDataChoice(this, ob, getName(), name, categories, timeSelect, props);
      newChoices.add(choice);
    }

    return newChoices;
  }
Beispiel #10
0
  /**
   * Adds the {@link ucar.unidata.data.DataChoice}s of the current input data via {@link
   * #addDataChoice(DataChoice)}.
   */
  protected void doMakeDataChoices() {
    int i = 0;
    List soundingObs = getRDS().getSoundingObs();
    List categories = new ArrayList();

    DataCategory cat = new DataCategory(DataCategory.CATEGORY_RAOBSOUNDING);
    cat.setForDisplay(false);
    categories.add(cat);

    List compCategories = new ArrayList();
    DataCategory compCat = new DataCategory("None");
    compCat.setForDisplay(false);
    compCategories.add(compCat);

    CompositeDataChoice composite =
        new CompositeDataChoice(this, soundingObs, getName(), "RAOB Data", categories);
    Hashtable props = Misc.newHashtable(DataChoice.PROP_ICON, "/auxdata/ui/icons/Balloon.gif");

    for (Iterator iter = soundingObs.iterator(); iter.hasNext(); ) {
      SoundingOb ob = (SoundingOb) iter.next();
      String name = ob.getLabel();
      DateTime obTime = ob.getTimestamp();
      DataSelection timeSelect = null;
      if (obTime != null) {
        ArrayList times = new ArrayList(1);
        times.add(obTime);
        timeSelect = new DataSelection(times);
      }
      DataChoice choice =
          new DirectDataChoice(this, ob, composite.getName(), name, categories, timeSelect, props);
      composite.addDataChoice(choice);
    }
    addDataChoice(composite);
  }
Beispiel #11
0
 /**
  * Get the list of urls from the remote server
  *
  * @return List of urls
  */
 public List getDataPaths() {
   List paths = new ArrayList();
   AddeSoundingAdapter asa = (AddeSoundingAdapter) getRDS().getSoundingAdapter();
   List obs = getRDS().getSoundingObs();
   for (int i = 0; i < obs.size(); i++) {
     SoundingOb ob = (SoundingOb) obs.get(i);
     if (ob.getMandatoryFile() != null) {
       // file based
       paths.add(ob.getMandatoryFile());
       paths.add(ob.getSigFile());
     } else {
       paths.add(asa.getMandatoryURL(ob));
       paths.add(asa.getSigURL(ob));
     }
   }
   return paths;
 }
Beispiel #12
0
 /**
  * Override the init method for when this data source is unpersisted. We simply check the
  * imageList to see if this object came from a legacy bundle.
  */
 public void initAfterUnpersistence() {
   super.initAfterUnpersistence();
   List tmp = getTmpPaths();
   if (tmp != null) {
     List obs = getRDS().getSoundingObs();
     AddeSoundingAdapter asa = (AddeSoundingAdapter) getRDS().getSoundingAdapter();
     for (int i = 0; i < tmp.size(); i += 2) {
       SoundingOb ob = (SoundingOb) obs.get(i / 2);
       ob.setMandatoryFile(tmp.get(i).toString());
       ob.setMandatoryFile(tmp.get(i + 1).toString());
     }
   }
 }
  /**
   * Create the list of times associated with this DataSource.
   *
   * @return list of times.
   */
  protected List doMakeDateTimes() {
    List times = new ArrayList();
    boolean isRealTime = isRealTime();
    List<RadarAdapter> adapters = getAdapters();
    for (int i = 0; i < adapters.size(); i++) {
      if (!isRealTime) {
        times.add(((RadarAdapter) adapters.get(i)).getBaseTime());
      } else {
        String name = i + "th most recent";
        if (i == 0) {
          name = "Most recent";
        }
        if ((i > 0) && (i < DataSource.ordinalNames.length)) {
          name = DataSource.ordinalNames[i] + " most recent";
        }
        times.add(new TwoFacedObject(name, i));
      }
    }
    Collections.sort(times);

    return times;
  }
  /**
   * Get the data for the given DataChoice and selection criteria.
   *
   * @param dataChoice DataChoice for selection
   * @param category DataCategory for the DataChoice (not used)
   * @param subset subsetting criteria
   * @param requestProperties extra request properties
   * @return the Data object for the request
   * @throws RemoteException couldn't create a remote data object
   * @throws VisADException couldn't create the data
   */
  protected Data getDataInner(
      final DataChoice dataChoice,
      DataCategory category,
      final DataSelection subset,
      final Hashtable requestProperties)
      throws VisADException, RemoteException {

    try {
      List times = null;
      if (subset != null) {
        times = getTimesFromDataSelection(subset, dataChoice);
      }
      if (times == null) {
        times = dataChoice.getSelectedDateTimes();
      }

      List dtimes = subset.getTimeDriverTimes();

      if (dtimes != null && useDriverTime == false) {
        useDriverTime = true;
      }

      List<RadarAdapter> adapters = getAdapters();

      DateTime[] realDateTimes = new DateTime[adapters.size()];
      for (int i = 0; i < adapters.size(); i++) {
        realDateTimes[i] = ((RadarAdapter) adapters.get(i)).getBaseTime();
      }
      Arrays.sort(realDateTimes);
      // Flip it to get youngest date first
      boolean isRealTime = isRealTime();
      if (isRealTime) {
        realDateTimes =
            (DateTime[]) Misc.reverseArray(realDateTimes, new DateTime[realDateTimes.length]);
      }
      // if use time driver
      if (useDriverTime) {
        List tests = resetTimesList(realDateTimes, times);
        if (!compareTimeLists(times, tests)) {
          reloadData();
          adapters = getAdapters();

          realDateTimes = new DateTime[adapters.size()];
          for (int i = 0; i < adapters.size(); i++) {
            realDateTimes[i] = ((RadarAdapter) adapters.get(i)).getBaseTime();
          }
          Arrays.sort(realDateTimes);
          // Flip it to get youngest date first
          isRealTime = isRealTime();
          if (isRealTime) {
            realDateTimes =
                (DateTime[]) Misc.reverseArray(realDateTimes, new DateTime[realDateTimes.length]);
          }
          tests = resetTimesList(realDateTimes, times);
        }
        times = tests;
      }
      // if times are null, then that means all times
      DateTime[] dateTimes = null;

      if ((times == null) || (times.size() == 0)) {
        dateTimes = realDateTimes;
      } else {
        dateTimes = new DateTime[times.size()];
        for (int i = 0; i < times.size(); i++) {
          Object time = times.get(i);
          if (time instanceof TwoFacedObject) {
            int index = ((Integer) ((TwoFacedObject) time).getId()).intValue();
            dateTimes[i] = realDateTimes[index];
          } else if (time instanceof DateTime) {
            dateTimes[i] = (DateTime) time;
          }
        }
      }
      Arrays.sort(dateTimes);
      final Data[] datas = new Data[dateTimes.length];
      int timeIndex = 0;
      final MathType[] mt = {null};
      // create a new field of (Time -> (radar data)).
      // fill in the times array and data array with dates/data
      // only from those adapters which match the selected times.
      // if a data object is null, stick it in the list.
      // if all are null, then the MathType (mt) will never get set,
      // so return null.
      //            System.err.println ("Reading " + adapters.size() + " radar files");
      int cnt = 0;
      ThreadManager threadManager = new visad.util.ThreadManager("radar data reading");

      for (Iterator iter = adapters.iterator(); iter.hasNext(); ) {
        final RadarAdapter adapter = (RadarAdapter) iter.next();
        timeIndex = Arrays.binarySearch(dateTimes, adapter.getBaseTime());
        //              System.err.println ("timeIndex:" + timeIndex);
        if (timeIndex < 0) {
          continue;
        }
        cnt++;
        LogUtil.message("Time: " + (cnt) + "/" + dateTimes.length + " From:" + toString());
        final int theTimeIndex = timeIndex;
        threadManager.addRunnable(
            new visad.util.ThreadManager.MyRunnable() {
              public void run() throws Exception {
                Trace.call1("RDS.getData");
                Data d = adapter.getData(dataChoice, subset, requestProperties);
                Trace.call2("RDS.getData");
                datas[theTimeIndex] = d;
                if (d != null) {
                  mt[0] = d.getType();
                } else {
                }
              }
            });
      }

      try {
        // threadManager.debug = true;
        threadManager.runInParallel(getDataContext().getIdv().getMaxDataThreadCount());
      } catch (VisADException ve) {
        LogUtil.printMessage(ve.toString());
      }

      if (mt[0] == null) {
        return null;
      }

      FunctionType ft = new FunctionType(RealType.Time, mt[0]);
      SampledSet domainSet =
          (dateTimes.length == 1)
              ? (SampledSet) new SingletonSet(new RealTuple(dateTimes))
              : (SampledSet) DateTime.makeTimeSet(dateTimes);
      FieldImpl fi = new FieldImpl(ft, domainSet);
      fi.setSamples(datas, false);
      return fi;
    } catch (Exception exc) {
      logException("Creating obs", exc);
    }
    return null;
  }
  /**
   * Make the adapters for the given list of files
   *
   * @param files Data files
   * @throws Exception When bad things happen
   */
  private void makeAdapters(List files) throws Exception {
    adapters = new ArrayList<RadarAdapter>();
    Hashtable<String, RadarAdapter> oldAdapterMap = fileToAdapter;
    fileToAdapter = new Hashtable<String, RadarAdapter>();

    int cnt = 0;

    final List<String> badFiles = new ArrayList<String>();
    final List<Exception> badExceptions = new ArrayList<Exception>();

    final List<RadarAdapter> goodAdapters = new ArrayList<RadarAdapter>();
    final List<String> goodFiles = new ArrayList<String>();
    visad.util.ThreadManager threadManager =
        new visad.util.ThreadManager("radar data initialization");
    LogUtil.message("Initializing radar files");
    for (Iterator iter = files.iterator(); iter.hasNext(); ) {
      final String filename = iter.next().toString();
      RadarAdapter adapter = (RadarAdapter) oldAdapterMap.get(filename);
      cnt++;
      if (adapter == null) {
        threadManager.addRunnable(
            new visad.util.ThreadManager.MyRunnable() {
              public void run() throws Exception {
                try {
                  RadarAdapter myAdapter = makeRadarAdapter(filename);
                  synchronized (goodAdapters) {
                    goodAdapters.add(myAdapter);
                    goodFiles.add(filename);
                  }
                } catch (Exception e) {
                  synchronized (badExceptions) {
                    badExceptions.add(e);
                    badFiles.add(filename);
                  }
                }
              }
            });
      } else {
        goodAdapters.add(adapter);
        goodFiles.add(filename);
      }
    }

    //        threadManager.debug = true;
    threadManager.runInParallel(getDataContext().getIdv().getMaxDataThreadCount());
    LogUtil.message("");

    for (int i = 0; i < goodAdapters.size(); i++) {
      adapters.add(goodAdapters.get(i));
      fileToAdapter.put(goodFiles.get(i), goodAdapters.get(i));
    }

    if (!badFiles.isEmpty()) {
      StringBuffer buf = new StringBuffer();
      if (badFiles.size() < files.size()) {
        buf.append("<html>");
        buf.append("There were problems reading these files:");
        buf.append("<ul>");
        for (Iterator iterator = badFiles.iterator(); iterator.hasNext(); ) {
          buf.append("<li>");
          buf.append((String) iterator.next());
          buf.append("</li>");
        }
        buf.append("</ul>");
        buf.append("<p>Continue loading good data?<p></html>");
        boolean ok = ucar.unidata.util.GuiUtils.askYesNo("Error reading data", buf.toString());

        badExceptions.get(0).printStackTrace();
        if (ok) {
          files.removeAll(badFiles);
        } else {
          throw new VisADException("error reading files");
        }
      } else {
        throw badExceptions.get(0);
      }
    }
    // clean up any old adapters
    for (String source : oldAdapterMap.keySet()) {
      if (fileToAdapter.get(source) == null) {
        ((RadarAdapter) oldAdapterMap.get(source)).doRemove();
      }
    }
    oldAdapterMap = null;
  }
Beispiel #16
0
 /**
  * _Save the remote data to local disk
  *
  * @param prefix Where to write the files to
  * @param loadId For the JobManager dialog
  * @param changeLinks Should we change the internal data references
  * @return List of files we wrote
  * @throws Exception On badness
  */
 protected List saveDataToLocalDisk(String prefix, Object loadId, boolean changeLinks)
     throws Exception {
   List urls = new ArrayList();
   List obs = getRDS().getSoundingObs();
   AddeSoundingAdapter asa = (AddeSoundingAdapter) getRDS().getSoundingAdapter();
   for (int i = 0; i < obs.size(); i++) {
     SoundingOb ob = (SoundingOb) obs.get(i);
     urls.add(asa.getMandatoryURL(ob) + "&rawstream=true");
     urls.add(asa.getSigURL(ob) + "&rawstream=true");
   }
   List newFiles = IOUtil.writeTo(urls, prefix, "raob", loadId);
   if (newFiles == null) {
     return null;
   }
   if (changeLinks) {
     for (int i = 0; i < newFiles.size(); i += 2) {
       SoundingOb ob = (SoundingOb) obs.get(i / 2);
       ob.setMandatoryFile(newFiles.get(i).toString());
       ob.setSigFile(newFiles.get(i + 1).toString());
     }
   }
   return newFiles;
 }