00001
00002
00003
00004
package org.nees.rbnb;
00005
00006
import java.io.*;
00007
import java.util.StringTokenizer;
00008
import java.util.Vector;
00009
import java.util.Enumeration;
00010
00011
import org.nees.daq.ISOtoRbnbTime;
00012
00013
import com.rbnb.sapi.*;
00014
00015
import com.rbnb.utility.ArgHandler;
00016
00020 public class FileToRbnb extends RBNBBase {
00021
00022
private static final String SOURCE_NAME_NAME =
"SourceName";
00023
private static final String SOURCE_NAME =
"FileDump";
00024
private static final String CHANNEL_NAME_NAME =
"ChannelName";
00025
private static final String CHANNEL_NAME =
"data.txt";
00026
private static final String CACHE_SIZE_NAME =
"CacheSize";
00027
private static final int DEFAULT_CACHE_SIZE=100;
00028
00029
private final String ARCHIVE_DIRECTORY_NAME =
"ArchiveDirectory";
00030
private final String DATA_FILE_NAME_NAME =
"DataFileName";
00031
00032
private static final String ARCHIVE_DIRECTORY =
".";
00033
private static final String DATA_FILE_NAME =
"Data.txt";
00034
00035
private String sourceName = SOURCE_NAME;
00036
private String channelName = CHANNEL_NAME;
00037
private int cacheSize = DEFAULT_CACHE_SIZE;
00038
00039
private String archiveDirectory = ARCHIVE_DIRECTORY;
00040
private String dataFileName = DATA_FILE_NAME;
00041
private BufferedReader rd;
00042
00043 Source source = null;
00044 ChannelMap sMap;
00045
int index;
00046
boolean connected =
false;
00047
00048 Thread timerThread;
00049
boolean runit =
false;
00050
00051
private String[] parameterNameArray;
00052
private String[] parameterTypeArray;
00053
private Object[] parameterDefaultArray;
00054
00055
public static void main(String[] args) {
00056
00057
FileToRbnb w =
new FileToRbnb();
00058
if (w.
setArgs(args))
00059 {
00060 w.
connect();
00061 w.
startThread();
00062 }
00063 }
00064
00065
public FileToRbnb()
00066 {
00067 setParamterArrays();
00068 initialize();
00069 }
00070
00071
public void printUsage() {
00072 System.out.println(
"FileToRbnb: usage is...");
00073 System.out.println(
"FileToRbnb ");
00074 super.printUsage();
00075 System.out.println(
"[-n source_name *" + SOURCE_NAME +
"] ");
00076 System.out.println(
"[-c channel_name *" + CHANNEL_NAME +
"] ");
00077 System.out.println(
"[-d Archive directory root *" + ARCHIVE_DIRECTORY +
"]");
00078 System.out.println(
"[-D Data input file name *" + DATA_FILE_NAME +
"]");
00079 System.out.println(
"[-z cache size *" + DEFAULT_CACHE_SIZE +
"]");
00080 System.out.println();
00081 }
00082
00083
protected boolean setInstanceArgs(String[] args)
throws IllegalArgumentException
00084 {
00085
00086
try {
00087 ArgHandler ah=
new ArgHandler(args);
00088
if (ah.checkFlag(
'n')) {
00089 String a=ah.getOption(
'n');
00090
if (a!=null) sourceName=a;
00091 }
00092
if (ah.checkFlag(
'c')) {
00093 String a=ah.getOption(
'c');
00094
if (a!=null) channelName=a;
00095 }
00096
if (ah.checkFlag(
'd')) {
00097 String a=ah.getOption(
'd');
00098
if (a!=null) archiveDirectory=a;
00099 }
00100
if (ah.checkFlag(
'D')) {
00101 String a=ah.getOption(
'D');
00102
if (a!=null) dataFileName=a;
00103 }
00104
if (ah.checkFlag(
'z')) {
00105 String a=ah.getOption(
'z');
00106
if (a!=null)
00107
try
00108 {
00109 Integer i =
new Integer(a);
00110
int value = i.intValue();
00111 cacheSize = value;
00112 System.out.println(
"sizes " + cacheSize +
"," + value);
00113 }
00114
catch (Exception ignore) {}
00115 }
00116 }
catch (Exception e) {
00117
throw new IllegalArgumentException(
"Argument Exception: " + e);
00118 }
00119
00120 System.out.println(
"Starting FileToRbnb on " + getServer()
00121 +
" as " + sourceName);
00122 System.out.println(
" Channel name = " + channelName
00123 +
" Cache Size = " + cacheSize);
00124 System.out.println(
" Use FileToRbnb -h to see optional parameters");
00125
00126
return true;
00127 }
00128
00129
protected void setParamterArrays() {
00130
00131 String [] pNameArray = super.getBaseParameterNameArray();
00132 String [] pTypeArray = super.getBaseParameterTypeArray();
00133 Object [] pDefaultArray = super.getBaseParameterDefaultArray();
00134
00135
int base = pNameArray.length;
00136
int numberOfparameters = 5;
00137 parameterNameArray =
new String[base + numberOfparameters];
00138 parameterTypeArray =
new String[base + numberOfparameters];
00139 parameterDefaultArray =
new Object[base + numberOfparameters];
00140
00141
for (
int i = 0; i < base; i++)
00142 {
00143 parameterNameArray[i] = pNameArray[i];
00144 parameterTypeArray[i] = pTypeArray[i];
00145 parameterDefaultArray[i] = pDefaultArray[i];
00146 }
00147
00148 parameterNameArray[base + 0] = SOURCE_NAME_NAME;
00149 parameterTypeArray[base + 0] =
RBNBBaseParameterHolder.STRING_TYPE;
00150 parameterDefaultArray[base + 0] =
new String(SOURCE_NAME);
00151
00152 parameterNameArray[base + 1] = CHANNEL_NAME_NAME;
00153 parameterTypeArray[base + 1] =
RBNBBaseParameterHolder.STRING_TYPE;
00154 parameterDefaultArray[base + 1] =
new String(CHANNEL_NAME);
00155
00156 parameterNameArray[base + 2] = CACHE_SIZE_NAME;
00157 parameterTypeArray[base + 2] =
RBNBBaseParameterHolder.INTEGER_TYPE;
00158 parameterDefaultArray[base + 2] =
new Integer(DEFAULT_CACHE_SIZE);
00159
00160 parameterNameArray[base + 3] = ARCHIVE_DIRECTORY_NAME;
00161 parameterTypeArray[base + 3] =
RBNBBaseParameterHolder.STRING_TYPE;
00162 parameterDefaultArray[base + 3] =
new String(ARCHIVE_DIRECTORY);
00163
00164 parameterNameArray[base + 4] = DATA_FILE_NAME_NAME;
00165 parameterTypeArray[base + 4] =
RBNBBaseParameterHolder.STRING_TYPE;
00166 parameterDefaultArray[base + 4] =
new String(DATA_FILE_NAME);
00167 }
00168
00169
00170
00171
00172 public void setVariablesFromParameters() {
00173 super.setBaseVarialbesFromParametes();
00174
00175 sourceName = SOURCE_NAME;
00176
try{
00177 Object obj = getValueWithDefault(SOURCE_NAME_NAME, SOURCE_NAME);
00178 sourceName = (String)obj;
00179 }
catch (Throwable ignore){}
00180
00181 channelName = CHANNEL_NAME;
00182
try{
00183 Object obj = getValueWithDefault(CHANNEL_NAME_NAME, CHANNEL_NAME);
00184 channelName = (String)obj;
00185 }
catch (Throwable ignore){}
00186
00187 cacheSize = DEFAULT_CACHE_SIZE;
00188
try{
00189 Integer i =
new Integer(DEFAULT_CACHE_SIZE);
00190 Object obj = getValueWithDefault(CACHE_SIZE_NAME, i);
00191 cacheSize = ((Integer)obj).intValue();
00192 }
catch (Throwable ignore){}
00193
00194 archiveDirectory = ARCHIVE_DIRECTORY;
00195
try{
00196 Object obj = getValueWithDefault(ARCHIVE_DIRECTORY_NAME, ARCHIVE_DIRECTORY);
00197 archiveDirectory = (String)obj;
00198 }
catch (Throwable ignore){}
00199
00200 dataFileName = DATA_FILE_NAME;
00201
try{
00202 Object obj = getValueWithDefault(DATA_FILE_NAME_NAME, DATA_FILE_NAME);
00203 dataFileName = (String)obj;
00204 }
catch (Throwable ignore){}
00205
00206 }
00207
00208
public void connect()
00209 {
00210 System.out.println(
"FileToRbnb: Attempting to connect to server = "
00211 + getServer() +
" as " + sourceName +
" with " + channelName +
".");
00212
try {
00213
00214 source=
new Source(cacheSize,
"none", 0);
00215 source.OpenRBNBConnection(getServer(),sourceName);
00216 connected =
true;
00217 System.out.println(
"FileToRbnb: Connection made to server = "
00218 + getServer() +
" as " + sourceName +
" with " + channelName +
".");
00219 }
catch (SAPIException se) { se.printStackTrace(); }
00220
00221
if (connected)
00222 {
00223
00224 String path = archiveDirectory +
"/" + dataFileName;
00225 File probe =
new File(path);
00226
00227
00228
if (probe != null && probe.exists() && probe.canRead())
00229 {
00230
if (rd != null)
00231 {
00232
try {
00233 rd.close();
00234 }
catch (IOException ignore) {}
00235 rd = null;
00236 }
00237
try
00238 {
00239 rd =
new BufferedReader(
new FileReader(probe));
00240 System.out.println(
"Sucessfully connected to " + path);
00241 }
00242
catch (IOException e)
00243 {
00244 e.printStackTrace();
00245 disconnect();
00246 }
00247
if (rd == null)
00248 {
00249 System.out.println(
"Failed to open file stream " + path);
00250 disconnect();
00251 }
00252 }
00253
else
00254 {
00255 System.out.println(
"Data unavailable: path...");
00256
if (probe == null)
00257 System.out.println(
"Could not open file.");
00258
else if (!probe.exists())
00259 System.out.println(
"File does not exist");
00260
else if (!probe.canRead())
00261 System.out.println(
"File is unreadable");
00262 disconnect();
00263 }
00264 }
00265 }
00266
00267
private void disconnect() {
00268 source.Detach();
00269 connected =
false;
00270 source = null;
00271
if (rd != null)
00272 {
00273
try {
00274 rd.close();
00275 }
catch (IOException ignore) {}
00276 rd = null;
00277 }
00278 }
00279
00280
public void startThread()
00281 {
00282
00283
if (!connected)
return;
00284
00285
00286 Runnable r =
new Runnable() {
00287
public void run() {
00288 runWork();
00289 }
00290 };
00291 runit =
true;
00292 timerThread =
new Thread(r,
"Timer");
00293 timerThread.start();
00294 System.out.println(
"FileToRbnb: Started thread.");
00295 }
00296
00297
public void stopThread()
00298 {
00299 runit =
false;
00300 timerThread.interrupt();
00301 System.out.println(
"FileToRbnb: Stopped thread.");
00302 }
00303
00304
private void runWork ()
00305 {
00306
if (!
isRunning())
return;
00307
00308
int lineCount = 0;
00309 String in =
"";
00310
boolean header =
true;
00311
00312
try {
00313
00314
00315
while(header && ((in = rd.readLine()) != null) &&
isRunning())
00316 {
00317
if (! in.startsWith(
"Time"))
00318 {
00319 System.out.println(
"Skipping header line: " + in);
00320
continue;
00321 }
00322
else
00323 header =
false;
00324 }
00325
00326
if (!
isRunning())
return;
00327
if (in == null)
00328 {
00329 System.out.println(
"Unexpected end of file.");
00330 }
00331
00332
00333 System.out.println(
"Channel list line: " + in);
00334
00335
00336
00337 StringTokenizer st =
new StringTokenizer(in,
" ");
00338 Vector channelNames =
new Vector();
00339
00340
while (st.hasMoreTokens())
00341 channelNames.add(st.nextToken());
00342
00343 String[] channelNameArray =
new String[channelNames.size()];
00344
00345 Enumeration en = channelNames.elements();
00346
int pos,i = 0;
00347 String name;
00348
while (en.hasMoreElements())
00349 {
00350 name = (String)en.nextElement();
00351 pos = name.lastIndexOf(
'/');
00352
if (pos > -1) name = name.substring(pos+1);
00353 channelNameArray[i] = name;
00354 i++;
00355 }
00356
00357
00358
int[] channalIndexArray =
new int[channelNameArray.length];
00359 ChannelMap map =
new ChannelMap();
00360
for (
int n = 0; n < channelNameArray.length; n++)
00361 {
00362 channalIndexArray[n] = map.Add(channelNameArray[n]);
00363 System.out.println(
"Added Channel " + channelNameArray[n]
00364 +
" with index = " + channalIndexArray[n]);
00365 }
00366 source.Register(map);
00367
00368
while(((in = rd.readLine()) != null) &&
isRunning())
00369 {
00370 st =
new StringTokenizer(in,
" ");
00371
00372
00373 String tsString = st.nextToken();
00374 ISOtoRbnbTime timestamp =
new ISOtoRbnbTime(tsString);
00375
if (!timestamp.is_valid)
00376 {
00377 System.out.println(
"Warning: timestamp not valid: " + tsString);
00378 }
00379
double time = timestamp.getValue();
00380 map.PutTime(time,0.0);
00381
00382
00383 i = 0;
00384
double[] data =
new double[1];
00385
while (st.hasMoreTokens())
00386 {
00387
00388 data[0] = Double.parseDouble(st.nextToken());
00389 map.PutDataAsFloat64(channalIndexArray[i],data);
00390 i++;
00391 }
00392 source.Flush(map);
00393 }
00394 }
00395
catch (Exception e) {
00396 System.out.println(
"IO Error: " + e);
00397 }
00398
00399
stop();
00400 }
00401
00402 public boolean isRunning()
00403 {
00404
return (connected && runit);
00405 }
00406
00407
00408
00409
00410 public String[]
getParameterNameArray() {
00411
return parameterNameArray;
00412 }
00413
00414
00415
00416
00417 public String[]
getParameterTypeArray() {
00418
return parameterTypeArray;
00419 }
00420
00421
00422
00423
00424 public Object[]
getParameterDefaultArray() {
00425
return parameterDefaultArray;
00426 }
00427
00428
00429
00430
00431 public boolean start() {
00432
if (
isRunning())
return false;
00433
if (connected) disconnect();
00434
setVariablesFromParameters();
00435 connect();
00436
if (!connected)
return false;
00437 startThread();
00438
return true;
00439 }
00440
00441
00442
00443
00444 public boolean stop() {
00445
if (!
isRunning())
return false;
00446 stopThread();
00447 disconnect();
00448
return true;
00449 }
00450
00451 }