/*******************************************************************************
* Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University
* as Operator of the SLAC National Accelerator Laboratory.
* Copyright (c) 2011 Brookhaven National Laboratory.
* EPICS archiver appliance is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*******************************************************************************/
package org.epics.archiverappliance.retrieval;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.sql.Timestamp;
import org.apache.log4j.Logger;
import org.epics.archiverappliance.StoragePlugin;
import org.epics.archiverappliance.common.BasicContext;
import org.epics.archiverappliance.common.TimeUtils;
import org.epics.archiverappliance.common.YearSecondTimestamp;
import org.epics.archiverappliance.config.ArchDBRTypes;
import org.epics.archiverappliance.config.ConfigService;
import org.epics.archiverappliance.config.ConfigServiceForTests;
import org.epics.archiverappliance.config.StoragePluginURLParser;
import org.epics.archiverappliance.data.ScalarValue;
import org.epics.archiverappliance.engine.membuf.ArrayListEventStream;
import org.epics.archiverappliance.utils.simulation.SimulationEvent;
import org.epics.archiverappliance.utils.simulation.SimulationEventStream;
import org.epics.archiverappliance.utils.simulation.SineGenerator;
import edu.stanford.slac.archiverappliance.PB.data.PBCommonSetup;
import edu.stanford.slac.archiverappliance.PlainPB.PlainPBPathNameUtility;
import edu.stanford.slac.archiverappliance.PlainPB.PlainPBStoragePlugin;
/**
* Used to generate data for unit tests.
* @author mshankar
*
*/
public class GenerateData {
private static Logger logger = Logger.getLogger(GenerateData.class.getName());
/**
* We generate a sine wave for the data if it does not already exist.
* @param filenum
* @throws IOException
*/
public static void generateSineForPV(String pvName, int phasediffindegrees, ArchDBRTypes type) throws Exception {
ConfigService configService = new ConfigServiceForTests(new File("./bin"), 1);
PlainPBStoragePlugin storagePlugin = new PlainPBStoragePlugin();
PBCommonSetup setup = new PBCommonSetup();
setup.setUpRootFolder(storagePlugin);
try(BasicContext context = new BasicContext()) {
if(!Files.exists(PlainPBPathNameUtility.getPathNameForTime(storagePlugin, pvName, TimeUtils.getStartOfCurrentYearInSeconds(), context.getPaths(), configService.getPVNameToKeyConverter()))) {
SimulationEventStream simstream = new SimulationEventStream(type, new SineGenerator(phasediffindegrees));
storagePlugin.appendData(context, pvName, simstream);
}
}
configService.shutdownNow();
}
/**
* Given a plugin URL, the main method generates a couple of years worth of sine data into the plugin until 'yesterday'
* @param args
*/
public static void main(String[] args) throws Exception {
if(args.length < 2) {
System.err.println("Usage: java org.epics.archiverappliance.retrieval.GenerateData <pvName> <pluginURL>");
return;
}
String pvName = args[0];
String pluginURL = args[1];
ConfigService configService = new ConfigServiceForTests(new File("./bin"), 1);
StoragePlugin plugin = StoragePluginURLParser.parseStoragePlugin(pluginURL, configService);
Timestamp end = TimeUtils.minusDays(TimeUtils.now(), 1);
Timestamp start = TimeUtils.minusDays(end, 365*2);
long startEpochSeconds = TimeUtils.convertToEpochSeconds(start);
long endEpochSeconds = TimeUtils.convertToEpochSeconds(end);
logger.info("Generating data for pv " + pvName + " using plugin " + plugin.getDescription() + " between " + TimeUtils.convertToHumanReadableString(start) + " and " + TimeUtils.convertToHumanReadableString(end));
long currentSeconds = startEpochSeconds;
while(currentSeconds < endEpochSeconds) {
int eventsPerShot = 60*60*24;
ArrayListEventStream instream = new ArrayListEventStream(eventsPerShot, new RemotableEventStreamDesc(ArchDBRTypes.DBR_SCALAR_DOUBLE, pvName, TimeUtils.computeYearForEpochSeconds(currentSeconds)));
for(int i = 0; i < eventsPerShot; i++) {
YearSecondTimestamp yts = TimeUtils.convertToYearSecondTimestamp(currentSeconds);
instream.add(new SimulationEvent(yts.getSecondsintoyear(), yts.getYear(), ArchDBRTypes.DBR_SCALAR_DOUBLE, new ScalarValue<Double>(Math.sin((double)yts.getSecondsintoyear()))));
currentSeconds++;
}
try(BasicContext context = new BasicContext()) {
plugin.appendData(context, pvName, instream);
}
}
logger.info("Done generating data for pv " + pvName + " using plugin " + plugin.getDescription() + " between " + TimeUtils.convertToHumanReadableString(start) + " and " + TimeUtils.convertToHumanReadableString(end));
System.exit(0);
}
}