Main Page | Class Hierarchy | Class List | File List | Class Members | Related Pages

FileToRbnb.java

00001 /* 00002 * Created on July 29, 2004 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 //import COM.Creare.Utility.ArgHandler; //for argument parsing 00015 import com.rbnb.utility.ArgHandler; //for argument parsing 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 // start from command line 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(); // uses h, s, p 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 //parse args 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 /* (non-Javadoc) 00170 * @see org.nees.rbnb.RBNBBase#setVariablesFromParameters() 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 // Create a source and connect: 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 // attmpt to open file 00224 String path = archiveDirectory + "/" + dataFileName; 00225 File probe = new File(path); 00226 00227 // does it exist and is it readable 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 // data not available 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 // Use this inner class to hide the public run method 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 // read one line ahead 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 // the first non-header line should be a list of channel names 00333 System.out.println("Channel list line: " + in); 00334 00335 // parse out the channel names and discard any path information 00336 // e.q. FromDaq/LoadCell_z will be sent as LoadCell_z 00337 StringTokenizer st = new StringTokenizer(in," "); // seperated by blanks 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 // set up channels 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 // the first token is the time stamp 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 // The rest of line is floting point data values 00383 i = 0; 00384 double[] data = new double[1]; 00385 while (st.hasMoreTokens()) 00386 { 00387 // post data to channel i 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 /* (non-Javadoc) 00408 * @see org.nees.rbnb.RBNBBase#getParameterNameArray() 00409 */ 00410 public String[] getParameterNameArray() { 00411 return parameterNameArray; 00412 } 00413 00414 /* (non-Javadoc) 00415 * @see org.nees.rbnb.RBNBBase#getParameterTypeArray() 00416 */ 00417 public String[] getParameterTypeArray() { 00418 return parameterTypeArray; 00419 } 00420 00421 /* (non-Javadoc) 00422 * @see org.nees.rbnb.RBNBBase#getParameterDefaultArray() 00423 */ 00424 public Object[] getParameterDefaultArray() { 00425 return parameterDefaultArray; 00426 } 00427 00428 /* (non-Javadoc) 00429 * @see org.nees.rbnb.RBNBBase#start() 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 /* (non-Javadoc) 00442 * @see org.nees.rbnb.RBNBBase#stop() 00443 */ 00444 public boolean stop() { 00445 if (!isRunning()) return false; 00446 stopThread(); 00447 disconnect(); 00448 return true; 00449 } 00450 00451 }

Generated on Tue Aug 24 11:12:25 2004 for Data turbine for NEESGrid by doxygen 1.3.7