package alma.acs.monitoring.blobber; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import alma.JavaContainerError.wrappers.AcsJContainerServicesEx; import alma.MonitorArchiver.Controller; import alma.MonitorArchiver.ControllerHelper; import alma.MonitorErr.CollectorRegistrationFailedEx; import alma.MonitorErr.DeviceAlreadyRegisteredEx; import alma.MonitorErr.DeviceNotRegisteredEx; import alma.MonitorErr.RegisteringDeviceProblemEx; import alma.MonitorErr.StartMonitoringProblemEx; import alma.MonitorErr.StopMonitoringProblemEx; import alma.TMCDB.MonitorBlob; import alma.TMCDB.MonitorCollectorOperations; import alma.TMCDB.MonitorDataBlock; import alma.TMCDB.doubleBlobData; import alma.TMCDB.doubleBlobDataSeqHelper; import alma.TMCDB.doubleSeqBlobDataHelper; import alma.TMCDB.doubleValueType; import alma.TMCDB.propertySerailNumber; import alma.acs.component.ComponentImplBase; import alma.acs.component.ComponentLifecycleException; import alma.acs.container.ContainerServices; public class FileReaderCollectorImpl extends ComponentImplBase implements MonitorCollectorOperations { private static final String PREFIX = System.getProperty("alma.acs.monitoring.filesDir") + File.separatorChar; public static final String[] monitoredComponents = { "CONTROL/CentralLO/ML", "CONTROL/CentralLO/MLD", "CONTROL/CentralLO/PSLLC1", "CONTROL/CentralLO/PSLLC2", "CONTROL/CentralLO/PSSAS1", "CONTROL/CentralLO/PSSAS2", "CONTROL/PM03/IFProc0", "CONTROL/PM03/IFProc1", "CONTROL/PM03/LORR", "CONTROL/PM03/PSA", "CONTROL/PM03/PSD", "CONTROL/PM04/IFProc0", "CONTROL/PM04/IFProc1", "CONTROL/PM04/LORR", "CONTROL/PM04/PSA", "CONTROL/PM04/PSD", }; private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); private Map<String, List<FileBasedMonitorPoint>> m_files = new HashMap<String, List<FileBasedMonitorPoint>>(); private static class FileBasedMonitorPoint { public BufferedReader reader; public long lastTimestamp; public String propertyname; public long readBytes; } @Override public void initialize(ContainerServices inContainerServices) throws ComponentLifecycleException { super.initialize(inContainerServices); Controller controller; try { controller = ControllerHelper.narrow(m_containerServices.getComponent("ARCHIVE/TMCDB/MONITOR_CONTROL")); controller.registerCollector(name()); } catch (AcsJContainerServicesEx ex) { throw new ComponentLifecycleException(ex); } catch (CollectorRegistrationFailedEx ex) { throw new ComponentLifecycleException(ex); } } @Override public void registerMonitoredDevice(String componentName, String serialNumber) throws RegisteringDeviceProblemEx, DeviceAlreadyRegisteredEx { } @Override public void registerNonCollocatedMonitoredDevice(String componentName, String serialNumber) throws RegisteringDeviceProblemEx, DeviceAlreadyRegisteredEx { } @Override public void registerCollocatedMonitoredDevice(String componentName, String serialNumber) throws RegisteringDeviceProblemEx, DeviceAlreadyRegisteredEx { } @Override public void registerMonitoredDeviceWithMultipleSerial(String componentName, propertySerailNumber[] serialNumbers) throws RegisteringDeviceProblemEx, DeviceAlreadyRegisteredEx { } @Override public void registerNonCollocatedMonitoredDeviceWithMultipleSerial(String componentName, propertySerailNumber[] serialNumbers) throws RegisteringDeviceProblemEx, DeviceAlreadyRegisteredEx { } @Override public void registerCollocatedMonitoredDeviceWithMultipleSerial(String componentName, propertySerailNumber[] serialNumbers) throws RegisteringDeviceProblemEx, DeviceAlreadyRegisteredEx { } @Override public void deregisterMonitoredDevice(String componentName) throws DeviceNotRegisteredEx { } @Override public void startMonitoring(String componentName) throws StartMonitoringProblemEx { String componentDirPath = PREFIX + componentName.replaceAll("/", "_"); File componentDir = new File(componentDirPath); List<FileBasedMonitorPoint> monitorPointData = new ArrayList<FileBasedMonitorPoint>(); for(String fileName: componentDir.list()) { FileBasedMonitorPoint mp = new FileBasedMonitorPoint(); mp.propertyname = fileName.substring(0, fileName.lastIndexOf('.')); try { mp.reader = new BufferedReader(new FileReader(new File(componentDirPath + File.separator + fileName))); mp.reader.mark(80); mp.lastTimestamp = parseLine(mp.reader.readLine()).time; mp.reader.close(); mp.readBytes = 0; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } monitorPointData.add(mp); } m_files.put(componentName, monitorPointData); } @Override public void stopMonitoring(String componentName) throws StopMonitoringProblemEx { for(String component: m_files.keySet()) if( component.equals(componentName) ) { try { for(FileBasedMonitorPoint mp: m_files.get(component) ) mp.reader.close(); } catch (IOException e) {} } } @Override public void set_archiving_interval(String compName, String propName, long time) { } @Override public void enable_archiving(String compName, String propName) { } @Override public void suppress_archiving(String compName, String propName) { } @Override public MonitorDataBlock[] getMonitorData() { // For each component, we read all its related files List<MonitorDataBlock> blocks = new ArrayList<MonitorDataBlock>(); for(String componentName: m_files.keySet()) { MonitorDataBlock block = new MonitorDataBlock(); List<MonitorBlob> blobList = new ArrayList<MonitorBlob>(); // For each file (property), we read some values and wrap them for(FileBasedMonitorPoint mp: m_files.get(componentName)) { try { String componentDirPath = PREFIX + componentName.replaceAll("/", "_"); mp.reader = new BufferedReader(new FileReader(new File(componentDirPath + File.separator + mp.propertyname + ".txt"))); if( !mp.reader.ready() ) break; mp.reader.skip(mp.readBytes); } catch (IOException e1) { break; } String line = null; MonitorBlob blob = new MonitorBlob(); blob.propertyName = mp.propertyname; blob.blobDataSeq = m_containerServices.getAdvancedContainerServices().getORB().create_any(); blob.blobDataSeq.type(doubleSeqBlobDataHelper.type()); blob.propertySerialNumber = new String[0]; blob.typeOfValue = doubleValueType.value; List<doubleBlobData> dataList = new ArrayList<doubleBlobData>(); do { try { mp.reader.mark(80); line = mp.reader.readLine(); if( line == null ) break; mp.readBytes += line.length() + 1; // +1 = '\n' doubleBlobData data = parseLine(line); // We suppose we're being called every 1 minute here m_logger.fine("Read: " + line + " for " + componentName + "/" + mp.propertyname); if( (data.time - mp.lastTimestamp) >= 60*1000 ) { m_logger.fine("Changing last timestamp from: " + mp.lastTimestamp + " for " + componentName + "/" + mp.propertyname); mp.lastTimestamp = mp.lastTimestamp + 60*1000; mp.reader.reset(); mp.readBytes -= (line.length() + 1); break; } dataList.add(data); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } while(line!=null); try { mp.reader.close(); } catch (IOException e) { e.printStackTrace(); } doubleBlobDataSeqHelper.insert(blob.blobDataSeq, dataList.toArray(new doubleBlobData[0])); blobList.add(blob); } block.componentName = componentName; block.deviceSerialNumber = "123456"; block.startTime = new Date().getTime(); block.stopTime = new Date().getTime(); block.monitorBlobs = blobList.toArray(new MonitorBlob[blobList.size()]); blocks.add(block); } m_logger.fine("Returning " + blocks.size() + " MonitorDataBlocks"); return blocks.toArray(new MonitorDataBlock[blocks.size()]); } private doubleBlobData parseLine(String line) throws IOException, ParseException { String[] parts = line.split(" "); Date timestamp = formatter.parse(parts[0]); Double value = Double.valueOf(parts[1]); return new doubleBlobData(timestamp.getTime(), value); } }