package com.isti.traceview.data.ims; import gov.usgs.anss.cd11.CanadaException; import java.io.DataInput; import java.io.EOFException; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import com.isti.traceview.data.BufferedRandomAccessFile; public class IMSFile { public enum MessageType { DATA, REQUEST, SUBSCRIPTION }; private static final Logger logger = Logger.getLogger(IMSFile.class); //private static Pattern wid2Pattern = Pattern.compile("(\\w.)\\s.(\\S.)\\s.(\\S.)\\s."); private static Pattern msgTypePattern = Pattern.compile("^MSG_TYPE\\s+(\\S+)$"); private static Pattern msgIdPattern = Pattern.compile("^MSG_ID\\s+(\\S+\\.*)$"); private static Pattern refIdPattern = Pattern.compile("^REF_ID\\s+(\\S+\\.*)$"); private static Pattern prodIdPattern = Pattern.compile("^PROD_ID\\s+(\\S+\\.*)$"); @SuppressWarnings("unused") private String format_version = null; private MessageType msg_type = null; @SuppressWarnings("unused") private String msg_id = null; @SuppressWarnings("unused") private String ref_id = null; // msg_id of referenced message @SuppressWarnings("unused") private String prod_id = null; private List<DataType> dataTypes = new ArrayList<DataType>(); private IMSFile() { } public List<DataType> getDataTypes() { return dataTypes; } public static IMSFile read(DataInput inStream, boolean parseOnly) throws IOException, IMSFormatException, ParseException, CanadaException { IMSFile imsFile = new IMSFile(); BufferedRandomAccessFile input = (BufferedRandomAccessFile) inStream; try { while (true) { long filePointer = input.getFilePointer(); String line = input.readLine(); if((line == null) || (line.startsWith("STOP"))){ break; } String[] firstLineParts = line.split("\\s."); String tag = firstLineParts[0].toUpperCase(); if (tag.equals("BEGIN")) { imsFile.format_version = firstLineParts[1].trim(); imsFile.readMessageHeader(input, filePointer); if (imsFile.msg_type == MessageType.DATA) { imsFile.readDataTypes(parseOnly, input, filePointer); } else if (imsFile.msg_type == MessageType.REQUEST) { ; } else if (imsFile.msg_type == MessageType.SUBSCRIPTION) { ; } } else if (tag.equals("DATA_TYPE")) { input.seek(filePointer); imsFile.readDataTypes(parseOnly, input, filePointer); } else if (tag.equals("WID2")) { input.seek(filePointer); DataType dt = new DataTypeWaveform(filePointer); dt.read(input, parseOnly); imsFile.dataTypes.add(dt); } } } catch (EOFException e) { // Do nothing logger.error("EOFException:", e); } if(imsFile.dataTypes.size()==0){ throw new IMSFormatException("Data not found"); } return imsFile; } private void readMessageHeader(BufferedRandomAccessFile input, long startPointer) throws IOException, IMSFormatException, ParseException { long filePointer = 0; while (true) { filePointer = input.getFilePointer(); String line = input.readLine(); Matcher m = msgTypePattern.matcher(line); if (m.matches()) { String msg_type_str = m.group(1); if(msg_type_str.equals("DATA")){ msg_type = MessageType.DATA; } else if(msg_type_str.equals("REQUEST")){ msg_type = MessageType.REQUEST; } else if(msg_type_str.equals("SUBSCRIPTION")){ msg_type = MessageType.SUBSCRIPTION; } continue; } m = msgIdPattern.matcher(line); if (m.matches()) { msg_id = m.group(1); continue; } m = refIdPattern.matcher(line); if (m.matches()) { ref_id = m.group(1); continue; } m = prodIdPattern.matcher(line); if (m.matches()) { prod_id = m.group(1); continue; } if (line.toUpperCase().startsWith("DATA_TYPE") || line.toUpperCase().startsWith("STOP")) { input.seek(filePointer); break; } } } private void readDataTypes(boolean parseOnly, BufferedRandomAccessFile input, long startPointer) throws IOException, IMSFormatException, ParseException, CanadaException { long filePointer = 0; try { while (true) { filePointer = input.getFilePointer(); String line = input.readLine(); if ((line == null) || line.toUpperCase().startsWith("STOP")) { break; } if (line.toUpperCase().startsWith("DATA_TYPE")) { input.seek(filePointer); DataType dt = DataType.readHeader(input); dt.read(input, parseOnly); dataTypes.add(dt); } } } catch (EOFException e) { // Do nothing logger.error("EOFException:", e); } } }