X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=org.eclipse.linuxtools.ctf.core%2Fsrc%2Forg%2Feclipse%2Flinuxtools%2Fctf%2Fcore%2Ftrace%2FMetadata.java;h=27ca681d63be828d4c3e67c81b0d9a99f2ee895a;hb=a94410d92f16c8ce3870bb2e1538b93e038e4f78;hp=749bf393ba6f6b6bb04d764a77fa2e8b307f019a;hpb=3ef46b1ff117dd101012d66ab99ca3d538160fea;p=deliverable%2Ftracecompass.git diff --git a/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/Metadata.java b/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/Metadata.java index 749bf393ba..27ca681d63 100644 --- a/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/Metadata.java +++ b/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/Metadata.java @@ -27,18 +27,21 @@ import java.util.UUID; import org.antlr.runtime.ANTLRReaderStream; import org.antlr.runtime.CommonTokenStream; +import org.antlr.runtime.MismatchedTokenException; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.tree.CommonTree; -import org.eclipse.linuxtools.ctf.core.event.metadata.IOStructGen; -import org.eclipse.linuxtools.ctf.core.event.metadata.exceptions.ParseException; import org.eclipse.linuxtools.ctf.parser.CTFLexer; import org.eclipse.linuxtools.ctf.parser.CTFParser; import org.eclipse.linuxtools.ctf.parser.CTFParser.parse_return; +import org.eclipse.linuxtools.internal.ctf.core.event.metadata.IOStructGen; +import org.eclipse.linuxtools.internal.ctf.core.event.metadata.exceptions.ParseException; /** - * Metadata - *
- * Represents a metadata file + * The CTF trace metadata file + * + * @version 1.0 + * @author Matthew Khouzam + * @author Simon Marchi */ public class Metadata { @@ -49,12 +52,12 @@ public class Metadata { /** * Name of the metadata file in the trace directory */ - final String METADATA_FILENAME = "metadata"; //$NON-NLS-1$ + final static String METADATA_FILENAME = "metadata"; //$NON-NLS-1$ /** * Size of the metadata packet header, in bytes, computed by hand. */ - final int METADATA_PACKET_HEADER_SIZE = 37; + final static int METADATA_PACKET_HEADER_SIZE = 37; // ------------------------------------------------------------------------ // Attributes @@ -117,15 +120,13 @@ public class Metadata { * Parse the metadata file. * * @throws CTFReaderException + * If there was a problem parsing the metadata */ public void parse() throws CTFReaderException { - /* Open the file and get the FileChannel */ - FileChannel metadataFileChannel; - try { - metadataFileChannel = new FileInputStream(metadataFile).getChannel(); - } catch (FileNotFoundException e) { - throw new CTFReaderException("Cannot find metadata file!"); //$NON-NLS-1$ - } + CTFReaderException tempException = null; + + FileInputStream fis = null; + FileChannel metadataFileChannel = null; /* * Reader. It will contain a StringReader if we are using packet-based @@ -134,69 +135,96 @@ public class Metadata { */ Reader metadataTextInput = null; - /* Check if metadata is packet-based */ - if (isPacketBased(metadataFileChannel)) { - /* Create StringBuffer to receive metadata text */ - StringBuffer metadataText = new StringBuffer(); - - /* - * Read metadata packet one by one, appending the text to the - * StringBuffer - */ - MetadataPacketHeader packetHeader = readMetadataPacket( - metadataFileChannel, metadataText); - while (packetHeader != null) { - packetHeader = readMetadataPacket(metadataFileChannel, - metadataText); - } + try { + fis = new FileInputStream(metadataFile); + metadataFileChannel = fis.getChannel(); + + /* Check if metadata is packet-based */ + if (isPacketBased(metadataFileChannel)) { + /* Create StringBuffer to receive metadata text */ + StringBuffer metadataText = new StringBuffer(); - /* Wrap the metadata string with a StringReader */ - metadataTextInput = new StringReader(metadataText.toString()); - } else { - /* Wrap the metadata file with a FileReader */ - try { - metadataTextInput = new FileReader(metadataFile); - } catch (FileNotFoundException e) { /* - * We've already checked for this earlier. Why does StringReader - * not throw this too?? + * Read metadata packet one by one, appending the text to the + * StringBuffer */ - throw new CTFReaderException(e); + MetadataPacketHeader packetHeader = readMetadataPacket( + metadataFileChannel, metadataText); + while (packetHeader != null) { + packetHeader = readMetadataPacket(metadataFileChannel, + metadataText); + } + + /* Wrap the metadata string with a StringReader */ + metadataTextInput = new StringReader(metadataText.toString()); + } else { + /* Wrap the metadata file with a FileReader */ + metadataTextInput = new FileReader(metadataFile); } - } - /* Create an ANTLR reader */ - ANTLRReaderStream antlrStream; - try { - antlrStream = new ANTLRReaderStream(metadataTextInput); + CommonTree tree = createAST(metadataTextInput); + + /* Generate IO structures (declarations) */ + IOStructGen gen = new IOStructGen(tree, trace); + gen.generate(); + + } catch (FileNotFoundException e) { + tempException = new CTFReaderException("Cannot find metadata file!"); //$NON-NLS-1$ } catch (IOException e) { /* This would indicate a problem with the ANTLR library... */ - throw new CTFReaderException(e); + tempException = new CTFReaderException(e); + } catch (ParseException e) { + tempException = new CTFReaderException(e); + } catch (MismatchedTokenException e) { + tempException = new CTFReaderException(e); + } catch (RecognitionException e) { + tempException = new CTFReaderException(e); + } + + /* Ghetto resource management. Java 7 will deliver us from this... */ + if (metadataTextInput != null) { + try { + metadataTextInput.close(); + } catch (IOException e) { + // Do nothing + } + } + if (metadataFileChannel != null) { + try { + metadataFileChannel.close(); + } catch (IOException e) { + // Do nothing + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + // Do nothing + } + } + + if (tempException != null) { + throw tempException; } + } + + private static CommonTree createAST(Reader metadataTextInput) throws IOException, + RecognitionException { + /* Create an ANTLR reader */ + ANTLRReaderStream antlrStream; + antlrStream = new ANTLRReaderStream(metadataTextInput); /* Parse the metadata text and get the AST */ CTFLexer ctfLexer = new CTFLexer(antlrStream); CommonTokenStream tokens = new CommonTokenStream(ctfLexer); CTFParser ctfParser = new CTFParser(tokens, false); parse_return ret; - try { - ret = ctfParser.parse(); - } catch (RecognitionException e) { - /* - * We don't want to expose this ANTLR-specific exception type to the - * outside.. - */ - throw new CTFReaderException(e); - } - CommonTree tree = (CommonTree) ret.getTree(); - /* Generate IO structures (declarations) */ - IOStructGen gen = new IOStructGen(tree, trace); - try { - gen.generate(); - } catch (ParseException e) { - throw new CTFReaderException(e); - } + ret = ctfParser.parse(); + + CommonTree tree = (CommonTree) ret.getTree(); + return tree; } /** @@ -221,8 +249,7 @@ public class Metadata { try { metadataFileChannel.read(magicByteBuffer, 0); } catch (IOException e) { - throw new CTFReaderException( - "Unable to read metadata file channel."); //$NON-NLS-1$ + throw new CTFReaderException("Unable to read metadata file channel."); //$NON-NLS-1$ } /* Get the first int from the file */ @@ -324,8 +351,7 @@ public class Metadata { try { metadataFileChannel.read(payloadByteBuffer); } catch (IOException e) { - throw new CTFReaderException( - "Error reading metadata packet payload."); //$NON-NLS-1$ + throw new CTFReaderException("Error reading metadata packet payload."); //$NON-NLS-1$ } payloadByteBuffer.rewind();