/** * Loads the data as statistics if applicable for the given pv name. This method will always * retrieve optimized data. * * @param pvname the name of the provided PV * @param count the number of requested points * @param start the start Instant of the data * @param end the end Instant of the data * @return the array of statistical data * @throws Exception in case of an error */ protected ArchiveVType[] getValuesStatistics(String pvname, int count, Instant start, Instant end) throws Exception { ValueIterator iterator = getIterator(pvname, true, count, start, end); ArrayList<ArchiveVType> vals = new ArrayList<ArchiveVType>(); while (iterator.hasNext()) { vals.add((ArchiveVType) iterator.next()); } iterator.close(); return vals.toArray(new ArchiveVType[vals.size()]); }
/** * Loads the numerical data for the provided pv. * * @param pvname the name of the PV to load data from * @param optimized true if optimized data should be loaded or false otherwise * @param count number of points to load in case optimized retrieval is selected * @param start the start Instant of the data * @param end the end Instant of the data * @return the array of data * @throws Exception in case of an error */ protected ArchiveVNumberArray[] getValuesNumberArray( String pvname, boolean optimized, int count, Instant start, Instant end) throws Exception { ValueIterator iterator = getIterator(pvname, optimized, count, start, end); ArrayList<ArchiveVNumberArray> vals = new ArrayList<ArchiveVNumberArray>(); while (iterator.hasNext()) { vals.add((ArchiveVNumberArray) iterator.next()); } iterator.close(); return vals.toArray(new ArchiveVNumberArray[vals.size()]); }
/** {@inheritDoc} */ @Override public void run() { Activator.getLogger().log(Level.FINE, "Starting {0}", ArchiveFetchJob.this); // $NON-NLS-1$ final BenchmarkTimer timer = new BenchmarkTimer(); long samples = 0; final int bins = Preferences.getPlotBins(); final ArchiveDataSource archives[] = item.getArchiveDataSources(); List<ArchiveDataSource> sourcesWhereChannelDoesntExist = new ArrayList<>(); for (int i = 0; i < archives.length && !cancelled; ++i) { final ArchiveDataSource archive = archives[i]; final String url = archive.getUrl(); // Display "N/total", using '1' for the first sub-archive. synchronized (this) { message = NLS.bind( Messages.ArchiveFetchDetailFmt, new Object[] {archive.getName(), (i + 1), archives.length}); } try { final ArchiveReader the_reader; synchronized (this) { the_reader = reader = ArchiveRepository.getInstance().getArchiveReader(url); } the_reader.enableConcurrency(concurrency); final ValueIterator value_iter; try { if (item.getRequestType() == RequestType.RAW) value_iter = the_reader.getRawValues(archive.getKey(), item.getResolvedName(), start, end); else value_iter = the_reader.getOptimizedValues( archive.getKey(), item.getResolvedName(), start, end, bins); } catch (UnknownChannelException e) { // Do not immediately notify about unknown channels. First search for the data in all // archive // sources and only report this kind of errors at the end sourcesWhereChannelDoesntExist.add(archives[i]); continue; } // Get samples into array final List<VType> result = new ArrayList<VType>(); while (value_iter.hasNext()) result.add(value_iter.next()); samples += result.size(); item.mergeArchivedSamples(the_reader.getServerName(), result); if (cancelled) break; value_iter.close(); } catch (Exception ex) { // Tell listener unless it's the result of a 'cancel'? if (!cancelled) listener.archiveFetchFailed(ArchiveFetchJob.this, archive, ex); // Continue with the next data source } finally { synchronized (this) { if (reader != null) reader.close(); reader = null; } } } if (!sourcesWhereChannelDoesntExist.isEmpty() && !cancelled) { listener.channelNotFound( ArchiveFetchJob.this, sourcesWhereChannelDoesntExist.size() < archives.length, sourcesWhereChannelDoesntExist.toArray( new ArchiveDataSource[sourcesWhereChannelDoesntExist.size()])); } timer.stop(); if (!cancelled) listener.fetchCompleted(ArchiveFetchJob.this); Activator.getLogger() .log( Level.FINE, "Ended {0} with {1} samples in {2}", //$NON-NLS-1$ new Object[] {ArchiveFetchJob.this, samples, timer}); }