You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(4) |
Nov
(7) |
Dec
(18) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(20) |
Feb
(7) |
Mar
|
Apr
(8) |
May
(9) |
Jun
(7) |
Jul
(23) |
Aug
(3) |
Sep
|
Oct
(16) |
Nov
|
Dec
(3) |
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(6) |
Jun
(8) |
Jul
|
Aug
|
Sep
|
Oct
(5) |
Nov
(2) |
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
(1) |
Oct
(30) |
Nov
|
Dec
|
2012 |
Jan
(4) |
Feb
(2) |
Mar
(1) |
Apr
(23) |
May
(4) |
Jun
|
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
(7) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
From: <ope...@li...> - 2009-08-28 20:35:28
|
Revision: 206 http://openfast.svn.sourceforge.net/openfast/?rev=206&view=rev Author: alohr Date: 2009-08-28 20:35:17 +0000 (Fri, 28 Aug 2009) Log Message: ----------- Allow to specify the multicast network interface used by the MulticastEndpoint Modified Paths: -------------- trunk/src/main/java/org/openfast/examples/OpenFastExample.java trunk/src/main/java/org/openfast/examples/consumer/Main.java trunk/src/main/java/org/openfast/session/multicast/MulticastEndpoint.java Modified: trunk/src/main/java/org/openfast/examples/OpenFastExample.java =================================================================== --- trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-12-16 20:25:55 UTC (rev 205) +++ trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2009-08-28 20:35:17 UTC (rev 206) @@ -13,6 +13,7 @@ protected static final String PORT = "port"; protected static final String PROTOCOL = "protocol"; protected static final String HOST = "host"; + protected static final String INTERFACE = "interface"; protected static final String ERROR = "error"; protected static final String NAMESPACE_AWARENESS = "ns"; protected static final String OUTPUT_FILE = "output"; Modified: trunk/src/main/java/org/openfast/examples/consumer/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-12-16 20:25:55 UTC (rev 205) +++ trunk/src/main/java/org/openfast/examples/consumer/Main.java 2009-08-28 20:35:17 UTC (rev 206) @@ -19,6 +19,7 @@ options.addOption("r", PROTOCOL, true, "Protocol [tcp|udp] defaults to tcp"); options.addOption("p", PORT, true, "Port to connect to"); options.addOption("h", HOST, true, "The host name of the server (or group name for multicast)"); + options.addOption("i", INTERFACE, true, "The ip address of the network interface to use"); options.addOption("e", ERROR, false, "Show stacktrace information"); options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); } @@ -38,10 +39,11 @@ Assert.assertTrue(cl.hasOption(PORT), "The required parameter \"" + PORT + "\" is missing."); int port = getInteger(cl, PORT); String host = cl.hasOption(HOST) ? cl.getOptionValue(HOST) : "localhost"; + String ifaddr = cl.hasOption(INTERFACE) ? cl.getOptionValue(INTERFACE) : null; if (cl.hasOption(PROTOCOL)) { if ("udp".equals(cl.getOptionValue(PROTOCOL))) { - endpoint = new MulticastEndpoint(port, host); + endpoint = new MulticastEndpoint(port, host, ifaddr); } } if (endpoint == null) { Modified: trunk/src/main/java/org/openfast/session/multicast/MulticastEndpoint.java =================================================================== --- trunk/src/main/java/org/openfast/session/multicast/MulticastEndpoint.java 2008-12-16 20:25:55 UTC (rev 205) +++ trunk/src/main/java/org/openfast/session/multicast/MulticastEndpoint.java 2009-08-28 20:35:17 UTC (rev 206) @@ -23,6 +23,7 @@ import java.io.IOException; import java.net.InetAddress; import java.net.MulticastSocket; +import java.net.SocketException; import org.openfast.session.Connection; import org.openfast.session.ConnectionListener; @@ -32,10 +33,16 @@ public class MulticastEndpoint implements Endpoint { private int port; private String group; + private String ifaddr; public MulticastEndpoint(int port, String group) { this.port = port; this.group = group; + this.ifaddr = null; } + public MulticastEndpoint(int port, String group, String ifaddr) { + this(port, group); + this.ifaddr = ifaddr; + } public void accept() throws FastConnectionException { throw new UnsupportedOperationException(); } @@ -43,6 +50,13 @@ public Connection connect() throws FastConnectionException { try { MulticastSocket socket = new MulticastSocket(port); + if (ifaddr != null) { + try { + socket.setInterface(InetAddress.getByName(ifaddr)); + } catch (SocketException e) { + throw new FastConnectionException(e); + } + } InetAddress groupAddress = InetAddress.getByName(group); socket.joinGroup(groupAddress); return new MulticastConnection(socket, groupAddress); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-12-16 20:26:03
|
Revision: 205 http://openfast.svn.sourceforge.net/openfast/?rev=205&view=rev Author: jacob_northey Date: 2008-12-16 20:25:55 +0000 (Tue, 16 Dec 2008) Log Message: ----------- [maven-release-plugin] prepare release openfast-1.0.1 Modified Paths: -------------- trunk/pom.xml Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2008-12-12 22:32:22 UTC (rev 204) +++ trunk/pom.xml 2008-12-16 20:25:55 UTC (rev 205) @@ -3,7 +3,7 @@ <groupId>org.openfast</groupId> <artifactId>openfast</artifactId> <packaging>jar</packaging> - <version>1.1.0-SNAPSHOT</version> + <version>1.0.1</version> <organization> <name>The LaSalle Technology Group, LLC</name> @@ -71,9 +71,9 @@ </issueManagement> <scm> - <connection>scm:svn:https://openfast.svn.sourceforge.net/svnroot/openfast/trunk</connection> - <developerConnection>scm:svn:https://openfast.svn.sourceforge.net/svnroot/openfast/trunk</developerConnection> - <url>http://openfast.svn.sourceforge.net/viewvc/openfast/trunk</url> + <connection>scm:svn:https://openfast.svn.sourceforge.net/svnroot/openfast/tags/openfast-1.0.1</connection> + <developerConnection>scm:svn:https://openfast.svn.sourceforge.net/svnroot/openfast/tags/openfast-1.0.1</developerConnection> + <url>http://openfast.svn.sourceforge.net/viewvc/openfast/tags/openfast-1.0.1</url> </scm> <mailingLists> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-12-12 22:32:32
|
Revision: 204 http://openfast.svn.sourceforge.net/openfast/?rev=204&view=rev Author: jacob_northey Date: 2008-12-12 22:32:22 +0000 (Fri, 12 Dec 2008) Log Message: ----------- Added interpret example submitted by Dale Wilson from OCI Added Paths: ----------- trunk/src/main/java/org/openfast/examples/interpret/ trunk/src/main/java/org/openfast/examples/interpret/FastMessageInterpreter.java trunk/src/main/java/org/openfast/examples/interpret/Main.java trunk/src/main/java/org/openfast/examples/util/ trunk/src/main/java/org/openfast/examples/util/FastMessageConsumer.java trunk/src/main/java/org/openfast/examples/util/FastMessageReader.java trunk/src/main/resources/interpret.bat trunk/src/main/resources/interpret.sh Added: trunk/src/main/java/org/openfast/examples/interpret/FastMessageInterpreter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/interpret/FastMessageInterpreter.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/interpret/FastMessageInterpreter.java 2008-12-12 22:32:22 UTC (rev 204) @@ -0,0 +1,150 @@ +/* + * Contributed to OpenFAST by Object Computing, Inc. + */ +package org.openfast.examples.interpret; + +import org.openfast.FieldValue; +import org.openfast.GroupValue; +import org.openfast.Message; +import org.openfast.SequenceValue; +import org.openfast.examples.util.FastMessageConsumer; +import org.openfast.template.Field; +import org.openfast.template.Group; +import org.openfast.template.MessageTemplate; +import org.openfast.template.Sequence; + +import java.io.OutputStream; +import java.io.PrintStream; + +/** + * Accept incoming, decoded FAST messages and display them on an outputStream. + * The field names, tags (ID's) and structure of the messages come from the + * template used to decode the message. + */ +public class FastMessageInterpreter implements FastMessageConsumer { + private final PrintStream outputStream; + private final String tab = " "; + private String indent = ""; + private long recordCount = 0L; + + /** + * Construct the consumer given an output stream to receive the results. + * @param outputStream where to write the results. + */ + public FastMessageInterpreter(OutputStream outputStream) { + this.outputStream = new PrintStream(outputStream); + } + + /** + * Accept each incoming message. + * Formats the message for display and writes to the output stream + * given to the constructor of this object. + * + * @param message A decoded FAST message + */ + public void accept(Message message) { +// outputStream.println(message.toString()); + recordCount += 1; + StringBuffer line = new StringBuffer(indent + "Record#" + recordCount + " "); + formatMessage(message, line); + outputStream.println(line); + } + + /** + * Display additional information related to the message. + * @param message the annotation. + */ + public void annotate(String message) { + outputStream.println(message); + } + + private void formatMessage(Message message, StringBuffer line) { + MessageTemplate template = message.getTemplate(); + line.append("Message template: ").append(template.getName()).append("->"); + boolean needNewLine = false; + int count = message.getFieldCount(); + for(int i = 0; i < count; ++i){ + if( message.isDefined(i)){ // skip missing optional fields + Field field = template.getField(i); + if(field instanceof Sequence){ + formatSequence(field, message.getSequence(i), line); + needNewLine = true; + } + else{ + String fieldName = field.getName(); + String fieldId = field.getId(); + String fieldValue = message.getValue(i).toString(); + if(needNewLine){ + line.append("\n").append(indent); + needNewLine = false; + } + /* 1.5 + line.append(String.format("%s{%s}=%s ", + fieldName, + fieldId, + fieldValue) + ); + */ + line.append(fieldName). + append('{').append(fieldId).append("}="). + append(fieldValue); + } + } + } + } + + private void formatSequence(Field sequenceField, SequenceValue sequenceValue, StringBuffer line){ + // get the (template) definition of this sequence + Sequence sequence = sequenceValue.getSequence(); + Group group = sequence.getGroup(); + int fieldCount = group.getFieldCount(); + String sequenceName = sequence.getName(); + + // Get the entries in this sequence + GroupValue[] entries = sequenceValue.getValues(); + + String oldIndent = indent; + indent = indent + tab; +/*1.5 + line.append(String.format("\n%s%s{%s} Sequence[%d]:", + indent, sequenceName, sequenceField.getId(), entries.length)); +*/ + line.append("\n").append(indent).append(sequenceName). + append('{').append(sequenceField.getId()).append("} Sequence["). + append(entries.length).append("]:"); + indent = indent + tab; + + boolean needNewLine = false; + for (int i = 0; i < entries.length; i++) { + GroupValue entry = entries[i]; + line.append("\n").append(indent); + // for each entry, iterate through the possible fields + for (int nField = 0; nField < fieldCount; ++nField) { + if (entry.isDefined(nField)) { // skip optional+missing fields + Field field = sequence.getField(nField); // definition + if (field instanceof Sequence) { + formatSequence(field, entry.getSequence(nField), line); + needNewLine = true; + } else { + if (needNewLine) { + line.append("\n").append(indent); + } + String fieldName = field.getName(); // name + String fieldId = field.getId(); // id (aka TAG) + FieldValue fieldValue = entry.getValue(nField); // value + /*1.5 + line.append(String.format("%s{%s}=%s ", + fieldName, + fieldId, + fieldValue.toString())); + */ + line.append(fieldName).append('{'). + append(fieldId).append("}="). + append(fieldValue.toString()).append("|"); + } + } + } + } + indent = oldIndent; + } +} Added: trunk/src/main/java/org/openfast/examples/interpret/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/interpret/Main.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/interpret/Main.java 2008-12-12 22:32:22 UTC (rev 204) @@ -0,0 +1,118 @@ +/* + * Contributed to OpenFAST by Object Computing, Inc. + */ +package org.openfast.examples.interpret; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; +import org.openfast.examples.util.FastMessageConsumer; +import org.openfast.examples.util.FastMessageReader; + +public class Main extends OpenFastExample { + private static final String COMMAND_NAME = "interpret"; + + private static final String HELP = "help"; + private static final String TEMPLATES = "template"; + private static final String INPUT = "input"; + private static final String OUTPUT = "output"; + private static final String EXPOSE = "raw"; + private static final String HEAD = "head"; + private static final String RESET = "reset"; + + private static Options options = new Options(); + + static { + options.addOption("?", HELP, false, "Displays this message"); + options.addOption("i", INPUT, true, "File containing raw FAST messages"); + options.addOption("t", TEMPLATES, true, "Message template definition file"); + options.addOption("o", OUTPUT, true, "File to receive interpreted messages"); + options.addOption("x", EXPOSE, false, "Show (some) raw data for each record."); + options.addOption("h", HEAD, true, "Process only the first 'n' records."); + options.addOption("r", RESET, false, "Reset decoder on every record"); + } + + /** + * Check to be sure a required option is present. + * This should be moved to OpenFastExample. + * @param cl The interpreted command line options. + * @param option The name of the required opotion + */ + static void required(CommandLine cl, String option){ + Assert.assertTrue(cl.hasOption(option), "The required option \"" + option + "\" is missing."); + } + + /** + * @param args See command line options added to "options" above. + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine(COMMAND_NAME, args, options); + if (cl.hasOption("help")) { + displayHelp(COMMAND_NAME, options); + System.exit(1); + } + + boolean showRawData = cl.hasOption(EXPOSE); + boolean resetEveryRecord = cl.hasOption(RESET); + + int head = 0; + if(cl.hasOption(HEAD)){ + head = getInteger(cl, HEAD); + } + + File inputFile = null; + File outputFile = null; + File templatesFile = null; + FastMessageConsumer consumer = null; + try { + required(cl, INPUT); + inputFile = getFile(cl, INPUT); + Assert.assertTrue(inputFile.exists(), "The input file \"" + inputFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!inputFile.isDirectory(), "The input file \"" + inputFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(inputFile.canRead(), "The input file \"" + inputFile.getAbsolutePath() + "\" is not readable."); + + required(cl, OUTPUT); + outputFile = getFile(cl, OUTPUT); + if(outputFile.exists()) + { + Assert.assertTrue(!outputFile.isDirectory(), "The output file \"" + inputFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(outputFile.canWrite(), "The output file \"" + inputFile.getAbsolutePath() + "\" is not writable."); + } + consumer = new FastMessageInterpreter(new FileOutputStream(outputFile)); + + required(cl, TEMPLATES); + templatesFile = getFile(cl, TEMPLATES); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + } catch (AssertionError e) { + System.out.println(e.getMessage()); + displayHelp(COMMAND_NAME, options); + System.exit(-1); + } catch (FileNotFoundException e) { + e.printStackTrace(); + displayHelp(COMMAND_NAME, options); + System.exit(-1); + } + + try { + FastMessageReader reader = new FastMessageReader( + new BufferedInputStream(new FileInputStream(inputFile)), + new BufferedInputStream(new FileInputStream(templatesFile)), + consumer); + reader.setHead(head); + reader.showRawData(showRawData); + reader.resetEveryRecord(resetEveryRecord); + + reader.start(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } +} Added: trunk/src/main/java/org/openfast/examples/util/FastMessageConsumer.java =================================================================== --- trunk/src/main/java/org/openfast/examples/util/FastMessageConsumer.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/util/FastMessageConsumer.java 2008-12-12 22:32:22 UTC (rev 204) @@ -0,0 +1,22 @@ +package org.openfast.examples.util; + +import org.openfast.Message; + +import java.io.PrintStream; + +/** + * An interface for objects that handle decoded FAST messages. + */ +public interface FastMessageConsumer { + /** + * Handle an incoming message + * @param message the message to be handled + */ + void accept(Message message); + + /** + * Add additonal information related to the message + * @param message the additional information + */ + void annotate(String message); +} Added: trunk/src/main/java/org/openfast/examples/util/FastMessageReader.java =================================================================== --- trunk/src/main/java/org/openfast/examples/util/FastMessageReader.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/util/FastMessageReader.java 2008-12-12 22:32:22 UTC (rev 204) @@ -0,0 +1,120 @@ +/* + * Contributed to OpenFAST by Object Computing, Inc. + */ +package org.openfast.examples.util; + +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.examples.util.FastMessageConsumer; +import org.openfast.codec.FastDecoder; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +import java.io.InputStream; +import java.io.BufferedInputStream; +import java.io.IOException; + +/** + * An object to decode incoming FAST messages and pas them to a FastMessageConsumer. + */ +public class FastMessageReader { + private final TemplateRegistry templateRegistry; + private final InputStream messageIn; + private final FastMessageConsumer messageOut; + private int head; + private boolean raw = false; + private boolean reset =false; + + /** + * Construct the reader. + * @param input a data stream containing raw FAST messages + * @param templateStream a stream from which the FAST templates can be read. + * @param output An object to accept the decoded messages. + */ + public FastMessageReader( + InputStream input, + InputStream templateStream, + FastMessageConsumer output) { + messageIn = input; + + XMLMessageTemplateLoader templateLoader = new XMLMessageTemplateLoader(); + templateLoader.setLoadTemplateIdFromAuxId(true); + templateLoader.load(templateStream); + templateRegistry = templateLoader.getTemplateRegistry(); + + messageOut = output; + } + + + public void start(){ + Context context = new Context(); + context.setTemplateRegistry(templateRegistry); + FastDecoder decoder = new FastDecoder(context, messageIn); + boolean more = true; + int recordNumber = 0; + if(this.head == 0){ + this.head = Integer.MAX_VALUE; + } + while (more && ++recordNumber < head) { + if(reset){ + decoder.reset(); + } + if(raw){ + try { + messageIn.mark(20); + byte[] sor = new byte[20]; + //noinspection ResultOfMethodCallIgnored + messageIn.read(sor, 0, 20); + StringBuffer b = new StringBuffer("Record# " + recordNumber); + for (int i = 0; i < sor.length; i++) { + byte aSor = sor[i]; +/*1.5 b.append(String.format(" %02x", aSor)); + */ + b.append(Integer.toHexString(aSor)); + } + messageOut.annotate(b.toString()); + messageIn.reset(); + } catch (IOException e) { + //noinspection EmptyCatchBlock + try{ + messageIn.mark(20); + }catch(Throwable t){} + } + } + + Message message = decoder.readMessage(); + if(message == null){ + more = false; + } + else{ + messageOut.accept(message); + } + } + } + + /** + * Limit the number of records to be processed + * @param count How many records to handle; zero means no limit. + */ + public void setHead(int count) { + head = count; + } + + /** + * Set flag to call the output annotate message with raw data in hex. + * @param flag true if the raw data should be provided. + */ + public void showRawData(boolean flag) { + raw = flag; + } + + /** + * Reset the decoder on every record. Some data feeds -- particularly those + * that use UDB or multicast expect the decoder to start freshe for each incoming + * record. This flag enables that behavior. + * @param resetEveryRecord true if each record should stand alone. + */ + public void resetEveryRecord(boolean resetEveryRecord) { + reset = resetEveryRecord; + } +} Added: trunk/src/main/resources/interpret.bat =================================================================== --- trunk/src/main/resources/interpret.bat (rev 0) +++ trunk/src/main/resources/interpret.bat 2008-12-12 22:32:22 UTC (rev 204) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\commons-cli-1.1.jar +set MAIN=org.openfast.examples.interpret.Main + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/interpret.sh =================================================================== --- trunk/src/main/resources/interpret.sh (rev 0) +++ trunk/src/main/resources/interpret.sh 2008-12-12 22:32:22 UTC (rev 204) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/commons-cli-1.1.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.interpret.Main +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-12-12 22:16:54
|
Revision: 203 http://openfast.svn.sourceforge.net/openfast/?rev=203&view=rev Author: jacob_northey Date: 2008-12-12 22:16:44 +0000 (Fri, 12 Dec 2008) Log Message: ----------- Added producer example and acceptance test data Modified Paths: -------------- trunk/src/main/java/org/openfast/session/tcp/TcpEndpoint.java trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv trunk/src/test/resources/acceptance/templates.xml Added Paths: ----------- trunk/src/main/java/org/openfast/examples/producer/ trunk/src/main/java/org/openfast/examples/producer/FastMessageProducer.java trunk/src/main/java/org/openfast/examples/producer/Main.java trunk/src/main/java/org/openfast/examples/producer/XmlCompressedMessageConverter.java trunk/src/main/resources/producer.bat trunk/src/main/resources/producer.sh trunk/src/test/resources/acceptance/MandatoryAsciiString.csv trunk/src/test/resources/acceptance/MandatoryUnsignedInteger32Fields.csv trunk/src/test/resources/acceptance/MandatoryUnsignedInteger64Fields.csv Added: trunk/src/main/java/org/openfast/examples/producer/FastMessageProducer.java =================================================================== --- trunk/src/main/java/org/openfast/examples/producer/FastMessageProducer.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/producer/FastMessageProducer.java 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1,93 @@ +package org.openfast.examples.producer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.openfast.Context; +import org.openfast.Global; +import org.openfast.Message; +import org.openfast.MessageOutputStream; +import org.openfast.error.ErrorHandler; +import org.openfast.session.Connection; +import org.openfast.session.ConnectionListener; +import org.openfast.session.Endpoint; +import org.openfast.session.FastConnectionException; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +public class FastMessageProducer implements ConnectionListener { + private final Endpoint endpoint; + private final TemplateRegistry templateRegistry; + private Thread acceptThread; + private List connections = new ArrayList(); + + public FastMessageProducer(Endpoint endpoint, File templatesFile) { + Global.setErrorHandler(ErrorHandler.NULL); + this.endpoint = endpoint; + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(); + loader.setLoadTemplateIdFromAuxId(true); + try { + loader.load(new FileInputStream(templatesFile)); + } catch (FileNotFoundException e) { + throw new RuntimeException(e.getMessage(), e); + } + this.templateRegistry = loader.getTemplateRegistry(); + } + + public void encode(File xmlDataFile) throws FastConnectionException, IOException { + XmlCompressedMessageConverter converter = new XmlCompressedMessageConverter(); + converter.setTemplateRegistry(templateRegistry); + List messages = converter.parse(new FileInputStream(xmlDataFile)); + while (true) { + for (int i=0; i<messages.size(); i++) { + Message message = (Message) messages.get(i); + for (int j=0; j<connections.size(); j++) { + MessageOutputStream out = (MessageOutputStream) connections.get(j); + out.writeMessage(message); + } + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + } + } + + public void start() { + System.out.println("Listening on " + endpoint); + if (acceptThread != null) return; + endpoint.setConnectionListener(this); + acceptThread = new Thread("Producer Accept Thread") { + public void run() { + try { + endpoint.accept(); + } catch (FastConnectionException e) { + System.out.println("Error occurred while listening for connections: " + e.getMessage()); + } + } + }; + acceptThread.start(); + } + + public void stop() { + endpoint.close(); + } + + public void onConnect(Connection connection) { + synchronized(connections) { + Context context = new Context(); + context.setErrorHandler(ErrorHandler.NULL); + context.setTemplateRegistry(templateRegistry); + try { + MessageOutputStream out = new MessageOutputStream(connection.getOutputStream(), context); + connections.add(out); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} + Added: trunk/src/main/java/org/openfast/examples/producer/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/producer/Main.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/producer/Main.java 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1,73 @@ +package org.openfast.examples.producer; + +import java.io.File; +import java.io.IOException; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; +import org.openfast.session.Endpoint; +import org.openfast.session.FastConnectionException; +import org.openfast.session.tcp.TcpEndpoint; + +public class Main extends OpenFastExample { + private static final String XML_DATA_FILE = "xml"; + private static Options options = new Options(); + + static { + options.addOption("?", HELP, false, "Displays this message"); + options.addOption("p", PORT, true, "Port to serve data on"); + options.addOption("h", HOST, true, "The host name of the server"); + options.addOption("e", ERROR, false, "Show stacktrace information"); + options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); + options.addOption("x", XML_DATA_FILE, true, "The XML data to convert to FAST"); + } + + /** + * @param args + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine("producer", args, options); + if (cl.hasOption(HELP)) { + displayHelp("producer", options); + } + Endpoint endpoint = null; + boolean showStacktrace = cl.hasOption(ERROR); + File templatesFile = null; + File xmlDataFile = null; + try { + Assert.assertTrue(cl.hasOption(PORT), "The required parameter \"" + PORT + "\" is missing."); + int port = getInteger(cl, PORT); + String host = cl.hasOption(HOST) ? cl.getOptionValue(HOST) : "localhost"; + + endpoint = new TcpEndpoint(host, port); + templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + xmlDataFile = getFile(cl, XML_DATA_FILE); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + } catch (AssertionError e) { + System.out.println(e.getMessage()); + displayHelp("consumer", options); + } + FastMessageProducer producer = new FastMessageProducer(endpoint, templatesFile); + try { + producer.start(); + producer.encode(xmlDataFile); + producer.stop(); + } catch (FastConnectionException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("Unable to connect to endpoint: " + e.getMessage()); + System.exit(1); + } catch (IOException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("An IO error occurred while consuming messages: " + e.getMessage()); + System.exit(1); + } + } +} Added: trunk/src/main/java/org/openfast/examples/producer/XmlCompressedMessageConverter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/producer/XmlCompressedMessageConverter.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/producer/XmlCompressedMessageConverter.java 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1,153 @@ +package org.openfast.examples.producer; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.openfast.FieldValue; +import org.openfast.GroupValue; +import org.openfast.Message; +import org.openfast.QName; +import org.openfast.SequenceValue; +import org.openfast.template.BasicTemplateRegistry; +import org.openfast.template.Field; +import org.openfast.template.Group; +import org.openfast.template.MessageTemplate; +import org.openfast.template.Sequence; +import org.openfast.template.TemplateRegistry; +import com.thoughtworks.xstream.converters.MarshallingContext; +import com.thoughtworks.xstream.io.HierarchicalStreamDriver; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; +import com.thoughtworks.xstream.io.xml.XppDriver; + +public class XmlCompressedMessageConverter { + private static final QName INSTANCE_NAME = new QName("instanceName", "http://www.lasalletech.com/fast/ext/1.0"); + protected TemplateRegistry templateRegistry = new BasicTemplateRegistry(); + + private final HierarchicalStreamDriver driver; + + public XmlCompressedMessageConverter() { + this(new XppDriver()); + } + + public XmlCompressedMessageConverter(HierarchicalStreamDriver driver) { + if (driver == null) + throw new NullPointerException(); + this.driver = driver; + } + + public List parse(InputStream in) { + HierarchicalStreamReader reader = driver.createReader(in); + return unmarshal(reader); + } + + public void serialize(List messages, OutputStream out) { + HierarchicalStreamWriter writer = driver.createWriter(out); + writer.startNode("messages"); + for (Iterator iter = messages.iterator(); iter.hasNext();) { + Message message = (Message) iter.next(); + marshal(message, writer, null); + } + writer.endNode(); + writer.close(); + } + + public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context) { + Message message = (Message) obj; + writer.startNode(message.getGroup().getName()); + writeGroup(writer, message); + writer.endNode(); + } + + private void writeGroup(HierarchicalStreamWriter writer, GroupValue groupValue) { + Field[] fields = groupValue.getGroup().getFields(); + for (int i=0; i<fields.length; i++) { + Field field = fields[i]; + if (!groupValue.isDefined(field.getName())) + continue; + if (field.getName().equals("templateId")) + continue; + writer.startNode(field.getName()); + if (field instanceof Group) { + writeGroup(writer, groupValue.getGroup(field.getName())); + } else if (field instanceof Sequence) { + String instanceName = field.getName(); + if (field.hasAttribute(INSTANCE_NAME)) + instanceName = field.getAttribute(INSTANCE_NAME); + SequenceValue sequenceValue = groupValue.getSequence(field.getName()); + GroupValue[] seqValues = sequenceValue.getValues(); + for (int j=0; j<seqValues.length; j++) { + writer.startNode(instanceName); + writeGroup(writer, seqValues[0]); + writer.endNode(); + } + } else { + writer.setValue(groupValue.getString(field.getName())); + } + writer.endNode(); + } + } + + public List unmarshal(HierarchicalStreamReader reader) { + if (reader.getNodeName().equals("messages")) { + List messages = new ArrayList(); + while (reader.hasMoreChildren()) { + reader.moveDown(); + if (!templateRegistry.isRegistered(reader.getNodeName())) + throw new IllegalArgumentException("The template named " + reader.getNodeName() + " is not defined."); + MessageTemplate template = templateRegistry.get(reader.getNodeName()); + Message message = (Message) template.createValue(null); + parseGroup(reader, template, message); + messages.add(message); + reader.moveUp(); + } + return messages; + } + return null; + } + + private void parseGroup(HierarchicalStreamReader reader, Group group, GroupValue groupValue) { + while (reader.hasMoreChildren()) { + reader.moveDown(); + Field field = group.getField(reader.getNodeName()); + FieldValue value = null; + if (field instanceof Group) { + Group currentGroup = (Group) field; + value = currentGroup.createValue(null); + parseGroup(reader, currentGroup, (GroupValue) value); + } else if (field instanceof Sequence) { + Sequence currentSequence = (Sequence) field; + value = currentSequence.createValue(null); + parseSequence(reader, currentSequence, (SequenceValue) value); + } else { + value = field.createValue(reader.getValue()); + } + groupValue.setFieldValue(field, value); + reader.moveUp(); + } + } + + private void parseSequence(HierarchicalStreamReader reader, Sequence sequence, SequenceValue value) { + while (reader.hasMoreChildren()) { + reader.moveDown(); + GroupValue current = (GroupValue) sequence.getGroup().createValue(null); + parseGroup(reader, sequence.getGroup(), current); + value.add(current); + reader.moveUp(); + } + } + + public boolean canConvert(Class clazz) { + return clazz.equals(Message.class); + } + + protected TemplateRegistry getTemplateRegistry() { + return templateRegistry; + } + + protected void setTemplateRegistry(TemplateRegistry templateRegistry) { + this.templateRegistry = templateRegistry; + } +} Modified: trunk/src/main/java/org/openfast/session/tcp/TcpEndpoint.java =================================================================== --- trunk/src/main/java/org/openfast/session/tcp/TcpEndpoint.java 2008-10-29 20:43:31 UTC (rev 202) +++ trunk/src/main/java/org/openfast/session/tcp/TcpEndpoint.java 2008-12-12 22:16:44 UTC (rev 203) @@ -78,4 +78,8 @@ serverSocket.close(); } catch (IOException e) {} } + + public String toString() { + return host + ":" + port; + } } Added: trunk/src/main/resources/producer.bat =================================================================== --- trunk/src/main/resources/producer.bat (rev 0) +++ trunk/src/main/resources/producer.bat 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\commons-cli-1.1.jar;%OPENFAST_HOME%\lib\xstream-1.3.jar;%OPENFAST_HOME%\lib\xpp3_min-1.1.4c.jar +set MAIN=org.openfast.examples.producer.Main + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/producer.sh =================================================================== --- trunk/src/main/resources/producer.sh (rev 0) +++ trunk/src/main/resources/producer.sh 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/commons-cli-1.1.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.consumer.Main +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file Added: trunk/src/test/resources/acceptance/MandatoryAsciiString.csv =================================================================== --- trunk/src/test/resources/acceptance/MandatoryAsciiString.csv (rev 0) +++ trunk/src/test/resources/acceptance/MandatoryAsciiString.csv 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1 @@ +None,Copy,CopyIBM,DefaultJSP,Delta,Constant,Tail,TailOrd,Encoded Modified: trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv =================================================================== --- trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv 2008-10-29 20:43:31 UTC (rev 202) +++ trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv 2008-12-12 22:16:44 UTC (rev 203) @@ -3,4 +3,5 @@ 1,0,0,-5,9223372036854775807,-9223372036854775808,0,100,1,2,808180 2,1,1,1,1,1,1,100,2147483647,2147483647,3fc082818181818181077f7f7fff077f7f7fff 3,1,1,1,1,1,1,100,2147483648,2147483648,8e8381818180 -4,1,1,1,1,1,2147482649,100,1,1,0fc084818181077f7f78988181 \ No newline at end of file +4,1,1,1,1,1,2147482649,100,1,1,0fc084818181077f7f78988181 +5,1,1,-5,9223372036854775807,-9223372036854775808,2147482648,100,2,2,8085ff \ No newline at end of file Added: trunk/src/test/resources/acceptance/MandatoryUnsignedInteger32Fields.csv =================================================================== --- trunk/src/test/resources/acceptance/MandatoryUnsignedInteger32Fields.csv (rev 0) +++ trunk/src/test/resources/acceptance/MandatoryUnsignedInteger32Fields.csv 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1,4 @@ +None,Copy,Copy4,Default37,DefaultMax,DefaultMin,Delta,Constant100,Increment,Increment1,Encoded +0,0,0,0,0,0,0,100,0,1,fd8380808080808080 +1,0,0,37,4294967295,0,0,100,1,2,808180 +2,1,1,1,1,1,1,100,4294967295,4294967295,3fc0828181818181810f7f7f7fff0f7f7f7fff \ No newline at end of file Added: trunk/src/test/resources/acceptance/MandatoryUnsignedInteger64Fields.csv =================================================================== --- trunk/src/test/resources/acceptance/MandatoryUnsignedInteger64Fields.csv (rev 0) +++ trunk/src/test/resources/acceptance/MandatoryUnsignedInteger64Fields.csv 2008-12-12 22:16:44 UTC (rev 203) @@ -0,0 +1,7 @@ +None,Copy,Copy4,Default37,DefaultMax,DefaultMin,Delta,Constant100,Increment,Increment1,Encoded +0,0,0,0,0,0,0,100,0,1,fd8480808080808080 +1,0,0,37,9223372036854775807,0,0,100,1,2,808180 +2,1,1,1,1,1,1,100,2147483647,2147483647,3fc082818181818181077f7f7fff077f7f7fff +3,1,1,1,1,1,1,100,2147483648,2147483648,8e8381818180 +4,1,1,1,1,1,2147482649,100,1,1,0fc084818181077f7f78988181 +5,1,1,37,9223372036854775807,0,2147482648,100,2,2,8085ff \ No newline at end of file Modified: trunk/src/test/resources/acceptance/templates.xml =================================================================== --- trunk/src/test/resources/acceptance/templates.xml 2008-10-29 20:43:31 UTC (rev 202) +++ trunk/src/test/resources/acceptance/templates.xml 2008-12-12 22:16:44 UTC (rev 203) @@ -61,4 +61,91 @@ <increment value="1"/> </int64> </template> + <template name="MandatoryUnsignedInteger32Fields" id="3"> + <typeRef name="UnsignedIntegerSet" ns="org.openfast"/> + <uInt32 name="None" id="1"/> + <uInt32 name="Copy" id="2"> + <copy/> + </uInt32> + <uInt32 name="Copy4" id="3"> + <copy value="4"/> + </uInt32> + <uInt32 name="Default37" id="4"> + <default value="37"/> + </uInt32> + <uInt32 name="DefaultMax" id="5"> + <default value="4294967295"/> + </uInt32> + <uInt32 name="DefaultMin" id="6"> + <default value="0"/> + </uInt32> + <uInt32 name="Delta" id="7"> + <delta/> + </uInt32> + <uInt32 name="Constant100" id="8"> + <constant value="100"/> + </uInt32> + <uInt32 name="Increment" id="9"> + <increment/> + </uInt32> + <uInt32 name="Increment1" id="9"> + <increment value="1"/> + </uInt32> + </template> + <template name="MandatoryUnsignedInteger64Fields" id="4"> + <typeRef name="IntegerSet" ns="org.openfast"/> + <uInt64 name="None" id="1"/> + <uInt64 name="Copy" id="2"> + <copy/> + </uInt64> + <uInt64 name="Copy4" id="3"> + <copy value="4"/> + </uInt64> + <uInt64 name="Default37" id="4"> + <default value="37"/> + </uInt64> + <uInt64 name="DefaultMax" id="5"> + <default value="9223372036854775807"/> + <!-- default value="18446744073709551615"/ --> + </uInt64> + <uInt64 name="DefaultMin" id="6"> + <default value="0"/> + </uInt64> + <uInt64 name="Delta" id="7"> + <delta/> + </uInt64> + <uInt64 name="Constant100" id="8"> + <constant value="100"/> + </uInt64> + <uInt64 name="Increment" id="9"> + <increment/> + </uInt64> + <uInt64 name="Increment1" id="9"> + <increment value="1"/> + </uInt64> + </template> + <template name="MandatoryAsciiString"> + <string name="None"/> + <string name="Copy"> + <copy/> + </string> + <string name="CopyIBM"> + <copy value="IBM"/> + </string> + <string name="DefaultJSP"> + <default value="JSP"/> + </string> + <string name="Delta"> + <delta/> + </string> + <string name="Constant"> + <constant value="FIX.4.4"/> + </string> + <string name="Tail"> + <tail/> + </string> + <string name="TailOrd"> + <tail value="ord001"/> + </string> + </template> </templates> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-29 20:43:36
|
Revision: 202 http://openfast.svn.sourceforge.net/openfast/?rev=202&view=rev Author: jacob_northey Date: 2008-10-29 20:43:31 +0000 (Wed, 29 Oct 2008) Log Message: ----------- [FAST-15] Fixed integer overflows in increment and delta operator Added encoding/decoding acceptance tests Modified Paths: -------------- trunk/src/main/java/org/openfast/ByteUtil.java trunk/src/main/java/org/openfast/GroupValue.java trunk/src/main/java/org/openfast/IntegerValue.java trunk/src/main/java/org/openfast/template/loader/GroupParser.java trunk/src/main/java/org/openfast/template/loader/TemplateParser.java trunk/src/test/java/org/openfast/IntegerValueTest.java Added Paths: ----------- trunk/src/test/java/org/openfast/acceptance/ trunk/src/test/java/org/openfast/acceptance/EncodingDecodingAcceptanceTest.java trunk/src/test/resources/acceptance/ trunk/src/test/resources/acceptance/MandatorySignedInteger32Fields.csv trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv trunk/src/test/resources/acceptance/templates.xml Modified: trunk/src/main/java/org/openfast/ByteUtil.java =================================================================== --- trunk/src/main/java/org/openfast/ByteUtil.java 2008-10-29 15:21:46 UTC (rev 201) +++ trunk/src/main/java/org/openfast/ByteUtil.java 2008-10-29 20:43:31 UTC (rev 202) @@ -54,6 +54,17 @@ } return bytes; } + + public static String convertByteArrayToHexString(byte[] value) { + StringBuffer builder = new StringBuffer(value.length * 2); + for (int i = 0; i < value.length; i++) { + String hex = Integer.toHexString(value[i] & 0xff); + if (hex.length() == 1) + builder.append('0'); + builder.append(hex); + } + return builder.toString(); + } /** * Modified: trunk/src/main/java/org/openfast/GroupValue.java =================================================================== --- trunk/src/main/java/org/openfast/GroupValue.java 2008-10-29 15:21:46 UTC (rev 201) +++ trunk/src/main/java/org/openfast/GroupValue.java 2008-10-29 20:43:31 UTC (rev 202) @@ -249,7 +249,7 @@ } public void setString(int fieldIndex, String value) { - values[fieldIndex] = new StringValue(value); + values[fieldIndex] = group.getField(fieldIndex).createValue(value); } public void setString(String fieldName, String value) { Modified: trunk/src/main/java/org/openfast/IntegerValue.java =================================================================== --- trunk/src/main/java/org/openfast/IntegerValue.java 2008-10-29 15:21:46 UTC (rev 201) +++ trunk/src/main/java/org/openfast/IntegerValue.java 2008-10-29 20:43:31 UTC (rev 202) @@ -52,10 +52,14 @@ } public NumericValue increment() { + if (value == Integer.MAX_VALUE) + return new LongValue(value + 1L); return new IntegerValue(value + 1); } public NumericValue decrement() { + if (value == Integer.MIN_VALUE) + return new LongValue(value - 1L); return new IntegerValue(value - 1); } @@ -67,10 +71,10 @@ } public NumericValue add(NumericValue addend) { - if (addend instanceof LongValue) { - return addend.add(this); - } - return new IntegerValue(this.value + addend.toInt()); + long total = value + addend.toLong(); + if (total <= Integer.MAX_VALUE && total >= Integer.MIN_VALUE) + return new IntegerValue((int) total); + return new LongValue(total); } public String serialize() { Modified: trunk/src/main/java/org/openfast/template/loader/GroupParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/GroupParser.java 2008-10-29 15:21:46 UTC (rev 201) +++ trunk/src/main/java/org/openfast/template/loader/GroupParser.java 2008-10-29 20:43:31 UTC (rev 202) @@ -54,7 +54,7 @@ group.setChildNamespace(context.getNamespace()); if (groupElement.hasAttribute("id")) group.setId(groupElement.getAttribute("id")); - group.setTypeReference(getTypeReference(groupElement)); + group.setTypeReference(getTypeReference(groupElement, context)); parseExternalAttributes(groupElement, group); } @@ -88,12 +88,13 @@ * * @param templateTag * The dom element object + * @param context * @return Returns a string of the TypeReference from the passed element dom * object */ - protected static QName getTypeReference(Element templateTag) { + protected static QName getTypeReference(Element templateTag, ParsingContext context) { String typeReference = null; - String typeRefNs = ""; + String typeRefNs = context.getNamespace(); NodeList typeReferenceTags = templateTag.getElementsByTagName("typeRef"); if (typeReferenceTags.getLength() > 0) { Element messageRef = (Element) typeReferenceTags.item(0); Modified: trunk/src/main/java/org/openfast/template/loader/TemplateParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/TemplateParser.java 2008-10-29 15:21:46 UTC (rev 201) +++ trunk/src/main/java/org/openfast/template/loader/TemplateParser.java 2008-10-29 20:43:31 UTC (rev 202) @@ -21,8 +21,6 @@ package org.openfast.template.loader; import org.openfast.QName; -import org.openfast.error.FastConstants; -import org.openfast.error.FastException; import org.openfast.template.Field; import org.openfast.template.MessageTemplate; import org.w3c.dom.Element; Modified: trunk/src/test/java/org/openfast/IntegerValueTest.java =================================================================== --- trunk/src/test/java/org/openfast/IntegerValueTest.java 2008-10-29 15:21:46 UTC (rev 201) +++ trunk/src/test/java/org/openfast/IntegerValueTest.java 2008-10-29 20:43:31 UTC (rev 202) @@ -1,57 +1,70 @@ package org.openfast; import java.math.BigDecimal; - import org.openfast.error.FastConstants; import org.openfast.error.FastException; import org.openfast.test.OpenFastTestCase; public class IntegerValueTest extends OpenFastTestCase { + public void testAddOverflowToLong() { + IntegerValue maxValue = new IntegerValue(Integer.MAX_VALUE); + assertEquals(2147483648L, maxValue.add(new IntegerValue(1)).toLong()); + } + + public void testIncrementOverflowToLong() { + IntegerValue maxValue = new IntegerValue(Integer.MAX_VALUE); + assertEquals(2147483648L, maxValue.increment().toLong()); + } + + public void testDecrementOverflowToLong() { + IntegerValue minValue = new IntegerValue(Integer.MIN_VALUE); + assertEquals(-2147483649L, minValue.decrement().toLong()); + + } - public void testToInt() { - assertEquals(125, i(125).toInt()); - } + public void testToInt() { + assertEquals(125, i(125).toInt()); + } - public void testToLong() { - assertEquals(125L, i(125).toLong()); - } + public void testToLong() { + assertEquals(125L, i(125).toLong()); + } - public void testToString() { - assertEquals("105", i(105).toString()); - } + public void testToString() { + assertEquals("105", i(105).toString()); + } - public void testToByte() { - assertEquals(0x7f, i(127).toByte()); - } - - public void testToByteWithLargeInt() { - try { - i(128).toByte(); - fail(); - } catch (FastException e) { - assertEquals(FastConstants.R4_NUMERIC_VALUE_TOO_LARGE, e.getCode()); - } - } + public void testToByte() { + assertEquals(0x7f, i(127).toByte()); + } - public void testToShort() { - assertEquals((short) 32767, i(32767).toShort()); - } - - public void testToShortWithLargeInt() { - try { - i(32768).toByte(); - fail(); - } catch (FastException e) { - assertEquals(FastConstants.R4_NUMERIC_VALUE_TOO_LARGE, e.getCode()); - } - } + public void testToByteWithLargeInt() { + try { + i(128).toByte(); + fail(); + } catch (FastException e) { + assertEquals(FastConstants.R4_NUMERIC_VALUE_TOO_LARGE, e.getCode()); + } + } - public void testToDouble() { - assertEquals(125.0, i(125).toDouble(), 0.1); - } + public void testToShort() { + assertEquals((short) 32767, i(32767).toShort()); + } - public void testToBigDecimal() { - assertEquals(new BigDecimal("125"), i(125).toBigDecimal()); - } + public void testToShortWithLargeInt() { + try { + i(32768).toByte(); + fail(); + } catch (FastException e) { + assertEquals(FastConstants.R4_NUMERIC_VALUE_TOO_LARGE, e.getCode()); + } + } + public void testToDouble() { + assertEquals(125.0, i(125).toDouble(), 0.1); + } + + public void testToBigDecimal() { + assertEquals(new BigDecimal("125"), i(125).toBigDecimal()); + } } Added: trunk/src/test/java/org/openfast/acceptance/EncodingDecodingAcceptanceTest.java =================================================================== --- trunk/src/test/java/org/openfast/acceptance/EncodingDecodingAcceptanceTest.java (rev 0) +++ trunk/src/test/java/org/openfast/acceptance/EncodingDecodingAcceptanceTest.java 2008-10-29 20:43:31 UTC (rev 202) @@ -0,0 +1,77 @@ +package org.openfast.acceptance; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import org.openfast.ByteUtil; +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.codec.FastDecoder; +import org.openfast.codec.FastEncoder; +import org.openfast.template.MessageTemplate; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; +import org.openfast.test.OpenFastTestCase; + +public class EncodingDecodingAcceptanceTest extends OpenFastTestCase { + public void testEncoding() throws IOException { + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(true); + loader.setLoadTemplateIdFromAuxId(true); + loader.load(getAcceptanceTestTemplates()); + TemplateRegistry registry = loader.getTemplateRegistry(); + MessageTemplate[] templates = registry.getTemplates(); + for (int i=0; i<templates.length; i++) { + InputStream dataForTemplate = getDataForTemplate(templates[i]); + if (dataForTemplate != null) { + encode(registry, templates[i], dataForTemplate); + } + } + } + + private void encode(TemplateRegistry registry, MessageTemplate template, InputStream dataForTemplate) throws IOException { + Context encodingContext = new Context(); + Context decodingContext = new Context(); + encodingContext.setTemplateRegistry(registry); + decodingContext.setTemplateRegistry(registry); + FastEncoder encoder = new FastEncoder(encodingContext); + BufferedReader reader = new BufferedReader(new InputStreamReader(dataForTemplate)); + String line = reader.readLine(); // Read header + while ((line = reader.readLine()) != null) { + String[] entries = line.split(","); + Message message = createMessage(template, entries); + byte[] encoded = encoder.encode(message); + String expected = entries[entries.length-1].trim(); + assertEncoding(expected, encoded); + assertDecoding(message, decodingContext, expected); + } + } + + private void assertDecoding(Message message, Context decodingContext, String expected) { + ByteArrayInputStream byteIn = new ByteArrayInputStream(ByteUtil.convertHexStringToByteArray(expected)); + FastDecoder decoder = new FastDecoder(decodingContext, byteIn); + assertEquals(message, decoder.readMessage()); + } + + private void assertEncoding(String expected, byte[] encoded) { + String actual = ByteUtil.convertByteArrayToHexString(encoded); + assertEquals(expected, actual); + } + + private Message createMessage(MessageTemplate template, String[] entries) { + Message message = new Message(template); + for (int i=0; i<entries.length-1; i++) { + message.setString(i+1, entries[i].trim()); + } + return message; + } + + private InputStream getDataForTemplate(MessageTemplate messageTemplate) { + return this.getClass().getClassLoader().getResourceAsStream("acceptance/" + messageTemplate.getName() + ".csv"); + } + + private InputStream getAcceptanceTestTemplates() { + return this.getClass().getClassLoader().getResourceAsStream("acceptance/templates.xml"); + } +} Added: trunk/src/test/resources/acceptance/MandatorySignedInteger32Fields.csv =================================================================== --- trunk/src/test/resources/acceptance/MandatorySignedInteger32Fields.csv (rev 0) +++ trunk/src/test/resources/acceptance/MandatorySignedInteger32Fields.csv 2008-10-29 20:43:31 UTC (rev 202) @@ -0,0 +1,4 @@ +None,Copy,Copy4,DefaultMinus5,DefaultMax,DefaultMin,Delta,Constant100,Increment,Increment1,Encoded +0,0,0,0,0,0,0,100,0,1,ff818080808080808080 +1,0,0,-5,2147483647,-2147483648,0,100,1,2,808180 +2,1,1,1,1,1,1,100,2147483647,2147483647,3fc082818181818181077f7f7fff077f7f7fff \ No newline at end of file Added: trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv =================================================================== --- trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv (rev 0) +++ trunk/src/test/resources/acceptance/MandatorySignedInteger64Fields.csv 2008-10-29 20:43:31 UTC (rev 202) @@ -0,0 +1,6 @@ +None,Copy,Copy4,DefaultMinus5,DefaultMax,DefaultMin,Delta,Constant100,Increment,Increment1,Encoded +0,0,0,0,0,0,0,100,0,1,ff828080808080808080 +1,0,0,-5,9223372036854775807,-9223372036854775808,0,100,1,2,808180 +2,1,1,1,1,1,1,100,2147483647,2147483647,3fc082818181818181077f7f7fff077f7f7fff +3,1,1,1,1,1,1,100,2147483648,2147483648,8e8381818180 +4,1,1,1,1,1,2147482649,100,1,1,0fc084818181077f7f78988181 \ No newline at end of file Added: trunk/src/test/resources/acceptance/templates.xml =================================================================== --- trunk/src/test/resources/acceptance/templates.xml (rev 0) +++ trunk/src/test/resources/acceptance/templates.xml 2008-10-29 20:43:31 UTC (rev 202) @@ -0,0 +1,64 @@ +<templates ns="http://www.openfast.org" templateNs="http://www.openfast.org/templates" xmlns="http://www.fixprotocol.org/ns/fast/td/1.1"> + <template name="MandatorySignedInteger32Fields" id="1"> + <typeRef name="IntegerSet" ns="org.openfast"/> + <int32 name="None" id="1"/> + <int32 name="Copy" id="2"> + <copy/> + </int32> + <int32 name="Copy4" id="3"> + <copy value="4"/> + </int32> + <int32 name="DefaultMinus5" id="4"> + <default value="-5"/> + </int32> + <int32 name="DefaultMax" id="5"> + <default value="2147483647"/> + </int32> + <int32 name="DefaultMin" id="6"> + <default value="-2147483648"/> + </int32> + <int32 name="Delta" id="7"> + <delta/> + </int32> + <int32 name="Constant100" id="8"> + <constant value="100"/> + </int32> + <int32 name="Increment" id="9"> + <increment/> + </int32> + <int32 name="Increment1" id="9"> + <increment value="1"/> + </int32> + </template> + <template name="MandatorySignedInteger64Fields" id="2"> + <typeRef name="IntegerSet" ns="org.openfast"/> + <int64 name="None" id="1"/> + <int64 name="Copy" id="2"> + <copy/> + </int64> + <int64 name="Copy4" id="3"> + <copy value="4"/> + </int64> + <int64 name="DefaultMinus5" id="4"> + <default value="-5"/> + </int64> + <int64 name="DefaultMax" id="5"> + <default value="9223372036854775807"/> + </int64> + <int64 name="DefaultMin" id="6"> + <default value="-9223372036854775808"/> + </int64> + <int64 name="Delta" id="7"> + <delta/> + </int64> + <int64 name="Constant100" id="8"> + <constant value="100"/> + </int64> + <int64 name="Increment" id="9"> + <increment/> + </int64> + <int64 name="Increment1" id="9"> + <increment value="1"/> + </int64> + </template> +</templates> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-29 15:21:49
|
Revision: 201 http://openfast.svn.sourceforge.net/openfast/?rev=201&view=rev Author: jacob_northey Date: 2008-10-29 15:21:46 +0000 (Wed, 29 Oct 2008) Log Message: ----------- [FAST-11] Added full length parsing in when loading message templates from XML [FAST-12] Added support for foreign elements in XML Modified Paths: -------------- trunk/src/main/java/org/openfast/ByteVectorValue.java trunk/src/main/java/org/openfast/ScalarValue.java trunk/src/main/java/org/openfast/error/FastConstants.java trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java trunk/src/main/java/org/openfast/template/Field.java trunk/src/main/java/org/openfast/template/Group.java trunk/src/main/java/org/openfast/template/loader/AbstractFieldParser.java trunk/src/main/java/org/openfast/template/loader/VariableLengthScalarParser.java trunk/src/main/java/org/openfast/template/operator/TailOperatorCodec.java trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java trunk/src/main/java/org/openfast/template/type/ByteVectorType.java trunk/src/main/java/org/openfast/template/type/Type.java trunk/src/main/java/org/openfast/util/Util.java trunk/src/test/java/org/openfast/ByteVectorValueTest.java trunk/src/test/java/org/openfast/session/template/exchange/VariableLengthInstructionConverterTest.java trunk/src/test/java/org/openfast/template/operator/TailOperatorCodecTest.java trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/SequenceSerializerTest.java trunk/src/test/java/org/openfast/template/type/StringTypeTest.java Added Paths: ----------- trunk/src/main/java/org/openfast/Node.java trunk/src/main/java/org/openfast/SimpleNode.java trunk/src/main/java/org/openfast/template/serializer/VariableLengthScalarSerializer.java trunk/src/test/java/org/openfast/template/serializer/VariableLengthScalarSerializerTest.java Modified: trunk/src/main/java/org/openfast/ByteVectorValue.java =================================================================== --- trunk/src/main/java/org/openfast/ByteVectorValue.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/ByteVectorValue.java 2008-10-29 15:21:46 UTC (rev 201) @@ -40,15 +40,19 @@ public byte[] getBytes() { return value; } + + public String serialize() { + StringBuffer builder = new StringBuffer(value.length * 2); + for (int i = 0; i < value.length; i++) { + String hex = Integer.toHexString(value[i] & 0xff); + if (hex.length() == 1) + builder.append('0'); + builder.append(hex); + } + return builder.toString(); + } public String toString() { -// StringBuffer builder = new StringBuffer(value.length * 2); -// for (int i = 0; i < value.length; i++) { -// String hex = Integer.toHexString(value[i]); -// if (hex.length() == 1) -// builder.append('0'); -// builder.append(hex); -// } return new String(value, offset, length); } Added: trunk/src/main/java/org/openfast/Node.java =================================================================== --- trunk/src/main/java/org/openfast/Node.java (rev 0) +++ trunk/src/main/java/org/openfast/Node.java 2008-10-29 15:21:46 UTC (rev 201) @@ -0,0 +1,18 @@ +package org.openfast; + +import java.util.List; +import java.util.Map; + +public interface Node { + List getNodes(); + List getChildren(QName name); + String getAttribute(QName name); + + QName getNodeName(); + Map getAttributes(); + boolean hasAttribute(QName name); + boolean hasChild(QName name); + + void addNode(Node node); + void setAttribute(QName name, String value); +} Modified: trunk/src/main/java/org/openfast/ScalarValue.java =================================================================== --- trunk/src/main/java/org/openfast/ScalarValue.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/ScalarValue.java 2008-10-29 15:21:46 UTC (rev 201) @@ -94,6 +94,10 @@ public String toString() { throw new UnsupportedOperationException(); } + + public String serialize() { + return toString(); + } public byte[] getBytes() { throw new UnsupportedOperationException(); Added: trunk/src/main/java/org/openfast/SimpleNode.java =================================================================== --- trunk/src/main/java/org/openfast/SimpleNode.java (rev 0) +++ trunk/src/main/java/org/openfast/SimpleNode.java 2008-10-29 15:21:46 UTC (rev 201) @@ -0,0 +1,74 @@ +package org.openfast; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SimpleNode implements Node { + private List nodes = Collections.EMPTY_LIST; + protected Map attributes = Collections.EMPTY_MAP; + protected final QName name; + + public SimpleNode(QName nodeName) { + this.name = nodeName; + } + + public void addNode(Node node) { + if (nodes.isEmpty()) + nodes = new ArrayList(3); + nodes.add(node); + } + + public List getNodes() { + return nodes; + } + + public String getAttribute(QName name) { + return (String) attributes.get(name); + } + + public Map getAttributes() { + return attributes; + } + + public List getChildren(QName name) { + List children = Collections.EMPTY_LIST; + for (int i=0; i<nodes.size() && name != null; i++) { + Node child = (Node)nodes.get(i); + if (name.equals(child.getNodeName())) { + if (children.isEmpty()) { + children = new ArrayList(); + } + children.add(nodes.get(i)); + } + } + return children; + } + + public QName getNodeName() { + return name; + } + + public void setAttribute(QName name, String value) { + if (attributes.isEmpty()) { + attributes = new HashMap(); + } + attributes.put(name, value); + } + + public boolean hasAttribute(QName name) { + return attributes.containsKey(name); + } + + public boolean hasChild(QName name) { + for (int i=0; i<nodes.size() && name != null; i++) { + Node child = (Node)nodes.get(i); + if (name.equals(child.getNodeName())) { + return true; + } + } + return false; + } +} Modified: trunk/src/main/java/org/openfast/error/FastConstants.java =================================================================== --- trunk/src/main/java/org/openfast/error/FastConstants.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/error/FastConstants.java 2008-10-29 15:21:46 UTC (rev 201) @@ -70,6 +70,9 @@ ErrorCode PARSE_ERROR = new ErrorCode(DYNAMIC, 103, "PARSEERR", "An exception occurred while parsing.", ERROR); String TEMPLATE_DEFINITION_1_1 = "http://www.fixprotocol.org/ns/fast/td/1.1"; QName LENGTH_FIELD = new QName("length", TEMPLATE_DEFINITION_1_1); + QName LENGTH_NAME_ATTR = new QName("name", TEMPLATE_DEFINITION_1_1); + QName LENGTH_NS_ATTR = new QName("namespace", TEMPLATE_DEFINITION_1_1); + QName LENGTH_ID_ATTR = new QName("id", TEMPLATE_DEFINITION_1_1); ErrorHandler BASIC_ERROR_HANDLER = new ErrorHandler() { public void error(ErrorCode code, String message) { if (REPORTABLE.equals(code.getType())) Modified: trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java 2008-10-29 15:21:46 UTC (rev 201) @@ -34,7 +34,7 @@ xmlTemplateLoader.load(this.getClass().getResourceAsStream("xmlOverFastTemplates.xml")); this.templateRegistry = xmlTemplateLoader.getTemplateRegistry(); this.elementTemplate = templateRegistry.get("element"); - this.nodeNameIdx = elementTemplate.getFieldIndex("nodeName"); + this.nodeNameIdx = elementTemplate.getFieldIndex("name"); this.attributesIdx = elementTemplate.getFieldIndex("attributes"); Sequence attributesSequence = elementTemplate.getSequence("attributes"); this.attributeNameIdx = attributesSequence.getGroup().getFieldIndex("name"); Modified: trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java 2008-10-29 15:21:46 UTC (rev 201) @@ -35,7 +35,7 @@ xmlTemplateLoader.load(this.getClass().getResourceAsStream("xmlOverFastTemplates.xml")); this.templateRegistry = xmlTemplateLoader.getTemplateRegistry(); this.elementTemplate = templateRegistry.get("element"); - this.nodeNameIdx = elementTemplate.getFieldIndex("nodeName"); + this.nodeNameIdx = elementTemplate.getFieldIndex("name"); this.attributesIdx = elementTemplate.getFieldIndex("attributes"); this.childrenSequence = elementTemplate.getSequence("children"); this.attributesSequence = elementTemplate.getSequence("attributes"); Modified: trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-29 15:21:46 UTC (rev 201) @@ -231,7 +231,7 @@ } }; static { - FAST_RESET_TEMPLATE.addAttribute(RESET_PROPERTY, "yes"); + FAST_RESET_TEMPLATE.setAttribute(RESET_PROPERTY, "yes"); } /** * ************************ MESSAGE HANDLERS Modified: trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java 2008-10-29 15:21:46 UTC (rev 201) @@ -21,6 +21,8 @@ package org.openfast.session.template.exchange; import org.openfast.GroupValue; +import org.openfast.Node; +import org.openfast.QName; import org.openfast.error.FastConstants; import org.openfast.session.SessionControlProtocol_1_1; import org.openfast.template.Field; @@ -28,12 +30,19 @@ import org.openfast.template.Scalar; import org.openfast.template.TemplateRegistry; import org.openfast.template.type.Type; +import org.openfast.util.Util; public class VariableLengthInstructionConverter extends ScalarConverter { public Field convert(GroupValue fieldDef, TemplateRegistry templateRegistry, ConversionContext context) { Scalar scalar = (Scalar) super.convert(fieldDef, templateRegistry, context); if (fieldDef.isDefined("Length")) { - scalar.addAttribute(FastConstants.LENGTH_FIELD, fieldDef.getGroup("Length").getString("Name")); + GroupValue lengthDef = fieldDef.getGroup("Length"); + String lengthName = lengthDef.getString("Name"); + String lengthNs = ""; + if (lengthDef.isDefined("Ns")) + lengthNs = lengthDef.getString("Ns"); + String id = lengthDef.getString("AuxId"); + scalar.addNode(Util.createLength(new QName(lengthName, lengthNs), id)); } return scalar; } @@ -41,10 +50,13 @@ public GroupValue convert(Field field, ConversionContext context) { Scalar scalar = (Scalar) field; GroupValue fieldDef = super.convert(field, context); - if (scalar.hasAttribute(FastConstants.LENGTH_FIELD)) { + if (scalar.hasChild(FastConstants.LENGTH_FIELD)) { + Node lengthNode = (Node) scalar.getChildren(FastConstants.LENGTH_FIELD).get(0); GroupValue lengthDef = new GroupValue(fieldDef.getGroup().getGroup("Length")); - lengthDef.setString("Ns", ""); // TODO - Need to handle full Length definition - lengthDef.setString("Name", scalar.getAttribute(FastConstants.LENGTH_FIELD)); + lengthDef.setString("Ns", lengthNode.getAttribute(FastConstants.LENGTH_NS_ATTR)); + lengthDef.setString("Name", lengthNode.getAttribute(FastConstants.LENGTH_NAME_ATTR)); + if (lengthNode.hasAttribute(FastConstants.LENGTH_ID_ATTR)) + lengthDef.setString("AuxId", lengthNode.getAttribute(FastConstants.LENGTH_ID_ATTR)); fieldDef.setFieldValue("Length", lengthDef); } return fieldDef; Modified: trunk/src/main/java/org/openfast/template/Field.java =================================================================== --- trunk/src/main/java/org/openfast/template/Field.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/Field.java 2008-10-29 15:21:46 UTC (rev 201) @@ -22,21 +22,18 @@ import java.io.InputStream; import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; import org.openfast.BitVectorBuilder; import org.openfast.BitVectorReader; import org.openfast.Context; import org.openfast.FieldValue; import org.openfast.QName; +import org.openfast.SimpleNode; -public abstract class Field implements Serializable { +public abstract class Field extends SimpleNode implements Serializable { private static final long serialVersionUID = 1L; - protected final QName name; protected QName key; protected final boolean optional; protected String id; - private Map attributes; private MessageTemplate template; /** @@ -48,7 +45,7 @@ * Determines if the Field is required or not for the data */ public Field(QName name, boolean optional) { - this.name = name; + super(name); this.key = name; this.optional = optional; } @@ -64,7 +61,7 @@ * Determines if the Field is required or not for the data */ public Field(QName name, QName key, boolean optional) { - this.name = name; + super(name); this.key = key; this.optional = optional; } @@ -82,7 +79,7 @@ * The id string */ public Field(String name, String key, boolean optional, String id) { - this.name = new QName(name); + super(new QName(name)); this.key = new QName(key); this.optional = optional; this.id = id; @@ -148,20 +145,6 @@ this.id = id; } - public boolean hasAttribute(QName attributeName) { - return attributes != null && attributes.containsKey(attributeName); - } - - public void addAttribute(QName name, String value) { - if (attributes == null) - attributes = new HashMap(4); - attributes.put(name, value); - } - - public String getAttribute(QName name) { - return (String) attributes.get(name); - } - protected boolean isPresent(BitVectorReader presenceMapReader) { return (!usesPresenceMapBit()) || presenceMapReader.read(); } Modified: trunk/src/main/java/org/openfast/template/Group.java =================================================================== --- trunk/src/main/java/org/openfast/template/Group.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/Group.java 2008-10-29 15:21:46 UTC (rev 201) @@ -36,6 +36,7 @@ import org.openfast.FieldValue; import org.openfast.Global; import org.openfast.GroupValue; +import org.openfast.Node; import org.openfast.QName; import org.openfast.error.FastConstants; import org.openfast.error.FastException; @@ -88,8 +89,9 @@ Map map = new HashMap(); for (int i = 0; i < fields.length; i++) { if (fields[i] instanceof Scalar) { - if (fields[i].hasAttribute(FastConstants.LENGTH_FIELD)) { - map.put(fields[i].getAttribute(FastConstants.LENGTH_FIELD), fields[i]); + if (fields[i].hasChild(FastConstants.LENGTH_FIELD)) { + Node lengthNode = (Node) fields[i].getChildren(FastConstants.LENGTH_FIELD).get(0); + map.put(lengthNode.getAttribute(FastConstants.LENGTH_NAME_ATTR), fields[i]); } } } Modified: trunk/src/main/java/org/openfast/template/loader/AbstractFieldParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/AbstractFieldParser.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/loader/AbstractFieldParser.java 2008-10-29 15:21:46 UTC (rev 201) @@ -60,7 +60,7 @@ if (attribute.getNamespaceURI() == null || attribute.getNamespaceURI().equals("") || attribute.getNamespaceURI().equals(XMLMessageTemplateLoader.TEMPLATE_DEFINITION_NS)) continue; - field.addAttribute(new QName(attribute.getLocalName(), attribute.getNamespaceURI()), attribute.getValue()); + field.setAttribute(new QName(attribute.getLocalName(), attribute.getNamespaceURI()), attribute.getValue()); } } Modified: trunk/src/main/java/org/openfast/template/loader/VariableLengthScalarParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/VariableLengthScalarParser.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/loader/VariableLengthScalarParser.java 2008-10-29 15:21:46 UTC (rev 201) @@ -20,9 +20,10 @@ */ package org.openfast.template.loader; -import org.openfast.error.FastConstants; +import org.openfast.QName; import org.openfast.template.Field; import org.openfast.template.Scalar; +import org.openfast.util.Util; import org.w3c.dom.Element; public class VariableLengthScalarParser extends ScalarParser { @@ -34,8 +35,14 @@ Scalar scalar = (Scalar) super.parse(fieldNode, optional, context); Element element = getElement(fieldNode, 1); if (element != null && element.getNodeName().equals("length")) { - String length = element.getAttribute("name"); - scalar.addAttribute(FastConstants.LENGTH_FIELD, length); + String lengthName = element.getAttribute("name"); + String lengthNamespace = context.getNamespace(); + String lengthId = null; + if (element.hasAttribute("ns")) + lengthNamespace = element.getAttribute("ns"); + if (element.hasAttribute("id")) + lengthId = element.getAttribute("id"); + scalar.addNode(Util.createLength(new QName(lengthName, lengthNamespace), lengthId)); } return scalar; } Modified: trunk/src/main/java/org/openfast/template/operator/TailOperatorCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/operator/TailOperatorCodec.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/operator/TailOperatorCodec.java 2008-10-29 15:21:46 UTC (rev 201) @@ -60,7 +60,7 @@ index++; if (val.length == index) return null; - return (ScalarValue) field.createValue(new String(val, index, val.length - index)); + return (ScalarValue) field.getType().getValue(val, index, val.length - index); } public ScalarValue decodeValue(ScalarValue newValue, ScalarValue previousValue, Scalar field) { Modified: trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java 2008-10-29 15:21:46 UTC (rev 201) @@ -1,5 +1,8 @@ package org.openfast.template.serializer; +import java.util.List; +import org.openfast.Node; +import org.openfast.error.FastConstants; import org.openfast.template.Field; import org.openfast.template.Group; import org.openfast.template.Scalar; @@ -27,7 +30,7 @@ writer.addAttribute("ns", scalar.getKey().getNamespace()); } if (!scalar.getDefaultValue().isUndefined()) { - writer.addAttribute("value", scalar.getDefaultValue().toString()); + writer.addAttribute("value", scalar.getDefaultValue().serialize()); } writer.end(); } @@ -38,19 +41,30 @@ } } - protected static void writeTypeReference(XmlWriter writer, Group group) { + protected static void writeTypeReference(XmlWriter writer, Group group, SerializingContext context) { if (group.getTypeReference() != null) { writer.start("typeRef"); writer.addAttribute("name", group.getTypeReference().getName()); - if (!"".equals(group.getTypeReference().getNamespace())) + if (!group.getTypeReference().getNamespace().equals(context.getNamespace())) writer.addAttribute("ns", group.getTypeReference().getNamespace()); writer.end(); } } - protected static void writeLength(XmlWriter writer, Field field, SerializingContext context) { -// if (field.hasChild("length")) { -// -// } + protected static void writeLength(XmlWriter writer, Node node, SerializingContext context) { + List lengthNodes = node.getChildren(FastConstants.LENGTH_FIELD); + if (!lengthNodes.isEmpty()) { + Node lengthNode = (Node) lengthNodes.get(0); + writer.start("length"); + writer.addAttribute("name", lengthNode.getAttribute(FastConstants.LENGTH_NAME_ATTR)); + if (lengthNode.hasAttribute(FastConstants.LENGTH_NS_ATTR)) { + String namespace = lengthNode.getAttribute(FastConstants.LENGTH_NS_ATTR); + if (!namespace.equals(context.getNamespace())) + writer.addAttribute("ns", namespace); + } + if (lengthNode.hasAttribute(FastConstants.LENGTH_ID_ATTR)) + writer.addAttribute("id", lengthNode.getAttribute(FastConstants.LENGTH_ID_ATTR)); + writer.end(); + } } } Modified: trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java 2008-10-29 15:21:46 UTC (rev 201) @@ -13,7 +13,7 @@ Group group = (Group) field; writer.start("group"); writeCommonAttributes(writer, field, context); - writeTypeReference(writer, group); + writeTypeReference(writer, group, context); writeChildren(writer, context, group); writer.end(); } Modified: trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java 2008-10-29 15:21:46 UTC (rev 201) @@ -4,28 +4,34 @@ import org.openfast.template.Scalar; import org.openfast.template.operator.Operator; import org.openfast.template.type.StringType; -import org.openfast.template.type.Type; import org.openfast.util.XmlWriter; -public class ScalarSerializer implements FieldSerializer { +public class ScalarSerializer extends AbstractFieldSerializer implements FieldSerializer { public boolean canSerialize(Field field) { return field instanceof Scalar; } public void serialize(XmlWriter writer, Field field, SerializingContext context) { - Scalar scalar = (Scalar) field; - String nodeName = getNodeName(scalar); - writer.start(nodeName); - AbstractFieldSerializer.writeCommonAttributes(writer, field, context); - if (scalar.getType().equals(Type.UNICODE)) - writer.addAttribute("charset", "unicode"); + Scalar scalar = writeStart(writer, field, context); + writeEnd(writer, context, scalar); + } + + protected void writeEnd(XmlWriter writer, SerializingContext context, Scalar scalar) { if (!Operator.NONE.equals(scalar.getOperator())) { - AbstractFieldSerializer.writeOperator(writer, scalar, context); + writeOperator(writer, scalar, context); } writer.end(); } + protected Scalar writeStart(XmlWriter writer, Field field, SerializingContext context) { + Scalar scalar = (Scalar) field; + String nodeName = getNodeName(scalar); + writer.start(nodeName); + writeCommonAttributes(writer, field, context); + return scalar; + } + private String getNodeName(Scalar scalar) { String nodeName = scalar.getType().getName(); if (scalar.getType() instanceof StringType) Modified: trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java 2008-10-29 15:21:46 UTC (rev 201) @@ -1,6 +1,7 @@ package org.openfast.template.serializer; import org.openfast.template.Field; +import org.openfast.template.Scalar; import org.openfast.template.Sequence; import org.openfast.util.XmlWriter; @@ -13,8 +14,18 @@ Sequence sequence = (Sequence) field; writer.start("sequence"); writeCommonAttributes(writer, field, context); - writeTypeReference(writer, sequence.getGroup()); + writeTypeReference(writer, sequence.getGroup(), context); writeLength(writer, sequence, context); + if (!sequence.isImplicitLength()) { + writer.start("length"); + Scalar length = sequence.getLength(); + writer.addAttribute("name", length.getName()); + if (!length.getQName().getNamespace().equals(context.getNamespace())) + writer.addAttribute("ns", length.getQName().getNamespace()); + if (length.getId() != null) + writer.addAttribute("id", length.getId()); + writer.end(); + } writeChildren(writer, context, sequence.getGroup()); writer.end(); } Modified: trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java 2008-10-29 15:21:46 UTC (rev 201) @@ -4,7 +4,7 @@ import org.openfast.template.MessageTemplate; import org.openfast.util.XmlWriter; -public class TemplateSerializer implements FieldSerializer { +public class TemplateSerializer extends AbstractFieldSerializer implements FieldSerializer { public void serialize(XmlWriter writer, Field field, SerializingContext context) { MessageTemplate template = (MessageTemplate) field; writer.start("template"); @@ -22,13 +22,8 @@ // if (template.getDictionary() != null) { // writer.addAttribute("dictionary", template.getDictionary()); // } - if (template.getTypeReference() != null) { - writer.start("typeRef"); - writer.addAttribute("name", template.getTypeReference().getName()); - if (!"".equals(template.getTypeReference().getNamespace())) - writer.addAttribute("ns", template.getTypeReference().getNamespace()); - writer.end(); - } + + writeTypeReference(writer, template, context); for (int i=1; i<template.getFieldCount(); i++) { context.serialize(writer, template.getField(i)); } Added: trunk/src/main/java/org/openfast/template/serializer/VariableLengthScalarSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/VariableLengthScalarSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/VariableLengthScalarSerializer.java 2008-10-29 15:21:46 UTC (rev 201) @@ -0,0 +1,28 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.template.Scalar; +import org.openfast.template.type.Type; +import org.openfast.util.XmlWriter; + +public class VariableLengthScalarSerializer extends ScalarSerializer implements FieldSerializer { + + public boolean canSerialize(Field field) { + if (!(field instanceof Scalar)) { + return false; + } + Scalar scalar = (Scalar) field; + return Type.STRING.equals(scalar.getType()) || + Type.ASCII.equals(scalar.getType()) || + Type.UNICODE.equals(scalar.getType()) || + Type.BYTE_VECTOR.equals(scalar.getType()); + } + + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + Scalar scalar = writeStart(writer, field, context); + if (scalar.getType().equals(Type.UNICODE)) + writer.addAttribute("charset", "unicode"); + writeLength(writer, scalar, context); + writeEnd(writer, context, scalar); + } +} Modified: trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java 2008-10-29 15:21:46 UTC (rev 201) @@ -24,6 +24,7 @@ registry.addFieldSerializer(new GroupSerializer()); registry.addFieldSerializer(new SequenceSerializer()); registry.addFieldSerializer(new TemplateSerializer()); + registry.addFieldSerializer(new VariableLengthScalarSerializer()); SerializingContext context = SerializingContext.createInitialContext(registry); return context; } Modified: trunk/src/main/java/org/openfast/template/type/ByteVectorType.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/ByteVectorType.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/type/ByteVectorType.java 2008-10-29 15:21:46 UTC (rev 201) @@ -20,6 +20,7 @@ */ package org.openfast.template.type; +import org.openfast.ByteUtil; import org.openfast.ByteVectorValue; import org.openfast.ScalarValue; import org.openfast.template.type.codec.TypeCodec; @@ -36,7 +37,7 @@ * @return */ protected ScalarValue getVal(String value) { - return new ByteVectorValue(value.getBytes()); + return new ByteVectorValue(ByteUtil.convertHexStringToByteArray(value)); } /** @@ -63,4 +64,7 @@ public ScalarValue getValue(byte[] bytes) { return new ByteVectorValue(bytes); } + public ScalarValue getValue(byte[] bytes, int offset, int length) { + return new ByteVectorValue(bytes, offset, length); + } } \ No newline at end of file Modified: trunk/src/main/java/org/openfast/template/type/Type.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/Type.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/template/type/Type.java 2008-10-29 15:21:46 UTC (rev 201) @@ -88,6 +88,9 @@ public ScalarValue getValue(byte[] bytes) { return new StringValue(new String(bytes)); } + public ScalarValue getValue(byte[] bytes, int offset, int length) { + return new StringValue(new String(bytes, offset, length)); + } }; public final static Type ASCII = new StringType("ascii", TypeCodec.ASCII, TypeCodec.NULLABLE_ASCII) { private static final long serialVersionUID = 1L; @@ -95,6 +98,9 @@ public ScalarValue getValue(byte[] bytes) { return new StringValue(new String(bytes)); } + public ScalarValue getValue(byte[] bytes, int offset, int length) { + return new StringValue(new String(bytes, offset, length)); + } }; public final static Type UNICODE = new StringType("unicode", TypeCodec.UNICODE, TypeCodec.NULLABLE_UNICODE) { private static final long serialVersionUID = 1L; @@ -106,6 +112,13 @@ throw new RuntimeException(e); } } + public ScalarValue getValue(byte[] bytes, int offset, int length) { + try { + return new StringValue(new String(bytes, offset, length, "UTF8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } }; public final static Type BYTE_VECTOR = new ByteVectorType(); public final static Type DECIMAL = new DecimalType(); @@ -127,4 +140,7 @@ public ScalarValue getValue(byte[] bytes) { throw new UnsupportedOperationException(); } + public ScalarValue getValue(byte[] bytes, int offset, int length) { + throw new UnsupportedOperationException(); + } } Modified: trunk/src/main/java/org/openfast/util/Util.java =================================================================== --- trunk/src/main/java/org/openfast/util/Util.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/main/java/org/openfast/util/Util.java 2008-10-29 15:21:46 UTC (rev 201) @@ -30,8 +30,11 @@ import org.openfast.ByteVectorValue; import org.openfast.Global; import org.openfast.IntegerValue; +import org.openfast.Node; import org.openfast.QName; import org.openfast.ScalarValue; +import org.openfast.SimpleNode; +import org.openfast.error.FastConstants; import org.openfast.template.ComposedScalar; import org.openfast.template.Scalar; import org.openfast.template.TwinValue; @@ -176,4 +179,13 @@ return 0; } } + + public static Node createLength(QName name, String id) { + SimpleNode lengthNode = new SimpleNode(FastConstants.LENGTH_FIELD); + lengthNode.setAttribute(FastConstants.LENGTH_NAME_ATTR, name.getName()); + lengthNode.setAttribute(FastConstants.LENGTH_NS_ATTR, name.getNamespace()); + if (id != null) + lengthNode.setAttribute(FastConstants.LENGTH_ID_ATTR, id); + return lengthNode; + } } Modified: trunk/src/test/java/org/openfast/ByteVectorValueTest.java =================================================================== --- trunk/src/test/java/org/openfast/ByteVectorValueTest.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/test/java/org/openfast/ByteVectorValueTest.java 2008-10-29 15:21:46 UTC (rev 201) @@ -31,4 +31,10 @@ ByteVectorValue actual = new ByteVectorValue(new byte[] { (byte) 0xff }); assertEquals(expected, actual); } + + public void testSerialize() { + byte[] bytes = ByteUtil.convertHexStringToByteArray("DDBBCCAA"); + ByteVectorValue val = new ByteVectorValue(bytes); + assertEquals("ddbbccaa", val.serialize()); + } } Modified: trunk/src/test/java/org/openfast/session/template/exchange/VariableLengthInstructionConverterTest.java =================================================================== --- trunk/src/test/java/org/openfast/session/template/exchange/VariableLengthInstructionConverterTest.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/test/java/org/openfast/session/template/exchange/VariableLengthInstructionConverterTest.java 2008-10-29 15:21:46 UTC (rev 201) @@ -1,6 +1,10 @@ package org.openfast.session.template.exchange; +import java.util.List; +import junit.framework.TestCase; import org.openfast.GroupValue; +import org.openfast.Node; +import org.openfast.QName; import org.openfast.ScalarValue; import org.openfast.error.FastConstants; import org.openfast.session.SessionControlProtocol_1_1; @@ -8,39 +12,40 @@ import org.openfast.template.TemplateRegistry; import org.openfast.template.operator.Operator; import org.openfast.template.type.Type; +import org.openfast.util.Util; -import junit.framework.TestCase; - public class VariableLengthInstructionConverterTest extends TestCase { - private VariableLengthInstructionConverter converter; - private ConversionContext context; + private VariableLengthInstructionConverter converter; + private ConversionContext context; - protected void setUp() throws Exception { - converter = new VariableLengthInstructionConverter(); - context = SessionControlProtocol_1_1.createInitialContext(); - } - - public void testConvertOnByteVector() { - Scalar bytes = new Scalar("bytes", Type.BYTE_VECTOR, Operator.NONE, ScalarValue.UNDEFINED, true); - assertTrue(converter.shouldConvert(bytes)); - - bytes.addAttribute(FastConstants.LENGTH_FIELD, "numBytes"); - GroupValue fieldDef = converter.convert(bytes, context); - Scalar converted = (Scalar) converter.convert(fieldDef, TemplateRegistry.NULL, context); - - assertEquals(bytes, converted); - assertEquals("numBytes", converted.getAttribute(FastConstants.LENGTH_FIELD)); - } - - public void testConvertOnUnicodeString() { - Scalar message = new Scalar("message", Type.UNICODE, Operator.COPY, ScalarValue.UNDEFINED, true); - assertTrue(converter.shouldConvert(message)); - - message.addAttribute(FastConstants.LENGTH_FIELD, "messageLength"); - GroupValue fieldDef = converter.convert(message, context); - Scalar converted = (Scalar) converter.convert(fieldDef, TemplateRegistry.NULL, context); - - assertEquals(message, converted); - assertEquals("messageLength", converted.getAttribute(FastConstants.LENGTH_FIELD)); - } + protected void setUp() throws Exception { + converter = new VariableLengthInstructionConverter(); + context = SessionControlProtocol_1_1.createInitialContext(); + } + + public void testConvertOnByteVector() { + Scalar bytes = new Scalar("bytes", Type.BYTE_VECTOR, Operator.NONE, ScalarValue.UNDEFINED, true); + assertTrue(converter.shouldConvert(bytes)); + bytes.addNode(Util.createLength(new QName("numBytes"), null)); + GroupValue fieldDef = converter.convert(bytes, context); + Scalar converted = (Scalar) converter.convert(fieldDef, TemplateRegistry.NULL, context); + assertEquals(bytes, converted); + List children = converted.getChildren(FastConstants.LENGTH_FIELD); + assertEquals(1, children.size()); + Node lengthNode = (Node) children.get(0); + assertEquals("numBytes", lengthNode.getAttribute(FastConstants.LENGTH_NAME_ATTR)); + } + + public void testConvertOnUnicodeString() { + Scalar message = new Scalar("message", Type.UNICODE, Operator.COPY, ScalarValue.UNDEFINED, true); + assertTrue(converter.shouldConvert(message)); + message.addNode(Util.createLength(new QName("messageLength"), null)); + GroupValue fieldDef = converter.convert(message, context); + Scalar converted = (Scalar) converter.convert(fieldDef, TemplateRegistry.NULL, context); + assertEquals(message, converted); + List children = converted.getChildren(FastConstants.LENGTH_FIELD); + assertEquals(1, children.size()); + Node lengthNode = (Node) children.get(0); + assertEquals("messageLength", lengthNode.getAttribute(FastConstants.LENGTH_NAME_ATTR)); + } } Modified: trunk/src/test/java/org/openfast/template/operator/TailOperatorCodecTest.java =================================================================== --- trunk/src/test/java/org/openfast/template/operator/TailOperatorCodecTest.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/test/java/org/openfast/template/operator/TailOperatorCodecTest.java 2008-10-29 15:21:46 UTC (rev 201) @@ -11,159 +11,147 @@ import org.openfast.test.OpenFastTestCase; public class TailOperatorCodecTest extends OpenFastTestCase { - private static final OperatorCodec TAIL_CODEC = Operator.TAIL.getCodec(Type.ASCII); - private static final Scalar OPT_NO_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); - private static final Scalar OPT_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, new StringValue("abc"), true); - private static final Scalar MAND_NO_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, false); - private static final Scalar MAND_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, new StringValue("abc"), false); - - public void testGetValueToEncodeAllCasesForOptionalNoInitialValue() { - // VALUE PREVIOUS - assertEquals(null, TAIL_CODEC.getValueToEncode(null, UNDEF, OPT_NO_DEFAULT)); - assertEquals(string("abcd"), TAIL_CODEC.getValueToEncode(string("abcd"), UNDEF, OPT_NO_DEFAULT)); - assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), OPT_NO_DEFAULT)); - assertEquals(null, TAIL_CODEC.getValueToEncode(string("abce"), string("abce"), OPT_NO_DEFAULT)); - assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), OPT_NO_DEFAULT)); - assertEquals(NULL, TAIL_CODEC.getValueToEncode(null, string("abcef"), OPT_NO_DEFAULT)); - assertEquals(null, TAIL_CODEC.getValueToEncode(null, null, OPT_NO_DEFAULT)); - assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, OPT_NO_DEFAULT)); - } - - public void testGetValueToEncodeAllCasesForMandatoryNoInitialValue() { - // VALUE PREVIOUS - assertEquals(string("abcd"), TAIL_CODEC.getValueToEncode(string("abcd"), UNDEF, MAND_NO_DEFAULT)); - assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), MAND_NO_DEFAULT)); - assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), MAND_NO_DEFAULT)); - assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, MAND_NO_DEFAULT)); - } - - public void testGetValueToEncodeAllCasesForOptionalDefaultABC() { - // VALUE PREVIOUS - assertEquals(null, TAIL_CODEC.getValueToEncode(string("abc"), UNDEF, OPT_DEFAULT)); - assertEquals(NULL, TAIL_CODEC.getValueToEncode(null, UNDEF, OPT_DEFAULT)); - assertEquals(string("abcd"), TAIL_CODEC.getValueToEncode(string("abcd"), null, OPT_DEFAULT)); - assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), OPT_DEFAULT)); - assertEquals(null, TAIL_CODEC.getValueToEncode(string("abce"), string("abce"), OPT_DEFAULT)); - assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), OPT_DEFAULT)); - assertEquals(NULL, TAIL_CODEC.getValueToEncode(null, string("abcef"), OPT_DEFAULT)); - assertEquals(null, TAIL_CODEC.getValueToEncode(null, null, OPT_DEFAULT)); - assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, OPT_DEFAULT)); - } - - public void testGetValueToEncodeAllCasesForMandatoryDefaultABC() { - // VALUE PREVIOUS - assertEquals(null, TAIL_CODEC.getValueToEncode(string("abc"), UNDEF, MAND_DEFAULT)); - assertEquals(string("d"), TAIL_CODEC.getValueToEncode(string("abd"), UNDEF, MAND_DEFAULT)); - assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), MAND_DEFAULT)); - assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), MAND_DEFAULT)); - assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, MAND_DEFAULT)); - } - - public void testDecodeEmptyForOptionalNoDefault() { - assertEquals(null, TAIL_CODEC.decodeEmptyValue(UNDEF, OPT_NO_DEFAULT)); - assertEquals(null, TAIL_CODEC.decodeEmptyValue(null, OPT_NO_DEFAULT)); - assertEquals(string("abcd"), TAIL_CODEC.decodeEmptyValue(string("abcd"), OPT_NO_DEFAULT)); - } - - public void testDecodeEmptyForMandatoryNoDefaultThrowsException() { - try { - TAIL_CODEC.decodeEmptyValue(UNDEF, MAND_NO_DEFAULT); - fail(); - } catch (FastException e) { - assertEquals(FastConstants.D6_MNDTRY_FIELD_NOT_PRESENT, e.getCode()); - } - try { - TAIL_CODEC.decodeEmptyValue(null, MAND_NO_DEFAULT); - fail(); - } catch (FastException e) { - assertEquals(FastConstants.D6_MNDTRY_FIELD_NOT_PRESENT, e.getCode()); - } - } - - public void testDecodeEmptyForMandatoryNoDefault() { - assertEquals(string("a"), TAIL_CODEC.decodeEmptyValue(string("a"), MAND_NO_DEFAULT)); - } - - public void testDecodeEmptyForOptionalDefaultABC() { - assertEquals(string("abc"), TAIL_CODEC.decodeEmptyValue(UNDEF, OPT_DEFAULT)); - assertEquals(null, TAIL_CODEC.decodeEmptyValue(null, OPT_DEFAULT)); - assertEquals(string("abcd"), TAIL_CODEC.decodeEmptyValue(string("abcd"), OPT_DEFAULT)); - } - - public void testDecodeEmptyForMandatoryDefaultABC() { - assertEquals(string("abc"), TAIL_CODEC.decodeEmptyValue(UNDEF, MAND_DEFAULT)); - } - - public void testDecodeForOptionalNoDefault() { - assertEquals(string("abc"), TAIL_CODEC.decodeValue(string("abc"), UNDEF, OPT_NO_DEFAULT)); - assertEquals(string("abd"), TAIL_CODEC.decodeValue(string("d"), string("abc"), OPT_NO_DEFAULT)); - assertEquals(string("abcd"), TAIL_CODEC.decodeValue(string("abcd"), string("abc"), OPT_NO_DEFAULT)); - assertEquals(null, TAIL_CODEC.decodeValue(null, string("abc"), OPT_NO_DEFAULT)); - } - - public void testUnencodableValue() { - try { - TAIL_CODEC.getValueToEncode(new StringValue("a"), new StringValue("abce"), OPT_NO_DEFAULT); - fail(); - } catch (FastException e) { - assertEquals(FastConstants.D3_CANT_ENCODE_VALUE, e.getCode()); - } - } + private static final OperatorCodec TAIL_CODEC = Operator.TAIL.getCodec(Type.ASCII); + private static final Scalar OPT_NO_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); + private static final Scalar OPT_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, new StringValue("abc"), true); + private static final Scalar MAND_NO_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, false); + private static final Scalar MAND_DEFAULT = new Scalar("noDefault", Type.ASCII, Operator.TAIL, new StringValue("abc"), false); - public void testGetValueToEncodeForByteVector() throws Exception { - Scalar byteVectorField = new Scalar("bv", Type.BYTE_VECTOR, Operator.TAIL, ScalarValue.UNDEFINED, true); - - ScalarValue priorValue = new ByteVectorValue(ByteUtil.convertBitStringToFastByteArray("10001000 01001000 10101010 11111111")); - ScalarValue value = new ByteVectorValue(ByteUtil.convertBitStringToFastByteArray("10001000 01001000 10101010 01010101")); - - ScalarValue expected = new ByteVectorValue(ByteUtil.convertBitStringToFastByteArray("01010101")); - assertEquals(expected, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); - } + public void testGetValueToEncodeAllCasesForOptionalNoInitialValue() { + // VALUE PREVIOUS + assertEquals(null, TAIL_CODEC.getValueToEncode(null, UNDEF, OPT_NO_DEFAULT)); + assertEquals(string("abcd"), TAIL_CODEC.getValueToEncode(string("abcd"), UNDEF, OPT_NO_DEFAULT)); + assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), OPT_NO_DEFAULT)); + assertEquals(null, TAIL_CODEC.getValueToEncode(string("abce"), string("abce"), OPT_NO_DEFAULT)); + assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), OPT_NO_DEFAULT)); + assertEquals(NULL, TAIL_CODEC.getValueToEncode(null, string("abcef"), OPT_NO_DEFAULT)); + assertEquals(null, TAIL_CODEC.getValueToEncode(null, null, OPT_NO_DEFAULT)); + assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, OPT_NO_DEFAULT)); + } - public void testGetValueToEncodeForUnicodeString() throws Exception { - Scalar byteVectorField = new Scalar("str", Type.UNICODE, Operator.TAIL, ScalarValue.UNDEFINED, true); - - ScalarValue priorValue = new StringValue("abcde"); - ScalarValue value = new StringValue("abcce"); - - ScalarValue expected = new StringValue("ce"); - assertEquals(expected, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); - } + public void testGetValueToEncodeAllCasesForMandatoryNoInitialValue() { + // VALUE PREVIOUS + assertEquals(string("abcd"), TAIL_CODEC.getValueToEncode(string("abcd"), UNDEF, MAND_NO_DEFAULT)); + assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), MAND_NO_DEFAULT)); + assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), MAND_NO_DEFAULT)); + assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, MAND_NO_DEFAULT)); + } - public void testGetValueToEncodeForAsciiString() throws Exception { - Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); - - ScalarValue priorValue = new StringValue("abcde"); - ScalarValue value = new StringValue("abcce"); - - ScalarValue expected = new StringValue("ce"); - assertEquals(expected, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); - } - - public void testGetValueToEncodeAsciiStringTooLong() { - Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); - - ScalarValue priorValue = new StringValue("abcde"); - ScalarValue value = new StringValue("dbcdef"); - - assertEquals(value, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); - } - - public void testGetValueToEncodeAsciiStringLengthMismatch() { - Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); - - ScalarValue priorValue = new StringValue("abcde"); - ScalarValue value = new StringValue("abcdef"); - - assertEquals(value, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); - } - - public void testGetValueToEncodeAsciiStringSameValue() { - Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); - - ScalarValue priorValue = new StringValue("abcde"); - ScalarValue value = new StringValue("abcde"); - - assertEquals(null, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); - } + public void testGetValueToEncodeAllCasesForOptionalDefaultABC() { + // VALUE PREVIOUS + assertEquals(null, TAIL_CODEC.getValueToEncode(string("abc"), UNDEF, OPT_DEFAULT)); + assertEquals(NULL, TAIL_CODEC.getValueToEncode(null, UNDEF, OPT_DEFAULT)); + assertEquals(string("abcd"), TAIL_CODEC.getValueToEncode(string("abcd"), null, OPT_DEFAULT)); + assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), OPT_DEFAULT)); + assertEquals(null, TAIL_CODEC.getValueToEncode(string("abce"), string("abce"), OPT_DEFAULT)); + assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), OPT_DEFAULT)); + assertEquals(NULL, TAIL_CODEC.getValueToEncode(null, string("abcef"), OPT_DEFAULT)); + assertEquals(null, TAIL_CODEC.getValueToEncode(null, null, OPT_DEFAULT)); + assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, OPT_DEFAULT)); + } + + public void testGetValueToEncodeAllCasesForMandatoryDefaultABC() { + // VALUE PREVIOUS + assertEquals(null, TAIL_CODEC.getValueToEncode(string("abc"), UNDEF, MAND_DEFAULT)); + assertEquals(string("d"), TAIL_CODEC.getValueToEncode(string("abd"), UNDEF, MAND_DEFAULT)); + assertEquals(string("e"), TAIL_CODEC.getValueToEncode(string("abce"), string("abcd"), MAND_DEFAULT)); + assertEquals(string("abcef"), TAIL_CODEC.getValueToEncode(string("abcef"), string("abce"), MAND_DEFAULT)); + assertEquals(string("z"), TAIL_CODEC.getValueToEncode(string("z"), null, MAND_DEFAULT)); + } + + public void testDecodeEmptyForOptionalNoDefault() { + assertEquals(null, TAIL_CODEC.decodeEmptyValue(UNDEF, OPT_NO_DEFAULT)); + assertEquals(null, TAIL_CODEC.decodeEmptyValue(null, OPT_NO_DEFAULT)); + assertEquals(string("abcd"), TAIL_CODEC.decodeEmptyValue(string("abcd"), OPT_NO_DEFAULT)); + } + + public void testDecodeEmptyForMandatoryNoDefaultThrowsException() { + try { + TAIL_CODEC.decodeEmptyValue(UNDEF, MAND_NO_DEFAULT); + fail(); + } catch (FastException e) { + assertEquals(FastConstants.D6_MNDTRY_FIELD_NOT_PRESENT, e.getCode()); + } + try { + TAIL_CODEC.decodeEmptyValue(null, MAND_NO_DEFAULT); + fail(); + } catch (FastException e) { + assertEquals(FastConstants.D6_MNDTRY_FIELD_NOT_PRESENT, e.getCode()); + } + } + + public void testDecodeEmptyForMandatoryNoDefault() { + assertEquals(string("a"), TAIL_CODEC.decodeEmptyValue(string("a"), MAND_NO_DEFAULT)); + } + + public void testDecodeEmptyForOptionalDefaultABC() { + assertEquals(string("abc"), TAIL_CODEC.decodeEmptyValue(UNDEF, OPT_DEFAULT)); + assertEquals(null, TAIL_CODEC.decodeEmptyValue(null, OPT_DEFAULT)); + assertEquals(string("abcd"), TAIL_CODEC.decodeEmptyValue(string("abcd"), OPT_DEFAULT)); + } + + public void testDecodeEmptyForMandatoryDefaultABC() { + assertEquals(string("abc"), TAIL_CODEC.decodeEmptyValue(UNDEF, MAND_DEFAULT)); + } + + public void testDecodeForOptionalNoDefault() { + assertEquals(string("abc"), TAIL_CODEC.decodeValue(string("abc"), UNDEF, OPT_NO_DEFAULT)); + assertEquals(string("abd"), TAIL_CODEC.decodeValue(string("d"), string("abc"), OPT_NO_DEFAULT)); + assertEquals(string("abcd"), TAIL_CODEC.decodeValue(string("abcd"), string("abc"), OPT_NO_DEFAULT)); + assertEquals(null, TAIL_CODEC.decodeValue(null, string("abc"), OPT_NO_DEFAULT)); + } + + public void testUnencodableValue() { + try { + TAIL_CODEC.getValueToEncode(new StringValue("a"), new StringValue("abce"), OPT_NO_DEFAULT); + fail(); + } catch (FastException e) { + assertEquals(FastConstants.D3_CANT_ENCODE_VALUE, e.getCode()); + } + } + + public void testGetValueToEncodeForByteVector() throws Exception { + Scalar byteVectorField = new Scalar("bv", Type.BYTE_VECTOR, Operator.TAIL, ScalarValue.UNDEFINED, true); + ScalarValue priorValue = new ByteVectorValue(ByteUtil.convertBitStringToFastByteArray("10001000 01001000 10101010 11111111")); + ScalarValue value = new ByteVectorValue(ByteUtil.convertBitStringToFastByteArray("10001000 01001000 10101010 01010101")); + ScalarValue expected = new ByteVectorValue(ByteUtil.convertBitStringToFastByteArray("01010101")); + assertEquals(expected, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); + } + + public void testGetValueToEncodeForUnicodeString() throws Exception { + Scalar byteVectorField = new Scalar("str", Type.UNICODE, Operator.TAIL, ScalarValue.UNDEFINED, true); + ScalarValue priorValue = new StringValue("abcde"); + ScalarValue value = new StringValue("abcce"); + ScalarValue expected = new StringValue("ce"); + assertEquals(expected, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); + } + + public void testGetValueToEncodeForAsciiString() throws Exception { + Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); + ScalarValue priorValue = new StringValue("abcde"); + ScalarValue value = new StringValue("abcce"); + ScalarValue expected = new StringValue("ce"); + assertEquals(expected, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); + } + + public void testGetValueToEncodeAsciiStringTooLong() { + Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); + ScalarValue priorValue = new StringValue("abcde"); + ScalarValue value = new StringValue("dbcdef"); + assertEquals(value, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); + } + + public void testGetValueToEncodeAsciiStringLengthMismatch() { + Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); + ScalarValue priorValue = new StringValue("abcde"); + ScalarValue value = new StringValue("abcdef"); + assertEquals(value, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); + } + + public void testGetValueToEncodeAsciiStringSameValue() { + Scalar byteVectorField = new Scalar("str", Type.ASCII, Operator.TAIL, ScalarValue.UNDEFINED, true); + ScalarValue priorValue = new StringValue("abcde"); + ScalarValue value = new StringValue("abcde"); + assertEquals(null, OperatorCodec.TAIL.getValueToEncode(value, priorValue, byteVectorField)); + } } Modified: trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java =================================================================== --- trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java 2008-10-29 00:37:29 UTC (rev 200) +++ trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java 2008-10-29 15:21:46 UTC (rev 201) @@ -6,7 +6,9 @@ import org.openfast.IntegerValue; import org.openfast.QName; import org.openfast.ScalarValue; +import org.openfast.SimpleNode; import org.openfast.StringValue; +import org.openfast.error.FastConstants; import org.openfast.template.Scalar; import org.openfast.template.operator.Operator; import org.openfast.template.type.Type; @@ -37,37 +39,4 @@ serializer.serialize(writer, scalar, XMLMessageTemplateSerializer.createInitialContext()); assertEquals(expected, byteOut.toString()); } - - public void testSerializeString() { - Scalar scalar = new Scalar(new QName("name", "http://openfast.org"), Type.UNICODE, Operator.COPY, new... [truncated message content] |
From: <ope...@li...> - 2008-10-29 00:37:34
|
Revision: 200 http://openfast.svn.sourceforge.net/openfast/?rev=200&view=rev Author: jacob_northey Date: 2008-10-29 00:37:29 +0000 (Wed, 29 Oct 2008) Log Message: ----------- [FAST-13] Fixed SCP 1.1 Template Exchange decoding of ids [FAST-14] Fixed SCP 1.1 decoding of type references Modified Paths: -------------- trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java trunk/src/main/java/org/openfast/session/template/exchange/AbstractFieldInstructionConverter.java trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java trunk/src/main/java/org/openfast/session/template/exchange/GroupConverter.java trunk/src/main/java/org/openfast/session/template/exchange/ScalarConverter.java trunk/src/main/java/org/openfast/session/template/exchange/SequenceConverter.java trunk/src/main/java/org/openfast/template/Scalar.java trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java trunk/src/main/java/org/openfast/util/XmlWriter.java trunk/src/test/java/org/openfast/session/SessionControlProtocol_1_1Test.java trunk/src/test/java/org/openfast/session/template/exchange/SequenceConverterTest.java trunk/src/test/java/org/openfast/session/template/exchange/TemplateDefinitionTest.java trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/XMLMessageTemplateSerializerTest.java trunk/src/test/java/org/openfast/test/ObjectMother.java Added Paths: ----------- trunk/src/test/java/org/openfast/session/template/exchange/GroupConverterTest.java Modified: trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java 2008-10-29 00:37:29 UTC (rev 200) @@ -3,6 +3,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -37,12 +38,20 @@ if (cl.hasOption(MESSAGE_TEMPLATE_FILE)) { try { templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + if (!templatesFile.exists()) + templatesFile.createNewFile(); Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); - Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); - Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + out = new FileOutputStream(templatesFile); } catch (AssertionError e) { System.out.println(e.getMessage()); displayHelp("consumer", options); + } catch (FileNotFoundException e) { + System.out.println("Unable to create output file."); + System.exit(1); + } catch (IOException e) { + System.out.println("Unable to create output file."); + System.exit(1); } } InputStream fastIn = null; @@ -55,15 +64,18 @@ Assert.assertTrue(inFile.canRead(), "The fast encoded data file \"" + inFile.getAbsolutePath() + "\" is not readable."); fastIn = new FileInputStream(inFile); } catch (FileNotFoundException e) { - System.out.println("Unable to create output file."); + System.out.println("Unable to open data file."); System.exit(1); } catch (IOException e) { - System.out.println("Unable to create output file."); + System.out.println("Unable to open data file."); System.exit(1); } TemplateExchangeDefinitionDecoder tmplExchanger = new TemplateExchangeDefinitionDecoder(fastIn, cl.hasOption(NAMESPACE_AWARENESS), out); try { tmplExchanger.start(); + if (cl.hasOption(MESSAGE_TEMPLATE_FILE)) { + System.out.println("Templates written to " + templatesFile.getAbsolutePath() + "."); + } } catch (IOException e) { if (showStacktrace) e.printStackTrace(); Modified: trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java 2008-10-29 00:37:29 UTC (rev 200) @@ -42,9 +42,10 @@ displayHelp("consumer", options); } OutputStream out = System.out; + File outFile = null; if (cl.hasOption(OUTPUT_FILE)) { try { - File outFile = getFile(cl, OUTPUT_FILE); + outFile = getFile(cl, OUTPUT_FILE); if (!outFile.exists()) outFile.createNewFile(); out = new FileOutputStream(outFile); @@ -59,6 +60,9 @@ TemplateExchangeDefinitionEncoder tmplExchanger = new TemplateExchangeDefinitionEncoder(templatesFile, cl.hasOption(NAMESPACE_AWARENESS), out); try { tmplExchanger.start(); + if (cl.hasOption(OUTPUT_FILE)) { + System.out.println("Templates encoded to file " + outFile.getAbsolutePath() + "."); + } } catch (IOException e) { if (showStacktrace) e.printStackTrace(); Modified: trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-29 00:37:29 UTC (rev 200) @@ -26,6 +26,7 @@ import org.openfast.Context; import org.openfast.Dictionary; import org.openfast.FieldValue; +import org.openfast.GroupValue; import org.openfast.Message; import org.openfast.MessageHandler; import org.openfast.QName; @@ -168,8 +169,23 @@ public MessageTemplate createTemplateFromMessage(Message templateDef, TemplateRegistry registry) { String name = templateDef.getString("Name"); + String namespace = ""; + if (templateDef.isDefined("Ns")) + namespace = templateDef.getString("Ns"); Field[] fields = GroupConverter.parseFieldInstructions(templateDef, registry, initialContext); - return new MessageTemplate(name, fields); + MessageTemplate group = new MessageTemplate(new QName(name, namespace), fields); + if (templateDef.isDefined("TypeRef")) { + GroupValue typeRef = templateDef.getGroup("TypeRef"); + String typeRefName = typeRef.getString("Name"); + String typeRefNs = ""; // context.getNamespace(); + if (typeRef.isDefined("Ns")) + typeRefNs = typeRef.getString("Ns"); + group.setTypeReference(new QName(typeRefName, typeRefNs)); + } + if (templateDef.isDefined("AuxId")) { + group.setId(templateDef.getString("AuxId")); + } + return group; } public static final int FAST_RESET_TEMPLATE_ID = 120; Modified: trunk/src/main/java/org/openfast/session/template/exchange/AbstractFieldInstructionConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/AbstractFieldInstructionConverter.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/session/template/exchange/AbstractFieldInstructionConverter.java 2008-10-29 00:37:29 UTC (rev 200) @@ -25,6 +25,7 @@ import org.openfast.Dictionary; import org.openfast.GroupValue; import org.openfast.Message; +import org.openfast.QName; import org.openfast.session.SessionControlProtocol_1_1; import org.openfast.template.Field; import org.openfast.template.Group; @@ -40,10 +41,15 @@ } public static void setName(Field field, GroupValue fieldDef) { - fieldDef.setString("Name", field.getName()); - fieldDef.setString("Ns", field.getQName().getNamespace()); + QName qname = field.getQName(); + setName(fieldDef, qname); } + public static void setName(GroupValue fieldDef, QName qname) { + fieldDef.setString("Name", qname.getName()); + fieldDef.setString("Ns", qname.getNamespace()); + } + public static GroupValue createOperator(Scalar scalar) { if (!OPERATOR_TEMPLATE_MAP.containsKey(scalar.getOperator())) return null; Modified: trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java 2008-10-29 00:37:29 UTC (rev 200) @@ -57,7 +57,11 @@ if (mantissaDef.isDefined("InitialValue")) mantissaDefaultValue = new LongValue(mantissaDef.getInt("InitialValue")); } - return Util.composedDecimal(name, exponentOperator, exponentDefaultValue, mantissaOperator, mantissaDefaultValue, optional); + ComposedScalar composedDecimal = Util.composedDecimal(name, exponentOperator, exponentDefaultValue, mantissaOperator, mantissaDefaultValue, optional); + if (fieldDef.isDefined("AuxId")) { + composedDecimal.setId(fieldDef.getString("AuxId")); + } + return composedDecimal; } public GroupValue convert(Field field, ConversionContext context) { Modified: trunk/src/main/java/org/openfast/session/template/exchange/GroupConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/GroupConverter.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/session/template/exchange/GroupConverter.java 2008-10-29 00:37:29 UTC (rev 200) @@ -23,7 +23,9 @@ import org.openfast.FieldValue; import org.openfast.GroupValue; import org.openfast.Message; +import org.openfast.QName; import org.openfast.SequenceValue; +import org.openfast.error.FastConstants; import org.openfast.session.SessionControlProtocol_1_1; import org.openfast.template.Field; import org.openfast.template.Group; @@ -33,9 +35,24 @@ public class GroupConverter extends AbstractFieldInstructionConverter { public Field convert(GroupValue fieldDef, TemplateRegistry templateRegistry, ConversionContext context) { String name = fieldDef.getString("Name"); + String namespace = ""; + if (fieldDef.isDefined("Ns")) + namespace = fieldDef.getString("Ns"); Field[] fields = parseFieldInstructions(fieldDef, templateRegistry, context); boolean optional = fieldDef.getBool("Optional"); - return new Group(name, fields, optional); + Group group = new Group(new QName(name, namespace), fields, optional); + if (fieldDef.isDefined("TypeRef")) { + GroupValue typeRef = fieldDef.getGroup("TypeRef"); + String typeRefName = typeRef.getString("Name"); + String typeRefNs = ""; // context.getNamespace(); + if (typeRef.isDefined("Ns")) + typeRefNs = typeRef.getString("Ns"); + group.setTypeReference(new QName(typeRefName, typeRefNs)); + } + if (fieldDef.isDefined("AuxId")) { + group.setId(fieldDef.getString("AuxId")); + } + return group; } public GroupValue convert(Field field, ConversionContext context) { @@ -55,6 +72,11 @@ public static Message convert(Group group, Message groupMsg, ConversionContext context) { setNameAndId(group, groupMsg); + if (group.getTypeReference() != null && !FastConstants.ANY_TYPE.equals(group.getTypeReference())) { + GroupValue typeRef = new GroupValue((Group) SessionControlProtocol_1_1.TYPE_REF.getField(new QName("TypeRef", SessionControlProtocol_1_1.NAMESPACE))); + setName(typeRef, group.getTypeReference()); + groupMsg.setFieldValue("TypeRef", typeRef); + } SequenceValue instructions = new SequenceValue(SessionControlProtocol_1_1.TEMPLATE_DEFINITION.getSequence("Instructions")); int i = group instanceof MessageTemplate ? 1 : 0; Field[] fields = group.getFieldDefinitions(); Modified: trunk/src/main/java/org/openfast/session/template/exchange/ScalarConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/ScalarConverter.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/session/template/exchange/ScalarConverter.java 2008-10-29 00:37:29 UTC (rev 200) @@ -66,21 +66,30 @@ ScalarValue initialValue = ScalarValue.UNDEFINED; if (fieldDef.isDefined("InitialValue")) initialValue = (ScalarValue) fieldDef.getValue("InitialValue"); + Scalar scalar = null; + String name = fieldDef.getString("Name"); + String namespace = ""; + if (fieldDef.isDefined("Ns")) + namespace = fieldDef.getString("Ns"); + QName qname = new QName(name, namespace); if (fieldDef.isDefined("Operator")) { GroupValue operatorGroup = fieldDef.getGroup("Operator").getGroup(0); Operator operator = getOperator(operatorGroup.getGroup()); - Scalar scalar = new Scalar(fieldDef.getString("Name"), type, operator, initialValue, optional); + scalar = new Scalar(qname, type, operator, initialValue, optional); if (operatorGroup.isDefined("Dictionary")) scalar.setDictionary(operatorGroup.getString("Dictionary")); if (operatorGroup.isDefined("Key")) { - String name = operatorGroup.getGroup("Key").getString("Name"); + String keyName = operatorGroup.getGroup("Key").getString("Name"); String ns = operatorGroup.getGroup("Key").getString("Ns"); - scalar.setKey(new QName(name, ns)); + scalar.setKey(new QName(keyName, ns)); } - return scalar; } else { - return new Scalar(fieldDef.getString("Name"), type, Operator.NONE, initialValue, optional); + scalar = new Scalar(qname, type, Operator.NONE, initialValue, optional); } + if (fieldDef.isDefined("AuxId")) { + scalar.setId(fieldDef.getString("AuxId")); + } + return scalar; } public GroupValue convert(Field field, ConversionContext context) { Modified: trunk/src/main/java/org/openfast/session/template/exchange/SequenceConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/SequenceConverter.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/session/template/exchange/SequenceConverter.java 2008-10-29 00:37:29 UTC (rev 200) @@ -25,6 +25,7 @@ import org.openfast.Message; import org.openfast.QName; import org.openfast.ScalarValue; +import org.openfast.error.FastConstants; import org.openfast.session.SessionControlProtocol_1_1; import org.openfast.template.Field; import org.openfast.template.Group; @@ -62,7 +63,17 @@ length = new Scalar(lengthName, Type.U32, operator, initialValue, optional); length.setId(id); } - return new Sequence(qname, length, fields, optional); + Sequence sequence = new Sequence(qname, length, fields, optional); + + if (fieldDef.isDefined("TypeRef")) { + GroupValue typeRef = fieldDef.getGroup("TypeRef"); + String typeRefName = typeRef.getString("Name"); + String typeRefNs = ""; // context.getNamespace(); + if (typeRef.isDefined("Ns")) + typeRefNs = typeRef.getString("Ns"); + sequence.setTypeReference(new QName(typeRefName, typeRefNs)); + } + return sequence; } public GroupValue convert(Field field, ConversionContext context) { @@ -86,6 +97,11 @@ lengthDef.setFieldValue("InitialValue", length.getDefaultValue()); } } + if (sequence.getTypeReference() != null && !FastConstants.ANY_TYPE.equals(sequence.getTypeReference())) { + GroupValue typeRef = new GroupValue((Group) SessionControlProtocol_1_1.TYPE_REF.getField(new QName("TypeRef", SessionControlProtocol_1_1.NAMESPACE))); + setName(typeRef, sequence.getTypeReference()); + seqDef.setFieldValue("TypeRef", typeRef); + } return seqDef; } Modified: trunk/src/main/java/org/openfast/template/Scalar.java =================================================================== --- trunk/src/main/java/org/openfast/template/Scalar.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/template/Scalar.java 2008-10-29 00:37:29 UTC (rev 200) @@ -334,10 +334,24 @@ return equals((Scalar) other); } private boolean equals(Scalar other) { - return name.equals(other.name) && type.equals(other.type) && typeCodec.equals(other.typeCodec) - && operator.equals(other.operator) && operatorCodec.equals(other.operatorCodec) - && initialValue.equals(other.initialValue) && dictionary.equals(other.dictionary); + boolean equals = equals(name, other.name); + equals = equals && equals(type, other.type); + equals = equals && equals(typeCodec, other.typeCodec); + equals = equals && equals(operator, other.operator); + equals = equals && equals(operatorCodec, other.operatorCodec); + equals = equals && equals(initialValue, other.initialValue); + equals = equals && equals(dictionary, other.dictionary); + equals = equals && equals(id, other.id); + return equals; } + private boolean equals(Object o, Object o2) { + if (o == null) { + if (o2 == null) + return true; + return false; + } + return o.equals(o2); + } public int hashCode() { return name.hashCode() + type.hashCode() + typeCodec.hashCode() + operator.hashCode() + operatorCodec.hashCode() + initialValue.hashCode() + dictionary.hashCode(); Modified: trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java 2008-10-29 00:37:29 UTC (rev 200) @@ -10,6 +10,8 @@ writer.addAttribute("name", field.getQName().getName()); if (!context.getNamespace().equals(field.getQName().getNamespace())) writer.addAttribute("ns", field.getQName().getNamespace()); + if (field.getId() != null) + writer.addAttribute("id", field.getId()); if (field.isOptional()) writer.addAttribute("presence", "optional"); } Modified: trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java 2008-10-29 00:37:29 UTC (rev 200) @@ -18,8 +18,6 @@ String nodeName = getNodeName(scalar); writer.start(nodeName); AbstractFieldSerializer.writeCommonAttributes(writer, field, context); - if (scalar.getId() != null) - writer.addAttribute("id", scalar.getId()); if (scalar.getType().equals(Type.UNICODE)) writer.addAttribute("charset", "unicode"); if (!Operator.NONE.equals(scalar.getOperator())) { Modified: trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java 2008-10-29 00:37:29 UTC (rev 200) @@ -41,4 +41,12 @@ public String getDictionary() { return dictionary; } + + public void setTemplateNamespace(String templateNamespace) { + currentTemplateNamespace = templateNamespace; + } + + public void setNamespace(String namespace) { + currentNamespace = namespace; + } } Modified: trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java 2008-10-29 00:37:29 UTC (rev 200) @@ -12,7 +12,8 @@ if (!template.getQName().getNamespace().equals(context.getTemplateNamespace())) { writer.addAttribute("templateNs", template.getQName().getNamespace()); } - if (!template.getChildNamespace().equals(context.getNamespace())) { + if (!template.getChildNamespace().equals(context.getNamespace()) && + !template.getChildNamespace().equals("")) { writer.addAttribute("ns", template.getChildNamespace()); } if (template.getId() != null) { Modified: trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java 2008-10-29 00:37:29 UTC (rev 200) @@ -1,7 +1,13 @@ package org.openfast.template.serializer; import java.io.OutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import org.openfast.template.Group; import org.openfast.template.MessageTemplate; +import org.openfast.template.Scalar; +import org.openfast.template.Sequence; import org.openfast.util.XmlWriter; public class XMLMessageTemplateSerializer implements MessageTemplateSerializer { @@ -23,11 +29,85 @@ } public void serialize(MessageTemplate[] templates, OutputStream destination) { XmlWriter writer = new XmlWriter(destination); + writer.setEnableProcessingInstructions(true); + SerializingContext context = new SerializingContext(initialContext); writer.start("templates"); - SerializingContext context = new SerializingContext(initialContext); + String templateNamespace = whichTemplateNamespaceIsUsedMost(templates); + String childNamespace = whichNamespaceIsUsedMode(templates); + if (!"".equals(childNamespace)) + writer.addAttribute("ns", childNamespace); + if (!"".equals(templateNamespace)) + writer.addAttribute("templateNs", templateNamespace); + writer.addAttribute("xmlns", "http://www.fixprotocol.org/ns/fast/td/1.1"); + context.setTemplateNamespace(templateNamespace); + context.setNamespace(childNamespace); for (int i=0; i<templates.length; i++) { context.serialize(writer, templates[i]); } writer.end(); } + + private String whichNamespaceIsUsedMode(MessageTemplate[] templates) { + Map namespaces = new HashMap(); + for (int i=0; i<templates.length; i++) { + tallyNamespaceReferences(templates[i], namespaces); + } + + Iterator iter = namespaces.keySet().iterator(); + int champion = 0; + String championNs = ""; + while (iter.hasNext()) { + String contender = (String) iter.next(); + int contenderCount = ((Integer)namespaces.get(contender)).intValue(); + if (contenderCount > champion) { + champion = contenderCount; + championNs = contender; + } + } + return championNs; + } + private void tallyNamespaceReferences(Group group, Map namespaces) { + int start = 0; + if (group instanceof MessageTemplate) + start = 1; + for (int i=start; i<group.getFieldCount(); i++) { + if (group.getField(i) instanceof Scalar) { + String ns = group.getField(i).getQName().getNamespace(); + if (!namespaces.containsKey(ns)) { + namespaces.put(ns, new Integer(1)); + } else { + namespaces.put(ns, new Integer(((Integer) namespaces.get(ns)).intValue() + 1)); + } + } else if (group.getField(i) instanceof Group) { + tallyNamespaceReferences((Group) group.getField(i), namespaces); + } else if (group.getField(i) instanceof Sequence) { + tallyNamespaceReferences(((Sequence)group.getField(i)).getGroup(), namespaces); + } + } + } + + private String whichTemplateNamespaceIsUsedMost(MessageTemplate[] templates) { + Map namespaces = new HashMap(); + for (int i=0; i<templates.length; i++) { + String ns = templates[i].getQName().getNamespace(); + if (!namespaces.containsKey(ns)) { + namespaces.put(ns, new Integer(1)); + } else { + namespaces.put(ns, new Integer(((Integer) namespaces.get(ns)).intValue() + 1)); + } + } + + Iterator iter = namespaces.keySet().iterator(); + int champion = 0; + String championNs = ""; + while (iter.hasNext()) { + String contender = (String) iter.next(); + int contenderCount = ((Integer)namespaces.get(contender)).intValue(); + if (contenderCount > champion) { + champion = contenderCount; + championNs = contender; + } + } + return championNs; + } } Modified: trunk/src/main/java/org/openfast/util/XmlWriter.java =================================================================== --- trunk/src/main/java/org/openfast/util/XmlWriter.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/main/java/org/openfast/util/XmlWriter.java 2008-10-29 00:37:29 UTC (rev 200) @@ -13,16 +13,25 @@ private boolean open; private boolean hasChildren; private Stack elementStack = new Stack(); + private boolean processingInstructionsEnabled; + private boolean started = false; public XmlWriter(OutputStream destination) { this.writer = new PrintWriter(new OutputStreamWriter(destination)); } + public void setEnableProcessingInstructions(boolean enableProcessingInstructions) { + this.processingInstructionsEnabled = enableProcessingInstructions; + } + public void setTabSize(int tabSize) { this.tabSize = tabSize; } public void start(String nodeName) { + if (!started && processingInstructionsEnabled) + writer.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); + started = true; hasChildren = false; if (open) { writer.println(">"); Modified: trunk/src/test/java/org/openfast/session/SessionControlProtocol_1_1Test.java =================================================================== --- trunk/src/test/java/org/openfast/session/SessionControlProtocol_1_1Test.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/test/java/org/openfast/session/SessionControlProtocol_1_1Test.java 2008-10-29 00:37:29 UTC (rev 200) @@ -9,51 +9,50 @@ import org.openfast.test.OpenFastTestCase; public class SessionControlProtocol_1_1Test extends OpenFastTestCase { + private SessionControlProtocol_1_1 SCP_1_1; - private SessionControlProtocol_1_1 SCP_1_1; + protected void setUp() throws Exception { + SCP_1_1 = (SessionControlProtocol_1_1) SessionConstants.SCP_1_1; + } - protected void setUp() throws Exception { - SCP_1_1 = (SessionControlProtocol_1_1) SessionConstants.SCP_1_1; - } - - public void testSimpleCreateTemplateDefinitionMessage() { - Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.quoteTemplate()); - assertEquals("Quote", templateDef.getString("Name")); - SequenceValue instructions = templateDef.getSequence("Instructions"); - assertEquals("bid", instructions.get(0).getGroup(0).getString("Name")); - assertEquals("ask", templateDef.getSequence("Instructions").get(1).getGroup(0).getString("Name")); - } + public void testSimpleCreateTemplateDefinitionMessage() { + Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.quoteTemplate()); + assertEquals("Quote", templateDef.getString("Name")); + SequenceValue instructions = templateDef.getSequence("Instructions"); + assertEquals("bid", instructions.get(0).getGroup(0).getString("Name")); + assertEquals("ask", templateDef.getSequence("Instructions").get(1).getGroup(0).getString("Name")); + } - public void testSimpleCreateTemplateFromMessage() { - Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.quoteTemplate()); - MessageTemplate template = SCP_1_1.createTemplateFromMessage(templateDef, TemplateRegistry.NULL); - assertEquals(ObjectMother.quoteTemplate(), template); - } - - public void testComplexCreateTemplateDefinitionMessage() { - Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.allocationInstruction()); - assertEquals("AllocInstrctn", templateDef.getString("Name")); - } - - public void testComplexCreateTemplateFromMessage() { - Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.allocationInstruction()); - MessageTemplate template = SCP_1_1.createTemplateFromMessage(templateDef, TemplateRegistry.NULL); - assertEquals(ObjectMother.allocationInstruction(), template); - } - - public void testCreateTemplateDeclarationMessage() { - Message templateDecl = SCP_1_1.createTemplateDeclarationMessage(ObjectMother.quoteTemplate(), 104); - assertEquals("Quote", templateDecl.getString("Name")); - assertEquals(104, templateDecl.getInt("TemplateId")); - } - - public void testTemplateRef() { - Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.batchTemplate()); - assertEquals("Header", templateDef.getSequence("Instructions").get(0).getGroup(0).getString("Name")); - assertEquals(SessionControlProtocol_1_1.DYN_TEMP_REF_MESSAGE, templateDef.getSequence("Instructions").get(1).getGroup(0).getSequence("Instructions").get(0).getGroup(0)); - - BasicTemplateRegistry registry = new BasicTemplateRegistry(); - registry.register(24, ObjectMother.headerTemplate()); - assertEquals(ObjectMother.batchTemplate(), SCP_1_1.createTemplateFromMessage(templateDef, registry)); - } + public void testSimpleCreateTemplateFromMessage() { + Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.quoteTemplate()); + MessageTemplate template = SCP_1_1.createTemplateFromMessage(templateDef, TemplateRegistry.NULL); + assertEquals(ObjectMother.quoteTemplate(), template); + } + + public void testComplexCreateTemplateDefinitionMessage() { + Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.allocationInstruction()); + assertEquals("AllocInstrctn", templateDef.getString("Name")); + } + + public void testComplexCreateTemplateFromMessage() { + Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.allocationInstruction()); + MessageTemplate template = SCP_1_1.createTemplateFromMessage(templateDef, TemplateRegistry.NULL); + assertEquals(ObjectMother.allocationInstruction(), template); + } + + public void testCreateTemplateDeclarationMessage() { + Message templateDecl = SCP_1_1.createTemplateDeclarationMessage(ObjectMother.quoteTemplate(), 104); + assertEquals("Quote", templateDecl.getString("Name")); + assertEquals(104, templateDecl.getInt("TemplateId")); + } + + public void testTemplateRef() { + Message templateDef = SCP_1_1.createTemplateDefinitionMessage(ObjectMother.batchTemplate()); + assertEquals("Header", templateDef.getSequence("Instructions").get(0).getGroup(0).getString("Name")); + assertEquals(SessionControlProtocol_1_1.DYN_TEMP_REF_MESSAGE, templateDef.getSequence("Instructions").get(1).getGroup(0) + .getSequence("Instructions").get(0).getGroup(0)); + BasicTemplateRegistry registry = new BasicTemplateRegistry(); + registry.register(24, ObjectMother.headerTemplate()); + assertEquals(ObjectMother.batchTemplate(), SCP_1_1.createTemplateFromMessage(templateDef, registry)); + } } Added: trunk/src/test/java/org/openfast/session/template/exchange/GroupConverterTest.java =================================================================== --- trunk/src/test/java/org/openfast/session/template/exchange/GroupConverterTest.java (rev 0) +++ trunk/src/test/java/org/openfast/session/template/exchange/GroupConverterTest.java 2008-10-29 00:37:29 UTC (rev 200) @@ -0,0 +1,25 @@ +package org.openfast.session.template.exchange; + +import junit.framework.TestCase; +import org.openfast.GroupValue; +import org.openfast.QName; +import org.openfast.session.SessionControlProtocol_1_1; +import org.openfast.template.Field; +import org.openfast.template.Group; + +public class GroupConverterTest extends TestCase { + GroupConverter converter = new GroupConverter(); + ConversionContext context = SessionControlProtocol_1_1.createInitialContext(); + + public void testConvert() { + Group group = new Group(new QName("entry", "http://openfast.org"), new Field[] {}, false); + QName typeRef = new QName("MapEntry", "org.openfast"); + group.setTypeReference(typeRef); + GroupValue message = converter.convert(group, context); + assertEquals(typeRef.getName(), message.getGroup("TypeRef").getString("Name")); + assertEquals(typeRef.getNamespace(), message.getGroup("TypeRef").getString("Ns")); + + Group converted = (Group) converter.convert(message, null, context); + assertEquals(group, converted); + } +} Modified: trunk/src/test/java/org/openfast/session/template/exchange/SequenceConverterTest.java =================================================================== --- trunk/src/test/java/org/openfast/session/template/exchange/SequenceConverterTest.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/test/java/org/openfast/session/template/exchange/SequenceConverterTest.java 2008-10-29 00:37:29 UTC (rev 200) @@ -11,27 +11,24 @@ import org.openfast.template.TemplateRegistry; import org.openfast.template.operator.Operator; import org.openfast.template.type.Type; - import junit.framework.TestCase; public class SequenceConverterTest extends TestCase { - private SequenceConverter converter; - private ConversionContext context; + private SequenceConverter converter; + private ConversionContext context; - protected void setUp() throws Exception { - converter = new SequenceConverter(); - context = SessionControlProtocol_1_1.createInitialContext(); - } - - public void testConvert() { - Scalar lengthField = new Scalar("listSize", Type.U32, Operator.COPY, new IntegerValue(10), false); - Sequence sequence = new Sequence(new QName("list"), lengthField, new Field[] { new Scalar("item", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false )}, false); - assertTrue(converter.shouldConvert(sequence)); - - GroupValue fieldDef = converter.convert(sequence, context); - Sequence converted = (Sequence) converter.convert(fieldDef, TemplateRegistry.NULL, context); - - assertEquals(sequence, converted); - } + protected void setUp() throws Exception { + converter = new SequenceConverter(); + context = SessionControlProtocol_1_1.createInitialContext(); + } + public void testConvert() { + Scalar lengthField = new Scalar("listSize", Type.U32, Operator.COPY, new IntegerValue(10), false); + Sequence sequence = new Sequence(new QName("list"), lengthField, new Field[] { new Scalar("item", Type.DECIMAL, + Operator.DELTA, ScalarValue.UNDEFINED, false) }, false); + assertTrue(converter.shouldConvert(sequence)); + GroupValue fieldDef = converter.convert(sequence, context); + Sequence converted = (Sequence) converter.convert(fieldDef, TemplateRegistry.NULL, context); + assertEquals(sequence, converted); + } } Modified: trunk/src/test/java/org/openfast/session/template/exchange/TemplateDefinitionTest.java =================================================================== --- trunk/src/test/java/org/openfast/session/template/exchange/TemplateDefinitionTest.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/test/java/org/openfast/session/template/exchange/TemplateDefinitionTest.java 2008-10-29 00:37:29 UTC (rev 200) @@ -1,9 +1,9 @@ package org.openfast.session.template.exchange; import org.openfast.Context; -import org.openfast.GroupValue; import org.openfast.IntegerValue; import org.openfast.Message; +import org.openfast.ScalarValue; import org.openfast.codec.FastEncoder; import org.openfast.session.SessionConstants; import org.openfast.session.SessionControlProtocol_1_1; @@ -40,4 +40,17 @@ "10011001 10001011"; assertEquals(expected, encoded); } + + public void testEncodeId() { + Field field = new Scalar("a", Type.U32, Operator.NONE, ScalarValue.UNDEFINED, false); + field.setId("1"); + Message msg = (Message) converter.convert(field, conversionContext); + byte[] encoded = encoder.encode(msg); + String expected = + // --PMAP-- ---TEMPLATE ID--- ---NS--- -------NAME------ --------ID------- --OPT--- DFT VAL- + "11100000 01111101 10001101 10000000 10000001 01100001 10000010 00110001 10000000 10000000"; + assertEquals(expected, encoded); + + assertEquals(field, converter.convert(msg, context.getTemplateRegistry(), conversionContext)); + } } Modified: trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java =================================================================== --- trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java 2008-10-29 00:37:29 UTC (rev 200) @@ -24,7 +24,7 @@ scalar.setDictionary(Dictionary.TEMPLATE); scalar.setId("101"); String expected = - "<uInt32 name=\"value\" ns=\"http://openfast.org\" presence=\"optional\" id=\"101\">" + NL + + "<uInt32 name=\"value\" ns=\"http://openfast.org\" id=\"101\" presence=\"optional\">" + NL + " <delta dictionary=\"template\" key=\"data\" ns=\"http://www.openfast.org\" value=\"100\"/>" + NL + "</uInt32>" + NL; serializer.serialize(writer, scalar, XMLMessageTemplateSerializer.createInitialContext()); Modified: trunk/src/test/java/org/openfast/template/serializer/XMLMessageTemplateSerializerTest.java =================================================================== --- trunk/src/test/java/org/openfast/template/serializer/XMLMessageTemplateSerializerTest.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/test/java/org/openfast/template/serializer/XMLMessageTemplateSerializerTest.java 2008-10-29 00:37:29 UTC (rev 200) @@ -12,7 +12,8 @@ ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); serializer.serialize(new MessageTemplate[] { template }, byteOut); String expected = - "<templates>" + NL + + "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + NL + + "<templates xmlns=\"http://www.fixprotocol.org/ns/fast/td/1.1\">" + NL + " <template name=\"reset\"/>" + NL + "</templates>" + NL; assertEquals(expected, byteOut.toString()); Modified: trunk/src/test/java/org/openfast/test/ObjectMother.java =================================================================== --- trunk/src/test/java/org/openfast/test/ObjectMother.java 2008-10-28 16:22:03 UTC (rev 199) +++ trunk/src/test/java/org/openfast/test/ObjectMother.java 2008-10-29 00:37:29 UTC (rev 200) @@ -17,9 +17,7 @@ Contributor(s): Jacob Northey <ja...@la...> Craig Otis <co...@la...> -*/ - - + */ package org.openfast.test; import org.openfast.DecimalValue; @@ -40,65 +38,50 @@ import org.openfast.template.operator.Operator; import org.openfast.template.type.Type; - public class ObjectMother { private static MessageTemplate quoteTemplate; private static MessageTemplate allocationInstruction; private static Group instrument; private static Sequence allocations; - private static MessageTemplate batchTemplate; - private static MessageTemplate headerTemplate; + private static MessageTemplate batchTemplate; + private static MessageTemplate headerTemplate; public static final int QUOTE_TEMPLATE_ID = 10; public static final int ALLOC_INSTRCTN_TEMPLATE_ID = 25; public static MessageTemplate quoteTemplate() { if (quoteTemplate == null) { - quoteTemplate = new MessageTemplate("Quote", - new Field[] { - new Scalar("bid", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), - new Scalar("ask", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false) - }); + quoteTemplate = new MessageTemplate("Quote", new Field[] { + new Scalar("bid", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), + new Scalar("ask", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false) }); } - return quoteTemplate; } - public static MessageTemplate batchTemplate() { + public static MessageTemplate batchTemplate() { if (batchTemplate == null) { - batchTemplate = new MessageTemplate("Batch", - new Field[] { - new StaticTemplateReference(headerTemplate()), - new Sequence("Batch", new Field[] { - DynamicTemplateReference.INSTANCE - }, false) - }); + batchTemplate = new MessageTemplate("Batch", new Field[] { new StaticTemplateReference(headerTemplate()), + new Sequence("Batch", new Field[] { DynamicTemplateReference.INSTANCE }, false) }); } - return batchTemplate; - } + } public static MessageTemplate headerTemplate() { if (headerTemplate == null) { - headerTemplate = new MessageTemplate("Header", - new Field[] { - new Scalar("Sent", Type.U32, Operator.DELTA, ScalarValue.UNDEFINED, false) - }); + headerTemplate = new MessageTemplate("Header", new Field[] { new Scalar("Sent", Type.U32, Operator.DELTA, + ScalarValue.UNDEFINED, false) }); } - return headerTemplate; - } + } - public static Message quote(double bid, double ask) { + public static Message quote(double bid, double ask) { Message quote = new Message(quoteTemplate()); quote.setDecimal(1, bid); quote.setDecimal(2, ask); - return quote; } - public static Message newAllocInstrctn(String id, int side, - double quantity, double averagePrice, GroupValue instrument, - SequenceValue allocations) { + public static Message newAllocInstrctn(String id, int side, double quantity, double averagePrice, GroupValue instrument, + SequenceValue allocations) { Message allocInstrctn = new Message(allocationInstruction()); allocInstrctn.setFieldValue(1, allocations); allocInstrctn.setFieldValue(2, instrument); @@ -106,79 +89,62 @@ allocInstrctn.setFieldValue(4, new IntegerValue(side)); allocInstrctn.setFieldValue(5, new DecimalValue(quantity)); allocInstrctn.setFieldValue(6, new DecimalValue(averagePrice)); - return allocInstrctn; } public static MessageTemplate allocationInstruction() { if (allocationInstruction == null) { - allocationInstruction = new MessageTemplate("AllocInstrctn", - new Field[] { - allocations(), - instrument(), - new Scalar("ID", Type.ASCII, Operator.DELTA, ScalarValue.UNDEFINED, false), - new Scalar("Side", Type.U32, Operator.COPY, ScalarValue.UNDEFINED, false), - new Scalar("Quantity", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), - new Scalar("Average Price", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false) - }); + allocationInstruction = new MessageTemplate("AllocInstrctn", new Field[] { allocations(), instrument(), + new Scalar("ID", Type.ASCII, Operator.DELTA, ScalarValue.UNDEFINED, false), + new Scalar("Side", Type.U32, Operator.COPY, ScalarValue.UNDEFINED, false), + new Scalar("Quantity", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), + new Scalar("Average Price", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false) }); } - return allocationInstruction; } public static Sequence allocations() { if (allocations == null) { - allocations = new Sequence("Allocations", - new Field[] { - new Scalar("Account", Type.ASCII, Operator.COPY, ScalarValue.UNDEFINED, false), - new Scalar("Price", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), - new Scalar("Quantity", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), - new Scalar("Average Price", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false) - }, false); + allocations = new Sequence("Allocations", new Field[] { + new Scalar("Account", Type.ASCII, Operator.COPY, ScalarValue.UNDEFINED, false), + new Scalar("Price", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), + new Scalar("Quantity", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false), + new Scalar("Average Price", Type.DECIMAL, Operator.DELTA, ScalarValue.UNDEFINED, false) }, false); } - return allocations; } private static Group instrument() { if (instrument == null) { - instrument = new Group("Instrmt", - new Field[] { - new Scalar("Symbol", Type.ASCII, Operator.COPY, ScalarValue.UNDEFINED, false), - new Scalar("MMY", Type.ASCII, Operator.DELTA, ScalarValue.UNDEFINED, false), - }, false); + instrument = new Group("Instrmt", new Field[] { + new Scalar("Symbol", Type.ASCII, Operator.COPY, ScalarValue.UNDEFINED, false), + new Scalar("MMY", Type.ASCII, Operator.DELTA, ScalarValue.UNDEFINED, false), }, false); } - return instrument; } public static GroupValue newInstrument(String symbol, String mmy) { - return new GroupValue(instrument(), - new FieldValue[] { new StringValue(symbol), new StringValue(mmy) }); + return new GroupValue(instrument(), new FieldValue[] { new StringValue(symbol), new StringValue(mmy) }); } - public static GroupValue newAllocation(String account, double price, - double quantity) { + public static GroupValue newAllocation(String account, double price, double quantity) { StringValue acct = account != null ? new StringValue(account) : null; - return new GroupValue(allocations().getGroup(), - new FieldValue[] { - acct, new DecimalValue(price), - new DecimalValue(quantity), new DecimalValue(0.0) - }); + return new GroupValue(allocations().getGroup(), new FieldValue[] { acct, new DecimalValue(price), new DecimalValue(quantity), + new DecimalValue(0.0) }); } - public static Message basicAllocationInstruction() { - return newAllocInstrctn("abcd1234", 2, 25.0, 102.0, basicInstrument(), basicAllocations()); - } + public static Message basicAllocationInstruction() { + return newAllocInstrctn("abcd1234", 2, 25.0, 102.0, basicInstrument(), basicAllocations()); + } - private static SequenceValue basicAllocations() { - SequenceValue value = new SequenceValue(allocationInstruction().getSequence("Allocations")); - value.add(newAllocation("general", 101.0, 15.0)); - value.add(newAllocation("specific", 103.0, 10.0)); - return value; - } + private static SequenceValue basicAllocations() { + SequenceValue value = new SequenceValue(allocationInstruction().getSequence("Allocations")); + value.add(newAllocation("general", 101.0, 15.0)); + value.add(newAllocation("specific", 103.0, 10.0)); + return value; + } - private static GroupValue basicInstrument() { - return newInstrument("IBM", "200301"); - } + private static GroupValue basicInstrument() { + return newInstrument("IBM", "200301"); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-28 16:22:12
|
Revision: 199 http://openfast.svn.sourceforge.net/openfast/?rev=199&view=rev Author: jacob_northey Date: 2008-10-28 16:22:03 +0000 (Tue, 28 Oct 2008) Log Message: ----------- [FAST-10] Create XMLMessageTemplateSerializer for serializing MessageTemplate model to XML Modified Paths: -------------- trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_0.java trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java trunk/src/main/java/org/openfast/session/SessionProtocol.java trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java trunk/src/main/java/org/openfast/template/loader/ScalarParser.java trunk/src/main/resources/fastTemplateSchema-1.1.xsd trunk/src/test/java/org/openfast/test/OpenFastTestCase.java Added Paths: ----------- trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionDecoder.java trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionEncoder.java trunk/src/main/java/org/openfast/template/loader/FieldParser.java trunk/src/main/java/org/openfast/template/serializer/ trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java trunk/src/main/java/org/openfast/template/serializer/ComposedDecimalSerializer.java trunk/src/main/java/org/openfast/template/serializer/DynamicTemplateReferenceSerializer.java trunk/src/main/java/org/openfast/template/serializer/FieldSerializer.java trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java trunk/src/main/java/org/openfast/template/serializer/MessageTemplateSerializer.java trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java trunk/src/main/java/org/openfast/template/serializer/SerializerRegistry.java trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java trunk/src/main/java/org/openfast/template/serializer/StaticTemplateReferenceSerializer.java trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java trunk/src/main/java/org/openfast/util/XmlWriter.java trunk/src/main/resources/decodeTemplateExchange.bat trunk/src/main/resources/decodeTemplateExchange.sh trunk/src/main/resources/decoder.bat trunk/src/main/resources/decoder.sh trunk/src/main/resources/encodeTemplateExchange.bat trunk/src/main/resources/encodeTemplateExchange.sh trunk/src/test/java/org/openfast/template/serializer/ trunk/src/test/java/org/openfast/template/serializer/ComposedDecimalSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/DynamicTemplateReferenceSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/GroupSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/ScalarSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/SequenceSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/StaticTemplateReferenceSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/TemplateSerializerTest.java trunk/src/test/java/org/openfast/template/serializer/XMLMessageTemplateSerializerTest.java trunk/src/test/java/org/openfast/util/XmlWriterTest.java Removed Paths: ------------- trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java trunk/src/main/java/org/openfast/examples/tmplexch/Main.java trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java trunk/src/main/java/org/openfast/template/loader/FieldParser.java Added: trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/tmplexch/DecodeMain.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,81 @@ +package org.openfast.examples.tmplexch; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; + +public class DecodeMain extends OpenFastExample { + + private static Options options = new Options(); + + static { + options.addOption("?", HELP, false, "Displays this message"); + options.addOption("e", ERROR, false, "Show stacktrace information"); + options.addOption("n", NAMESPACE_AWARENESS, false, "Enables namespace awareness"); + options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Output message template definition file"); + options.addOption("f", FAST_DATA_FILE, true, "FAST Encoded Template Exchange file"); + } + + /** + * @param args + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine("consumer", args, options); + if (cl.hasOption("help")) { + displayHelp("consumer", options); + } + boolean showStacktrace = cl.hasOption(ERROR); + File templatesFile = null; + OutputStream out = System.out; + if (cl.hasOption(MESSAGE_TEMPLATE_FILE)) { + try { + templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + } catch (AssertionError e) { + System.out.println(e.getMessage()); + displayHelp("consumer", options); + } + } + InputStream fastIn = null; + try { + File inFile = getFile(cl, FAST_DATA_FILE); + if (!inFile.exists()) + inFile.createNewFile(); + Assert.assertTrue(inFile.exists(), "The fast encoded data file \"" + inFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!inFile.isDirectory(), "The fast encoded data file \"" + inFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(inFile.canRead(), "The fast encoded data file \"" + inFile.getAbsolutePath() + "\" is not readable."); + fastIn = new FileInputStream(inFile); + } catch (FileNotFoundException e) { + System.out.println("Unable to create output file."); + System.exit(1); + } catch (IOException e) { + System.out.println("Unable to create output file."); + System.exit(1); + } + TemplateExchangeDefinitionDecoder tmplExchanger = new TemplateExchangeDefinitionDecoder(fastIn, cl.hasOption(NAMESPACE_AWARENESS), out); + try { + tmplExchanger.start(); + } catch (IOException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("An IO error occurred while consuming messages: " + e.getMessage()); + System.exit(1); + } finally { + try { + out.flush(); + out.close(); + fastIn.close(); + } catch (IOException e) { + } + } + } +} Copied: trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java (from rev 198, trunk/src/main/java/org/openfast/examples/tmplexch/Main.java) =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,75 @@ +package org.openfast.examples.tmplexch; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; + +public class EncodeMain extends OpenFastExample { + + private static Options options = new Options(); + + static { + options.addOption("?", HELP, false, "Displays this message"); + options.addOption("e", ERROR, false, "Show stacktrace information"); + options.addOption("n", NAMESPACE_AWARENESS, false, "Enables namespace awareness"); + options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); + options.addOption("o", OUTPUT_FILE, true, "FAST Encoded output file"); + } + + /** + * @param args + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine("consumer", args, options); + if (cl.hasOption("help")) { + displayHelp("consumer", options); + } + boolean showStacktrace = cl.hasOption(ERROR); + File templatesFile = null; + try { + templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + } catch (AssertionError e) { + System.out.println(e.getMessage()); + displayHelp("consumer", options); + } + OutputStream out = System.out; + if (cl.hasOption(OUTPUT_FILE)) { + try { + File outFile = getFile(cl, OUTPUT_FILE); + if (!outFile.exists()) + outFile.createNewFile(); + out = new FileOutputStream(outFile); + } catch (FileNotFoundException e) { + System.out.println("Unable to create output file."); + System.exit(1); + } catch (IOException e) { + System.out.println("Unable to create output file."); + System.exit(1); + } + } + TemplateExchangeDefinitionEncoder tmplExchanger = new TemplateExchangeDefinitionEncoder(templatesFile, cl.hasOption(NAMESPACE_AWARENESS), out); + try { + tmplExchanger.start(); + } catch (IOException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("An IO error occurred while consuming messages: " + e.getMessage()); + System.exit(1); + } finally { + try { + out.flush(); + out.close(); + } catch (IOException e) { + } + } + } +} Property changes on: trunk/src/main/java/org/openfast/examples/tmplexch/EncodeMain.java ___________________________________________________________________ Added: svn:mergeinfo + Deleted: trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java 2008-10-28 16:22:03 UTC (rev 199) @@ -1,40 +0,0 @@ -package org.openfast.examples.tmplexch; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import org.openfast.Context; -import org.openfast.Message; -import org.openfast.codec.FastDecoder; -import org.openfast.template.TemplateRegistry; -import org.openfast.template.loader.XMLMessageTemplateLoader; - -public class FastMessageDecoder { - private final TemplateRegistry templateRegistry; - private final File fastDataFile; - - public FastMessageDecoder(File fastDataFile, File templatesFile, boolean namespaceAware) { - this.fastDataFile = fastDataFile; - XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); - loader.setLoadTemplateIdFromAuxId(true); - try { - loader.load(new FileInputStream(templatesFile)); - } catch (FileNotFoundException e) { - throw new RuntimeException(e.getMessage(), e); - } - this.templateRegistry = loader.getTemplateRegistry(); - } - - public void start() throws IOException { - Context context = new Context(); - context.setTemplateRegistry(templateRegistry); - FastDecoder decoder = new FastDecoder(context, new FileInputStream(fastDataFile)); - while (true) { - Message message = decoder.readMessage(); - if (message == null) - break; - System.out.println(message.toString()); - } - } -} Deleted: trunk/src/main/java/org/openfast/examples/tmplexch/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/Main.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/examples/tmplexch/Main.java 2008-10-28 16:22:03 UTC (rev 199) @@ -1,75 +0,0 @@ -package org.openfast.examples.tmplexch; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Options; -import org.openfast.examples.Assert; -import org.openfast.examples.OpenFastExample; - -public class Main extends OpenFastExample { - - private static Options options = new Options(); - - static { - options.addOption("?", HELP, false, "Displays this message"); - options.addOption("e", ERROR, false, "Show stacktrace information"); - options.addOption("n", NAMESPACE_AWARENESS, false, "Enables namespace awareness"); - options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); - options.addOption("o", OUTPUT_FILE, true, "FAST Encoded output file"); - } - - /** - * @param args - */ - public static void main(String[] args) { - CommandLine cl = parseCommandLine("consumer", args, options); - if (cl.hasOption("help")) { - displayHelp("consumer", options); - } - boolean showStacktrace = cl.hasOption(ERROR); - File templatesFile = null; - try { - templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); - Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); - Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); - Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); - } catch (AssertionError e) { - System.out.println(e.getMessage()); - displayHelp("consumer", options); - } - OutputStream out = System.out; - if (cl.hasOption(OUTPUT_FILE)) { - try { - File outFile = getFile(cl, OUTPUT_FILE); - if (!outFile.exists()) - outFile.createNewFile(); - out = new FileOutputStream(outFile); - } catch (FileNotFoundException e) { - System.out.println("Unable to create output file."); - System.exit(1); - } catch (IOException e) { - System.out.println("Unable to create output file."); - System.exit(1); - } - } - TemplateExchangeDefinition tmplExchanger = new TemplateExchangeDefinition(templatesFile, cl.hasOption(NAMESPACE_AWARENESS), out); - try { - tmplExchanger.start(); - } catch (IOException e) { - if (showStacktrace) - e.printStackTrace(); - System.out.println("An IO error occurred while consuming messages: " + e.getMessage()); - System.exit(1); - } finally { - try { - out.flush(); - out.close(); - } catch (IOException e) { - } - } - } -} Deleted: trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java 2008-10-28 16:22:03 UTC (rev 199) @@ -1,49 +0,0 @@ -package org.openfast.examples.tmplexch; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import org.openfast.Context; -import org.openfast.Message; -import org.openfast.codec.FastEncoder; -import org.openfast.session.SessionConstants; -import org.openfast.template.BasicTemplateRegistry; -import org.openfast.template.MessageTemplate; -import org.openfast.template.TemplateRegistry; -import org.openfast.template.loader.XMLMessageTemplateLoader; - -public class TemplateExchangeDefinition { - private final TemplateRegistry templateRegistry; - private final OutputStream out; - - public TemplateExchangeDefinition(File templatesFile, boolean namespaceAware) { - this(templatesFile, namespaceAware, System.out); - } - public TemplateExchangeDefinition(File templatesFile, boolean namespaceAware, OutputStream out) { - XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); - loader.setLoadTemplateIdFromAuxId(true); - try { - loader.load(new FileInputStream(templatesFile)); - } catch (FileNotFoundException e) { - throw new RuntimeException(e.getMessage(), e); - } - this.templateRegistry = loader.getTemplateRegistry(); - this.out = out; - } - - public void start() throws IOException { - Context context = new Context(); - BasicTemplateRegistry registry = new BasicTemplateRegistry(); - SessionConstants.SCP_1_1.registerSessionTemplates(registry); - registry.registerAll(templateRegistry); - context.setTemplateRegistry(registry); - FastEncoder encoder = new FastEncoder(context); - MessageTemplate[] templates = templateRegistry.getTemplates(); - for (int i=0; i<templates.length; i++) { - Message message = SessionConstants.SCP_1_1.createTemplateDefinitionMessage(templates[i]); - out.write(encoder.encode(message)); - } - } -} Added: trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionDecoder.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionDecoder.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionDecoder.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,43 @@ +package org.openfast.examples.tmplexch; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.codec.FastDecoder; +import org.openfast.session.SessionConstants; +import org.openfast.template.BasicTemplateRegistry; +import org.openfast.template.MessageTemplate; +import org.openfast.template.serializer.XMLMessageTemplateSerializer; + +public class TemplateExchangeDefinitionDecoder { + private InputStream fastIn; + private OutputStream out; + + public TemplateExchangeDefinitionDecoder(InputStream fastIn, boolean namespaceAware, OutputStream out) { + this.fastIn = fastIn; + this.out = out; + } + + public void start() throws IOException { + Context context = new Context(); + BasicTemplateRegistry registry = new BasicTemplateRegistry(); + SessionConstants.SCP_1_1.registerSessionTemplates(registry); + context.setTemplateRegistry(registry); + FastDecoder decoder = new FastDecoder(context, fastIn); + Message message = null; + List templates = new ArrayList(); + do { + message = decoder.readMessage(); + if (message != null) { + templates.add(SessionConstants.SCP_1_1.createTemplateFromMessage(message, registry)); + } + } while (message != null); + XMLMessageTemplateSerializer serializer = new XMLMessageTemplateSerializer(); + MessageTemplate[] templateArr = (MessageTemplate[]) templates.toArray(new MessageTemplate[templates.size()]); + serializer.serialize(templateArr, out); + } +} Copied: trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionEncoder.java (from rev 198, trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java) =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionEncoder.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionEncoder.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,49 @@ +package org.openfast.examples.tmplexch; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.codec.FastEncoder; +import org.openfast.session.SessionConstants; +import org.openfast.template.BasicTemplateRegistry; +import org.openfast.template.MessageTemplate; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +public class TemplateExchangeDefinitionEncoder { + private final TemplateRegistry templateRegistry; + private final OutputStream out; + + public TemplateExchangeDefinitionEncoder(File templatesFile, boolean namespaceAware) { + this(templatesFile, namespaceAware, System.out); + } + public TemplateExchangeDefinitionEncoder(File templatesFile, boolean namespaceAware, OutputStream out) { + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); + loader.setLoadTemplateIdFromAuxId(true); + try { + loader.load(new FileInputStream(templatesFile)); + } catch (FileNotFoundException e) { + throw new RuntimeException(e.getMessage(), e); + } + this.templateRegistry = loader.getTemplateRegistry(); + this.out = out; + } + + public void start() throws IOException { + Context context = new Context(); + BasicTemplateRegistry registry = new BasicTemplateRegistry(); + SessionConstants.SCP_1_1.registerSessionTemplates(registry); + registry.registerAll(templateRegistry); + context.setTemplateRegistry(registry); + FastEncoder encoder = new FastEncoder(context); + MessageTemplate[] templates = templateRegistry.getTemplates(); + for (int i=0; i<templates.length; i++) { + Message message = SessionConstants.SCP_1_1.createTemplateDefinitionMessage(templates[i]); + out.write(encoder.encode(message)); + } + } +} Property changes on: trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinitionEncoder.java ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_0.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_0.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_0.java 2008-10-28 16:22:03 UTC (rev 199) @@ -116,12 +116,15 @@ return false; } public Message createTemplateDeclarationMessage(MessageTemplate messageTemplate, int templateId) { - return null; + throw new UnsupportedOperationException(); } public Message createTemplateDefinitionMessage(MessageTemplate messageTemplate) { - return null; + throw new UnsupportedOperationException(); } public Message getCloseMessage() { return createFastAlertMessage(SessionConstants.CLOSE); } + public MessageTemplate createTemplateFromMessage(Message templateDef, TemplateRegistry registry) { + throw new UnsupportedOperationException(); + } } Modified: trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-28 16:22:03 UTC (rev 199) @@ -165,6 +165,7 @@ templateDefinition.setInteger("Reset", reset); return templateDefinition; } + public MessageTemplate createTemplateFromMessage(Message templateDef, TemplateRegistry registry) { String name = templateDef.getString("Name"); Field[] fields = GroupConverter.parseFieldInstructions(templateDef, registry, initialContext); Modified: trunk/src/main/java/org/openfast/session/SessionProtocol.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionProtocol.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/session/SessionProtocol.java 2008-10-28 16:22:03 UTC (rev 199) @@ -51,4 +51,6 @@ public Message getCloseMessage(); void registerSessionTemplates(TemplateRegistry registry); + + MessageTemplate createTemplateFromMessage(Message templateDef, TemplateRegistry registry); } Modified: trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java 2008-10-28 16:22:03 UTC (rev 199) @@ -39,18 +39,24 @@ public Field convert(GroupValue fieldDef, TemplateRegistry templateRegistry, ConversionContext context) { QName name = new QName(fieldDef.getString("Name"), fieldDef.getString("Ns")); boolean optional = fieldDef.getBool("Optional"); - GroupValue exponentDef = fieldDef.getGroup("Exponent"); - GroupValue exponentOperatorDef = exponentDef.getGroup("Operator").getGroup(0); - Operator exponentOperator = getOperator(exponentOperatorDef.getGroup()); + Operator exponentOperator = Operator.NONE; ScalarValue exponentDefaultValue = ScalarValue.UNDEFINED; - if (exponentDef.isDefined("InitialValue")) - exponentDefaultValue = new IntegerValue(exponentDef.getInt("InitialValue")); - GroupValue mantissaDef = fieldDef.getGroup("Mantissa"); - GroupValue mantissaOperatorDef = mantissaDef.getGroup("Operator").getGroup(0); - Operator mantissaOperator = getOperator(mantissaOperatorDef.getGroup()); + Operator mantissaOperator = Operator.NONE; ScalarValue mantissaDefaultValue = ScalarValue.UNDEFINED; - if (mantissaDef.isDefined("InitialValue")) - mantissaDefaultValue = new LongValue(mantissaDef.getInt("InitialValue")); + if (fieldDef.isDefined("Exponent")) { + GroupValue exponentDef = fieldDef.getGroup("Exponent"); + GroupValue exponentOperatorDef = exponentDef.getGroup("Operator").getGroup(0); + exponentOperator = getOperator(exponentOperatorDef.getGroup()); + if (exponentDef.isDefined("InitialValue")) + exponentDefaultValue = new IntegerValue(exponentDef.getInt("InitialValue")); + } + if (fieldDef.isDefined("Mantissa")) { + GroupValue mantissaDef = fieldDef.getGroup("Mantissa"); + GroupValue mantissaOperatorDef = mantissaDef.getGroup("Operator").getGroup(0); + mantissaOperator = getOperator(mantissaOperatorDef.getGroup()); + if (mantissaDef.isDefined("InitialValue")) + mantissaDefaultValue = new LongValue(mantissaDef.getInt("InitialValue")); + } return Util.composedDecimal(name, exponentOperator, exponentDefaultValue, mantissaOperator, mantissaDefaultValue, optional); } Modified: trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java =================================================================== --- trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java 2008-10-28 16:22:03 UTC (rev 199) @@ -33,7 +33,7 @@ private static final long serialVersionUID = 1L; public static final DynamicTemplateReference INSTANCE = new DynamicTemplateReference(); - private DynamicTemplateReference() { + public DynamicTemplateReference() { super(QName.NULL, false); } Deleted: trunk/src/main/java/org/openfast/template/loader/FieldParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/FieldParser.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/template/loader/FieldParser.java 2008-10-28 16:22:03 UTC (rev 199) @@ -1,30 +0,0 @@ -/* -The contents of this file are subject to the Mozilla Public License -Version 1.1 (the "License"); you may not use this file except in -compliance with the License. You may obtain a copy of the License at -http://www.mozilla.org/MPL/ - -Software distributed under the License is distributed on an "AS IS" -basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -License for the specific language governing rights and limitations -under the License. - -The Original Code is OpenFAST. - -The Initial Developer of the Original Code is The LaSalle Technology -Group, LLC. Portions created by The LaSalle Technology Group, LLC -are Copyright (C) The LaSalle Technology Group, LLC. All Rights Reserved. - -Contributor(s): Jacob Northey <ja...@la...> - Craig Otis <co...@la...> - */ -package org.openfast.template.loader; - -import org.openfast.template.Field; -import org.w3c.dom.Element; - -public interface FieldParser { - Field parse(Element fieldNode, ParsingContext context); - - boolean canParse(Element element, ParsingContext context); -} Added: trunk/src/main/java/org/openfast/template/loader/FieldParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/FieldParser.java (rev 0) +++ trunk/src/main/java/org/openfast/template/loader/FieldParser.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,30 @@ +/* +The contents of this file are subject to the Mozilla Public License +Version 1.1 (the "License"); you may not use this file except in +compliance with the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" +basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +License for the specific language governing rights and limitations +under the License. + +The Original Code is OpenFAST. + +The Initial Developer of the Original Code is The LaSalle Technology +Group, LLC. Portions created by The LaSalle Technology Group, LLC +are Copyright (C) The LaSalle Technology Group, LLC. All Rights Reserved. + +Contributor(s): Jacob Northey <ja...@la...> + Craig Otis <co...@la...> + */ +package org.openfast.template.loader; + +import org.openfast.template.Field; +import org.w3c.dom.Element; + +public interface FieldParser { + Field parse(Element fieldNode, ParsingContext context); + + boolean canParse(Element element, ParsingContext context); +} Property changes on: trunk/src/main/java/org/openfast/template/loader/FieldParser.java ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/src/main/java/org/openfast/template/loader/ScalarParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/ScalarParser.java 2008-10-27 23:58:28 UTC (rev 198) +++ trunk/src/main/java/org/openfast/template/loader/ScalarParser.java 2008-10-28 16:22:03 UTC (rev 199) @@ -44,7 +44,11 @@ public boolean canParse(Element element, ParsingContext context) { return context.getTypeMap().containsKey(getTypeName(element)); } - + + public boolean canSerialize(Field field) { + return field instanceof Scalar; + } + public Field parse(Element fieldNode, boolean optional, ParsingContext context) { Operator operator = Operator.NONE; String defaultValue = null; Added: trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/AbstractFieldSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,54 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.template.Group; +import org.openfast.template.Scalar; +import org.openfast.util.XmlWriter; + +public abstract class AbstractFieldSerializer implements FieldSerializer { + protected static void writeCommonAttributes(XmlWriter writer, Field field, SerializingContext context) { + writer.addAttribute("name", field.getQName().getName()); + if (!context.getNamespace().equals(field.getQName().getNamespace())) + writer.addAttribute("ns", field.getQName().getNamespace()); + if (field.isOptional()) + writer.addAttribute("presence", "optional"); + } + + protected static void writeOperator(XmlWriter writer, Scalar scalar, SerializingContext context) { + writer.start(scalar.getOperator().getName()); + if (!scalar.getDictionary().equals(context.getDictionary())) { + writer.addAttribute("dictionary", scalar.getDictionary()); + } + if (!scalar.getKey().equals(scalar.getQName())) { + writer.addAttribute("key", scalar.getKey().getName()); + if (!context.getNamespace().equals(scalar.getKey().getNamespace())) + writer.addAttribute("ns", scalar.getKey().getNamespace()); + } + if (!scalar.getDefaultValue().isUndefined()) { + writer.addAttribute("value", scalar.getDefaultValue().toString()); + } + writer.end(); + } + + protected static void writeChildren(XmlWriter writer, SerializingContext context, Group group) { + for (int i=0; i<group.getFieldCount(); i++) { + context.serialize(writer, group.getField(i)); + } + } + + protected static void writeTypeReference(XmlWriter writer, Group group) { + if (group.getTypeReference() != null) { + writer.start("typeRef"); + writer.addAttribute("name", group.getTypeReference().getName()); + if (!"".equals(group.getTypeReference().getNamespace())) + writer.addAttribute("ns", group.getTypeReference().getNamespace()); + writer.end(); + } + } + + protected static void writeLength(XmlWriter writer, Field field, SerializingContext context) { +// if (field.hasChild("length")) { +// +// } + } +} Added: trunk/src/main/java/org/openfast/template/serializer/ComposedDecimalSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/ComposedDecimalSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/ComposedDecimalSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,33 @@ +package org.openfast.template.serializer; + +import org.openfast.template.ComposedScalar; +import org.openfast.template.Field; +import org.openfast.template.Scalar; +import org.openfast.template.operator.Operator; +import org.openfast.template.type.Type; +import org.openfast.util.XmlWriter; + +public class ComposedDecimalSerializer implements FieldSerializer { + public boolean canSerialize(Field field) { + return field instanceof ComposedScalar && Type.DECIMAL.equals(((ComposedScalar) field).getType()); + } + + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + ComposedScalar decimal = (ComposedScalar) field; + Scalar exponent = decimal.getFields()[0]; + Scalar mantissa = decimal.getFields()[1]; + writer.start("decimal"); + AbstractFieldSerializer.writeCommonAttributes(writer, decimal, context); + if (!Operator.NONE.equals(exponent.getOperator())) { + writer.start("exponent"); + AbstractFieldSerializer.writeOperator(writer, exponent, context); + writer.end(); + } + if (!Operator.NONE.equals(mantissa.getOperator())) { + writer.start("mantissa"); + AbstractFieldSerializer.writeOperator(writer, mantissa, context); + writer.end(); + } + writer.end(); + } +} Added: trunk/src/main/java/org/openfast/template/serializer/DynamicTemplateReferenceSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/DynamicTemplateReferenceSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/DynamicTemplateReferenceSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,16 @@ +package org.openfast.template.serializer; + +import org.openfast.template.DynamicTemplateReference; +import org.openfast.template.Field; +import org.openfast.util.XmlWriter; + +public class DynamicTemplateReferenceSerializer implements FieldSerializer { + public boolean canSerialize(Field field) { + return field instanceof DynamicTemplateReference; + } + + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + writer.start("templateRef"); + writer.end(); + } +} Added: trunk/src/main/java/org/openfast/template/serializer/FieldSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/FieldSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/FieldSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,10 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.util.XmlWriter; + +public interface FieldSerializer { + void serialize(XmlWriter writer, Field field, SerializingContext context); + + boolean canSerialize(Field field); +} Added: trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/GroupSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,20 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.template.Group; +import org.openfast.util.XmlWriter; + +public class GroupSerializer extends AbstractFieldSerializer implements FieldSerializer { + public boolean canSerialize(Field field) { + return field instanceof Group; + } + + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + Group group = (Group) field; + writer.start("group"); + writeCommonAttributes(writer, field, context); + writeTypeReference(writer, group); + writeChildren(writer, context, group); + writer.end(); + } +} Added: trunk/src/main/java/org/openfast/template/serializer/MessageTemplateSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/MessageTemplateSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/MessageTemplateSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,8 @@ +package org.openfast.template.serializer; + +import java.io.OutputStream; +import org.openfast.template.MessageTemplate; + +public interface MessageTemplateSerializer { + public void serialize(MessageTemplate[] templates, OutputStream destination); +} Added: trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/ScalarSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,37 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.template.Scalar; +import org.openfast.template.operator.Operator; +import org.openfast.template.type.StringType; +import org.openfast.template.type.Type; +import org.openfast.util.XmlWriter; + +public class ScalarSerializer implements FieldSerializer { + + public boolean canSerialize(Field field) { + return field instanceof Scalar; + } + + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + Scalar scalar = (Scalar) field; + String nodeName = getNodeName(scalar); + writer.start(nodeName); + AbstractFieldSerializer.writeCommonAttributes(writer, field, context); + if (scalar.getId() != null) + writer.addAttribute("id", scalar.getId()); + if (scalar.getType().equals(Type.UNICODE)) + writer.addAttribute("charset", "unicode"); + if (!Operator.NONE.equals(scalar.getOperator())) { + AbstractFieldSerializer.writeOperator(writer, scalar, context); + } + writer.end(); + } + + private String getNodeName(Scalar scalar) { + String nodeName = scalar.getType().getName(); + if (scalar.getType() instanceof StringType) + nodeName = "string"; + return nodeName; + } +} Added: trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/SequenceSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,21 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.template.Sequence; +import org.openfast.util.XmlWriter; + +public class SequenceSerializer extends AbstractFieldSerializer implements FieldSerializer { + public boolean canSerialize(Field field) { + return field instanceof Sequence; + } + + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + Sequence sequence = (Sequence) field; + writer.start("sequence"); + writeCommonAttributes(writer, field, context); + writeTypeReference(writer, sequence.getGroup()); + writeLength(writer, sequence, context); + writeChildren(writer, context, sequence.getGroup()); + writer.end(); + } +} Added: trunk/src/main/java/org/openfast/template/serializer/SerializerRegistry.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/SerializerRegistry.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/SerializerRegistry.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,23 @@ +package org.openfast.template.serializer; + +import java.util.ArrayList; +import java.util.List; +import org.openfast.template.Field; + +public class SerializerRegistry { + private List serializers = new ArrayList(); + + public void addFieldSerializer(FieldSerializer serializer) { + serializers.add(serializer); + } + + public FieldSerializer getSerializer(Field field) { + for (int i=serializers.size()-1; i>=0; i--) { + FieldSerializer serializer = (FieldSerializer) serializers.get(i); + if (serializer.canSerialize(field)) { + return serializer; + } + } + return null; + } +} Added: trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/SerializingContext.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,44 @@ +package org.openfast.template.serializer; + +import org.openfast.Dictionary; +import org.openfast.template.Field; +import org.openfast.util.XmlWriter; + +public class SerializingContext { + private final SerializingContext parent; + private String currentNamespace = ""; + private String currentTemplateNamespace = ""; + private String dictionary = Dictionary.GLOBAL; + + public SerializingContext(SerializingContext parent) { + this.parent = parent; + } + + public static SerializingContext createInitialContext(final SerializerRegistry registry) { + return new SerializingContext(null) { + public SerializerRegistry getSerializerRegistry() { + return registry; + } + }; + } + + public void serialize(XmlWriter writer, Field field) { + getSerializerRegistry().getSerializer(field).serialize(writer, field, this); + } + + public SerializerRegistry getSerializerRegistry() { + return parent.getSerializerRegistry(); + } + + public String getNamespace() { + return currentNamespace; + } + + public String getTemplateNamespace() { + return currentTemplateNamespace; + } + + public String getDictionary() { + return dictionary; + } +} Added: trunk/src/main/java/org/openfast/template/serializer/StaticTemplateReferenceSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/StaticTemplateReferenceSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/StaticTemplateReferenceSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,18 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.template.StaticTemplateReference; +import org.openfast.util.XmlWriter; + +public class StaticTemplateReferenceSerializer implements FieldSerializer { + public boolean canSerialize(Field field) { + return field instanceof StaticTemplateReference; + } + + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + StaticTemplateReference ref = (StaticTemplateReference) field; + writer.start("templateRef"); + AbstractFieldSerializer.writeCommonAttributes(writer, ref.getTemplate(), context); + writer.end(); + } +} Added: trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/TemplateSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,40 @@ +package org.openfast.template.serializer; + +import org.openfast.template.Field; +import org.openfast.template.MessageTemplate; +import org.openfast.util.XmlWriter; + +public class TemplateSerializer implements FieldSerializer { + public void serialize(XmlWriter writer, Field field, SerializingContext context) { + MessageTemplate template = (MessageTemplate) field; + writer.start("template"); + writer.addAttribute("name", template.getName()); + if (!template.getQName().getNamespace().equals(context.getTemplateNamespace())) { + writer.addAttribute("templateNs", template.getQName().getNamespace()); + } + if (!template.getChildNamespace().equals(context.getNamespace())) { + writer.addAttribute("ns", template.getChildNamespace()); + } + if (template.getId() != null) { + writer.addAttribute("id", template.getId()); + } +// if (template.getDictionary() != null) { +// writer.addAttribute("dictionary", template.getDictionary()); +// } + if (template.getTypeReference() != null) { + writer.start("typeRef"); + writer.addAttribute("name", template.getTypeReference().getName()); + if (!"".equals(template.getTypeReference().getNamespace())) + writer.addAttribute("ns", template.getTypeReference().getNamespace()); + writer.end(); + } + for (int i=1; i<template.getFieldCount(); i++) { + context.serialize(writer, template.getField(i)); + } + writer.end(); + } + + public boolean canSerialize(Field field) { + return field instanceof MessageTemplate; + } +} Added: trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java =================================================================== --- trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java (rev 0) +++ trunk/src/main/java/org/openfast/template/serializer/XMLMessageTemplateSerializer.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,33 @@ +package org.openfast.template.serializer; + +import java.io.OutputStream; +import org.openfast.template.MessageTemplate; +import org.openfast.util.XmlWriter; + +public class XMLMessageTemplateSerializer implements MessageTemplateSerializer { + private SerializingContext initialContext; + public XMLMessageTemplateSerializer() { + this.initialContext = createInitialContext(); + } + public static SerializingContext createInitialContext() { + SerializerRegistry registry = new SerializerRegistry(); + registry.addFieldSerializer(new ScalarSerializer()); + registry.addFieldSerializer(new DynamicTemplateReferenceSerializer()); + registry.addFieldSerializer(new StaticTemplateReferenceSerializer()); + registry.addFieldSerializer(new ComposedDecimalSerializer()); + registry.addFieldSerializer(new GroupSerializer()); + registry.addFieldSerializer(new SequenceSerializer()); + registry.addFieldSerializer(new TemplateSerializer()); + SerializingContext context = SerializingContext.createInitialContext(registry); + return context; + } + public void serialize(MessageTemplate[] templates, OutputStream destination) { + XmlWriter writer = new XmlWriter(destination); + writer.start("templates"); + SerializingContext context = new SerializingContext(initialContext); + for (int i=0; i<templates.length; i++) { + context.serialize(writer, templates[i]); + } + writer.end(); + } +} Added: trunk/src/main/java/org/openfast/util/XmlWriter.java =================================================================== --- trunk/src/main/java/org/openfast/util/XmlWriter.java (rev 0) +++ trunk/src/main/java/org/openfast/util/XmlWriter.java 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,65 @@ +package org.openfast.util; + +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Stack; + +public class XmlWriter { + private final static int DEFAULT_TAB_SIZE = 4; + private final PrintWriter writer; + private int tabSize = DEFAULT_TAB_SIZE; + private String indent = ""; + private boolean open; + private boolean hasChildren; + private Stack elementStack = new Stack(); + + public XmlWriter(OutputStream destination) { + this.writer = new PrintWriter(new OutputStreamWriter(destination)); + } + + public void setTabSize(int tabSize) { + this.tabSize = tabSize; + } + + public void start(String nodeName) { + hasChildren = false; + if (open) { + writer.println(">"); + } + writer.print(indent + "<" + nodeName); + open = true; + indent(); + elementStack.push(nodeName); + } + + + public void addAttribute(String name, String value) { + if (!open) { + throw new IllegalStateException("Cannot add attribute here."); + } + writer.print(" " + name + "=\"" + value + "\""); + } + + public void end() { + unindent(); + String nodeName = (String) elementStack.pop(); + if (open || !hasChildren) { + writer.println("/>"); + } else { + writer.println(indent + "</" + nodeName + ">"); + } + writer.flush(); + hasChildren = true; + open = false; + } + + private void indent() { + for (int i=0; i<tabSize; i++) + indent += " "; + } + + private void unindent() { + indent = indent.substring(tabSize); + } +} \ No newline at end of file Added: trunk/src/main/resources/decodeTemplateExchange.bat =================================================================== --- trunk/src/main/resources/decodeTemplateExchange.bat (rev 0) +++ trunk/src/main/resources/decodeTemplateExchange.bat 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\commons-cli-1.1.jar +set MAIN=org.openfast.examples.tmplexch.DecodeMain + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/decodeTemplateExchange.sh =================================================================== --- trunk/src/main/resources/decodeTemplateExchange.sh (rev 0) +++ trunk/src/main/resources/decodeTemplateExchange.sh 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/commons-cli-1.1.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.tmplexch.DecodeMain +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file Added: trunk/src/main/resources/decoder.bat =================================================================== --- trunk/src/main/resources/decoder.bat (rev 0) +++ trunk/src/main/resources/decoder.bat 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\commons-cli-1.1.jar +set MAIN=org.openfast.examples.decoder.Main + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/decoder.sh =================================================================== --- trunk/src/main/resources/decoder.sh (rev 0) +++ trunk/src/main/resources/decoder.sh 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/commons-cli-1.1.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.decoder.Main +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file Added: trunk/src/main/resources/encodeTemplateExchange.bat =================================================================== --- trunk/src/main/resources/encodeTemplateExchange.bat (rev 0) +++ trunk/src/main/resources/encodeTemplateExchange.bat 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\commons-cli-1.1.jar +set MAIN=org.openfast.examples.tmplexch.EncodeMain + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/encodeTemplateExchange.sh =================================================================== --- trunk/src/main/resources/encodeTemplateExchange.sh (rev 0) +++ trunk/src/main/resources/encodeTemplateExchange.sh 2008-10-28 16:22:03 UTC (rev 199) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/commons-cli-1.1.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.tmplexch.EncodeMain +$JAVA... [truncated message content] |
From: <ope...@li...> - 2008-10-27 23:58:34
|
Revision: 198 http://openfast.svn.sourceforge.net/openfast/?rev=198&view=rev Author: jacob_northey Date: 2008-10-27 23:58:28 +0000 (Mon, 27 Oct 2008) Log Message: ----------- [FAST-8] Fixed StaticTemplateReference to template defined later in a templates XML file [FAST-9] Implemented delta operator for ByteVector and Unicode Modified Paths: -------------- trunk/src/main/java/org/openfast/ByteUtil.java trunk/src/main/java/org/openfast/ByteVectorValue.java trunk/src/main/java/org/openfast/codec/FastDecoder.java trunk/src/main/java/org/openfast/error/FastConstants.java trunk/src/main/java/org/openfast/examples/OpenFastExample.java trunk/src/main/java/org/openfast/examples/consumer/Main.java trunk/src/main/java/org/openfast/examples/performance/Main.java trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java trunk/src/main/java/org/openfast/session/SessionProtocol.java trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java trunk/src/main/java/org/openfast/template/Group.java trunk/src/main/java/org/openfast/template/StaticTemplateReference.java trunk/src/main/java/org/openfast/template/loader/TemplateParser.java trunk/src/main/java/org/openfast/template/loader/TemplateRefParser.java trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java trunk/src/main/java/org/openfast/template/operator/DeltaStringOperatorCodec.java trunk/src/main/java/org/openfast/template/type/ByteVectorType.java trunk/src/main/java/org/openfast/template/type/Type.java trunk/src/main/java/org/openfast/util/Util.java trunk/src/test/java/org/openfast/ByteUtilTest.java trunk/src/test/java/org/openfast/ByteVectorValueTest.java trunk/src/test/java/org/openfast/TypeConversionTest.java trunk/src/test/java/org/openfast/session/template/exchange/ScalarConverterTest.java trunk/src/test/java/org/openfast/template/ScalarTest.java trunk/src/test/java/org/openfast/template/TypeTest.java trunk/src/test/java/org/openfast/template/loader/StringParserTest.java trunk/src/test/java/org/openfast/template/loader/TemplateRefParserTest.java trunk/src/test/java/org/openfast/template/operator/DeltaStringOperatorTest.java trunk/src/test/java/org/openfast/template/type/codec/ByteVectorTest.java trunk/src/test/java/org/openfast/test/OpenFastTestCase.java trunk/src/test/java/org/openfast/util/UtilTest.java Added Paths: ----------- trunk/src/main/java/org/openfast/examples/decoder/ trunk/src/main/java/org/openfast/examples/decoder/FastMessageDecoder.java trunk/src/main/java/org/openfast/examples/decoder/Main.java trunk/src/main/java/org/openfast/examples/tmplexch/ trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java trunk/src/main/java/org/openfast/examples/tmplexch/Main.java trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java trunk/src/main/java/org/openfast/template/loader/UnresolvedStaticTemplateReferenceException.java trunk/src/main/resources/scpTemplates-1.1.xml trunk/src/test/java/org/openfast/session/template/exchange/TemplateDefinitionTest.java trunk/src/test/java/org/openfast/template/operator/DeltaByteVectorOperatorTest.java trunk/src/test/java/org/openfast/template/operator/DeltaUnicodeOperatorTest.java Modified: trunk/src/main/java/org/openfast/ByteUtil.java =================================================================== --- trunk/src/main/java/org/openfast/ByteUtil.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/ByteUtil.java 2008-10-27 23:58:28 UTC (rev 198) @@ -103,4 +103,14 @@ return false; return true; } + + public static byte[] combine(byte[] first, int firstOffset, int firstLength, byte[] second, int secondOffset, int secondLength) { + int fLen = Math.min(firstLength, first.length - firstOffset); + int sLen = Math.min(secondLength, second.length - secondOffset); + int totalLength = fLen + sLen; + byte[] result = new byte[totalLength]; + System.arraycopy(first, firstOffset, result, 0, fLen); + System.arraycopy(second, secondOffset, result, fLen, sLen); + return result; + } } Modified: trunk/src/main/java/org/openfast/ByteVectorValue.java =================================================================== --- trunk/src/main/java/org/openfast/ByteVectorValue.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/ByteVectorValue.java 2008-10-27 23:58:28 UTC (rev 198) @@ -22,10 +22,19 @@ public class ByteVectorValue extends ScalarValue { private static final long serialVersionUID = 1L; + public static final ScalarValue EMPTY_BYTES = new ByteVectorValue(new byte[] {}); public final byte[] value; + private int offset; + private int length; public ByteVectorValue(byte[] value) { + this(value, 0, value.length); + } + + public ByteVectorValue(byte[] value, int offset, int length) { this.value = value; + this.offset = offset; + this.length = length; } public byte[] getBytes() { @@ -33,14 +42,14 @@ } public String toString() { - StringBuffer builder = new StringBuffer(value.length * 2); - for (int i = 0; i < value.length; i++) { - String hex = Integer.toHexString(value[i]); - if (hex.length() == 1) - builder.append('0'); - builder.append(hex); - } - return builder.toString(); +// StringBuffer builder = new StringBuffer(value.length * 2); +// for (int i = 0; i < value.length; i++) { +// String hex = Integer.toHexString(value[i]); +// if (hex.length() == 1) +// builder.append('0'); +// builder.append(hex); +// } + return new String(value, offset, length); } public boolean equals(Object obj) { @@ -51,11 +60,11 @@ } public boolean equals(ByteVectorValue other) { - if (this.value.length != other.value.length) { + if (this.length != other.length) { return false; } - for (int i = 0; i < this.value.length; i++) - if (this.value[i] != other.value[i]) { + for (int i = 0; i < length; i++) + if (this.value[offset + i] != other.value[other.offset + i]) { return false; } return true; Modified: trunk/src/main/java/org/openfast/codec/FastDecoder.java =================================================================== --- trunk/src/main/java/org/openfast/codec/FastDecoder.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/codec/FastDecoder.java 2008-10-27 23:58:28 UTC (rev 198) @@ -20,18 +20,15 @@ */ package org.openfast.codec; +import java.io.InputStream; import org.openfast.BitVector; import org.openfast.BitVectorReader; import org.openfast.BitVectorValue; import org.openfast.Context; -import org.openfast.IntegerValue; import org.openfast.Message; - import org.openfast.template.MessageTemplate; import org.openfast.template.type.codec.TypeCodec; -import java.io.InputStream; - public class FastDecoder implements Coder { private final InputStream in; Modified: trunk/src/main/java/org/openfast/error/FastConstants.java =================================================================== --- trunk/src/main/java/org/openfast/error/FastConstants.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/error/FastConstants.java 2008-10-27 23:58:28 UTC (rev 198) @@ -70,4 +70,19 @@ ErrorCode PARSE_ERROR = new ErrorCode(DYNAMIC, 103, "PARSEERR", "An exception occurred while parsing.", ERROR); String TEMPLATE_DEFINITION_1_1 = "http://www.fixprotocol.org/ns/fast/td/1.1"; QName LENGTH_FIELD = new QName("length", TEMPLATE_DEFINITION_1_1); + ErrorHandler BASIC_ERROR_HANDLER = new ErrorHandler() { + public void error(ErrorCode code, String message) { + if (REPORTABLE.equals(code.getType())) + System.out.println("WARNING: " + message); + else + code.throwException(message); + } + + public void error(ErrorCode code, String message, Throwable t) { + if (REPORTABLE.equals(code.getType())) + System.out.println(message); + else + throw new FastException(message, code, t); + + }}; } Modified: trunk/src/main/java/org/openfast/examples/OpenFastExample.java =================================================================== --- trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-10-27 23:58:28 UTC (rev 198) @@ -8,6 +8,17 @@ import org.apache.commons.cli.ParseException; public class OpenFastExample { + protected static final String HELP = "help"; + protected static final String MESSAGE_TEMPLATE_FILE = "template"; + protected static final String PORT = "port"; + protected static final String PROTOCOL = "protocol"; + protected static final String HOST = "host"; + protected static final String ERROR = "error"; + protected static final String NAMESPACE_AWARENESS = "ns"; + protected static final String OUTPUT_FILE = "output"; + protected static final String TRACE = "trace"; + protected static final String FAST_DATA_FILE = "data"; + protected static CommandLine parseCommandLine(String name, String[] args, Options options) { try { BasicParser parser = new BasicParser(); Modified: trunk/src/main/java/org/openfast/examples/consumer/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-10-27 23:58:28 UTC (rev 198) @@ -12,21 +12,15 @@ import org.openfast.session.tcp.TcpEndpoint; public class Main extends OpenFastExample { - private static final String MESSAGE_TEMPLATE_FILE = "template"; - private static final String PORT = "port"; - private static final String PROTOCOL = "protocol"; - private static final String HOST = "host"; - private static final String ERROR = "error"; - private static Options options = new Options(); static { - options.addOption("?", "help", false, "Displays this message"); - options.addOption("t", "protocol", true, "Protocol [tcp|udp] defaults to tcp"); + options.addOption("?", HELP, false, "Displays this message"); + options.addOption("r", PROTOCOL, true, "Protocol [tcp|udp] defaults to tcp"); options.addOption("p", PORT, true, "Port to connect to"); - options.addOption("h", "host", true, "The host name of the server (or group name for multicast)"); - options.addOption("e", "error", false, "Show stacktrace information"); - options.addOption("m", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); + options.addOption("h", HOST, true, "The host name of the server (or group name for multicast)"); + options.addOption("e", ERROR, false, "Show stacktrace information"); + options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); } /** @@ -34,7 +28,7 @@ */ public static void main(String[] args) { CommandLine cl = parseCommandLine("consumer", args, options); - if (cl.hasOption("help")) { + if (cl.hasOption(HELP)) { displayHelp("consumer", options); } Endpoint endpoint = null; Added: trunk/src/main/java/org/openfast/examples/decoder/FastMessageDecoder.java =================================================================== --- trunk/src/main/java/org/openfast/examples/decoder/FastMessageDecoder.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/decoder/FastMessageDecoder.java 2008-10-27 23:58:28 UTC (rev 198) @@ -0,0 +1,50 @@ +package org.openfast.examples.decoder; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import org.openfast.Context; +import org.openfast.Global; +import org.openfast.Message; +import org.openfast.codec.FastDecoder; +import org.openfast.error.FastConstants; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +public class FastMessageDecoder { + private final TemplateRegistry templateRegistry; + private final File fastDataFile; + private boolean trace; + + public FastMessageDecoder(File fastDataFile, File templatesFile, boolean namespaceAware) { + this.fastDataFile = fastDataFile; + Global.setErrorHandler(FastConstants.BASIC_ERROR_HANDLER); + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); + loader.setLoadTemplateIdFromAuxId(true); + try { + loader.load(new FileInputStream(templatesFile)); + } catch (FileNotFoundException e) { + throw new RuntimeException(e.getMessage(), e); + } + this.templateRegistry = loader.getTemplateRegistry(); + } + + public void start() throws IOException { + Context context = new Context(); + context.setTraceEnabled(trace); + context.startTrace(); + context.setTemplateRegistry(templateRegistry); + FastDecoder decoder = new FastDecoder(context, new FileInputStream(fastDataFile)); + while (true) { + Message message = decoder.readMessage(); + if (message == null) + break; + System.out.println(message.toString()); + } + } + + public void setTraceEnabled() { + this.trace = true; + } +} Added: trunk/src/main/java/org/openfast/examples/decoder/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/decoder/Main.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/decoder/Main.java 2008-10-27 23:58:28 UTC (rev 198) @@ -0,0 +1,58 @@ +package org.openfast.examples.decoder; + +import java.io.File; +import java.io.IOException; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; + +public class Main extends OpenFastExample { + private static Options options = new Options(); + + static { + options.addOption("?", "help", false, "Displays this message"); + options.addOption("d", FAST_DATA_FILE, true, "FAST encoded data file"); + options.addOption("e", ERROR, false, "Show stacktrace information"); + options.addOption("n", NAMESPACE_AWARENESS, false, "Enables namespace awareness"); + options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); + options.addOption("v", TRACE, false, "Trace"); + } + + /** + * @param args + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine("consumer", args, options); + if (cl.hasOption("help")) { + displayHelp("consumer", options); + } + boolean showStacktrace = cl.hasOption(ERROR); + File templatesFile = null; + File dataFile = null; + try { + dataFile = getFile(cl, FAST_DATA_FILE); + Assert.assertTrue(dataFile.exists(), "The fast data file \"" + dataFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!dataFile.isDirectory(), "The fast data file \"" + dataFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(dataFile.canRead(), "The fast data file \"" + dataFile.getAbsolutePath() + "\" is not readable."); + templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + } catch (AssertionError e) { + System.out.println(e.getMessage()); + displayHelp("consumer", options); + } + FastMessageDecoder consumer = new FastMessageDecoder(dataFile, templatesFile, cl.hasOption(NAMESPACE_AWARENESS)); + if (cl.hasOption(TRACE)) + consumer.setTraceEnabled(); + try { + consumer.start(); + } catch (IOException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("An IO error occurred while consuming messages: " + e.getMessage()); + System.exit(1); + } + } +} Modified: trunk/src/main/java/org/openfast/examples/performance/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-27 23:58:28 UTC (rev 198) @@ -73,7 +73,8 @@ private static void run(PerformanceRunner performanceRunner) { PerformanceResult result = performanceRunner.run(); - + if (result == null) + return; System.out.println("Decoded " + result.getMessageCount() + " messages in " + result.getTime() + " milliseconds."); System.out.println("Average decode time per message: " + ((result.getTime() * 1000) / (result.getMessageCount())) + " microseconds"); } Added: trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/tmplexch/FastMessageDecoder.java 2008-10-27 23:58:28 UTC (rev 198) @@ -0,0 +1,40 @@ +package org.openfast.examples.tmplexch; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.codec.FastDecoder; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +public class FastMessageDecoder { + private final TemplateRegistry templateRegistry; + private final File fastDataFile; + + public FastMessageDecoder(File fastDataFile, File templatesFile, boolean namespaceAware) { + this.fastDataFile = fastDataFile; + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); + loader.setLoadTemplateIdFromAuxId(true); + try { + loader.load(new FileInputStream(templatesFile)); + } catch (FileNotFoundException e) { + throw new RuntimeException(e.getMessage(), e); + } + this.templateRegistry = loader.getTemplateRegistry(); + } + + public void start() throws IOException { + Context context = new Context(); + context.setTemplateRegistry(templateRegistry); + FastDecoder decoder = new FastDecoder(context, new FileInputStream(fastDataFile)); + while (true) { + Message message = decoder.readMessage(); + if (message == null) + break; + System.out.println(message.toString()); + } + } +} Added: trunk/src/main/java/org/openfast/examples/tmplexch/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/Main.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/tmplexch/Main.java 2008-10-27 23:58:28 UTC (rev 198) @@ -0,0 +1,75 @@ +package org.openfast.examples.tmplexch; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; + +public class Main extends OpenFastExample { + + private static Options options = new Options(); + + static { + options.addOption("?", HELP, false, "Displays this message"); + options.addOption("e", ERROR, false, "Show stacktrace information"); + options.addOption("n", NAMESPACE_AWARENESS, false, "Enables namespace awareness"); + options.addOption("t", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); + options.addOption("o", OUTPUT_FILE, true, "FAST Encoded output file"); + } + + /** + * @param args + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine("consumer", args, options); + if (cl.hasOption("help")) { + displayHelp("consumer", options); + } + boolean showStacktrace = cl.hasOption(ERROR); + File templatesFile = null; + try { + templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + } catch (AssertionError e) { + System.out.println(e.getMessage()); + displayHelp("consumer", options); + } + OutputStream out = System.out; + if (cl.hasOption(OUTPUT_FILE)) { + try { + File outFile = getFile(cl, OUTPUT_FILE); + if (!outFile.exists()) + outFile.createNewFile(); + out = new FileOutputStream(outFile); + } catch (FileNotFoundException e) { + System.out.println("Unable to create output file."); + System.exit(1); + } catch (IOException e) { + System.out.println("Unable to create output file."); + System.exit(1); + } + } + TemplateExchangeDefinition tmplExchanger = new TemplateExchangeDefinition(templatesFile, cl.hasOption(NAMESPACE_AWARENESS), out); + try { + tmplExchanger.start(); + } catch (IOException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("An IO error occurred while consuming messages: " + e.getMessage()); + System.exit(1); + } finally { + try { + out.flush(); + out.close(); + } catch (IOException e) { + } + } + } +} Added: trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java =================================================================== --- trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/tmplexch/TemplateExchangeDefinition.java 2008-10-27 23:58:28 UTC (rev 198) @@ -0,0 +1,49 @@ +package org.openfast.examples.tmplexch; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.codec.FastEncoder; +import org.openfast.session.SessionConstants; +import org.openfast.template.BasicTemplateRegistry; +import org.openfast.template.MessageTemplate; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +public class TemplateExchangeDefinition { + private final TemplateRegistry templateRegistry; + private final OutputStream out; + + public TemplateExchangeDefinition(File templatesFile, boolean namespaceAware) { + this(templatesFile, namespaceAware, System.out); + } + public TemplateExchangeDefinition(File templatesFile, boolean namespaceAware, OutputStream out) { + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); + loader.setLoadTemplateIdFromAuxId(true); + try { + loader.load(new FileInputStream(templatesFile)); + } catch (FileNotFoundException e) { + throw new RuntimeException(e.getMessage(), e); + } + this.templateRegistry = loader.getTemplateRegistry(); + this.out = out; + } + + public void start() throws IOException { + Context context = new Context(); + BasicTemplateRegistry registry = new BasicTemplateRegistry(); + SessionConstants.SCP_1_1.registerSessionTemplates(registry); + registry.registerAll(templateRegistry); + context.setTemplateRegistry(registry); + FastEncoder encoder = new FastEncoder(context); + MessageTemplate[] templates = templateRegistry.getTemplates(); + for (int i=0; i<templates.length; i++) { + Message message = SessionConstants.SCP_1_1.createTemplateDefinitionMessage(templates[i]); + out.write(encoder.encode(message)); + } + } +} Modified: trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-27 23:58:28 UTC (rev 198) @@ -301,9 +301,9 @@ unicodeopt("Dictionary"), new Group(qualify("Key"), new Field[] { new StaticTemplateReference(NS_NAME) }, true), new StaticTemplateReference(OTHER) }); public static final MessageTemplate CONSTANT_OP = new MessageTemplate(new QName("ConstantOp", NAMESPACE), - new Field[] { new StaticTemplateReference(OP_BASE) }); + new Field[] { new StaticTemplateReference(OTHER) }); public static final MessageTemplate DEFAULT_OP = new MessageTemplate(new QName("DefaultOp", NAMESPACE), - new Field[] { new StaticTemplateReference(OP_BASE) }); + new Field[] { new StaticTemplateReference(OTHER) }); public static final MessageTemplate COPY_OP = new MessageTemplate(new QName("CopyOp", NAMESPACE), new Field[] { new StaticTemplateReference(OP_BASE) }); public static final MessageTemplate INCREMENT_OP = new MessageTemplate(new QName("IncrementOp", NAMESPACE), Modified: trunk/src/main/java/org/openfast/session/SessionProtocol.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionProtocol.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/session/SessionProtocol.java 2008-10-27 23:58:28 UTC (rev 198) @@ -49,4 +49,6 @@ public Message createTemplateDeclarationMessage(MessageTemplate messageTemplate, int templateId); public Message getCloseMessage(); + + void registerSessionTemplates(TemplateRegistry registry); } Modified: trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/session/template/exchange/ComposedDecimalConverter.java 2008-10-27 23:58:28 UTC (rev 198) @@ -61,8 +61,10 @@ message.setInteger("Optional", field.isOptional() ? 1 : 0); GroupValue exponentDef = createComponent(composedScalar.getFields()[0], "Exponent"); GroupValue mantissaDef = createComponent(composedScalar.getFields()[1], "Mantissa"); - message.setFieldValue("Exponent", exponentDef); - message.setFieldValue("Mantissa", mantissaDef); + if (exponentDef != null) + message.setFieldValue("Exponent", exponentDef); + if (mantissaDef != null) + message.setFieldValue("Mantissa", mantissaDef); return message; } @@ -70,6 +72,8 @@ Group componentGroup = SessionControlProtocol_1_1.COMP_DECIMAL_INSTR.getGroup(componentName); GroupValue componentDef = new GroupValue(componentGroup); GroupValue componentOperatorDef = createOperator(component); + if (componentOperatorDef == null) + return null; GroupValue componentOperatorGroup = new GroupValue(componentGroup.getGroup("Operator")); componentDef.setFieldValue("Operator", componentOperatorGroup); componentOperatorGroup.setFieldValue(0, componentOperatorDef); Modified: trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java =================================================================== --- trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/session/template/exchange/VariableLengthInstructionConverter.java 2008-10-27 23:58:28 UTC (rev 198) @@ -43,6 +43,7 @@ GroupValue fieldDef = super.convert(field, context); if (scalar.hasAttribute(FastConstants.LENGTH_FIELD)) { GroupValue lengthDef = new GroupValue(fieldDef.getGroup().getGroup("Length")); + lengthDef.setString("Ns", ""); // TODO - Need to handle full Length definition lengthDef.setString("Name", scalar.getAttribute(FastConstants.LENGTH_FIELD)); fieldDef.setFieldValue("Length", lengthDef); } Modified: trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java =================================================================== --- trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/DynamicTemplateReference.java 2008-10-27 23:58:28 UTC (rev 198) @@ -98,4 +98,8 @@ public boolean equals(Object obj) { return obj != null && obj.getClass().equals(this.getClass()); } + + public String toString() { + return "DynamicTemplateRef"; + } } Modified: trunk/src/main/java/org/openfast/template/Group.java =================================================================== --- trunk/src/main/java/org/openfast/template/Group.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/Group.java 2008-10-27 23:58:28 UTC (rev 198) @@ -291,8 +291,7 @@ values[fieldIndex] = field.decode(in, fieldTmpl, context, pmapReader); } if (pmapReader.hasMoreBitsSet()) - Global.handleError(FastConstants.R8_PMAP_TOO_MANY_BITS, "The presence map " + pmapReader - + " has too many bits for the group " + this); + Global.handleError(FastConstants.R8_PMAP_TOO_MANY_BITS, "The presence map " + pmapReader + " has too many bits for the group " + this); return values; } Modified: trunk/src/main/java/org/openfast/template/StaticTemplateReference.java =================================================================== --- trunk/src/main/java/org/openfast/template/StaticTemplateReference.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/StaticTemplateReference.java 2008-10-27 23:58:28 UTC (rev 198) @@ -30,10 +30,19 @@ private static final long serialVersionUID = 1L; private MessageTemplate template; + protected void setTemplate(MessageTemplate template) { + this.template = template; + } + public StaticTemplateReference(MessageTemplate template) { super(template.getQName(), false); this.template = template; } + + public StaticTemplateReference() { + super(null, false); + this.template = null; + } public FieldValue createValue(String value) { return null; Modified: trunk/src/main/java/org/openfast/template/loader/TemplateParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/TemplateParser.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/loader/TemplateParser.java 2008-10-27 23:58:28 UTC (rev 198) @@ -21,6 +21,8 @@ package org.openfast.template.loader; import org.openfast.QName; +import org.openfast.error.FastConstants; +import org.openfast.error.FastException; import org.openfast.template.Field; import org.openfast.template.MessageTemplate; import org.w3c.dom.Element; @@ -40,9 +42,18 @@ * The dom element object * @return Returns a newly created MessageTemplate object */ - protected Field parse(Element templateElement, boolean optional, ParsingContext context) { - MessageTemplate messageTemplate = new MessageTemplate(getTemplateName(templateElement, context), parseFields(templateElement, - context)); + protected Field parse(final Element templateElement, boolean optional, final ParsingContext context) { + final QName templateName = getTemplateName(templateElement, context); + try { + final Field[] fields = parseFields(templateElement, context); + return createMessageTemplate(templateElement, context, templateName, fields); + } catch (UnresolvedStaticTemplateReferenceException e) { + return null; + } + } + + private MessageTemplate createMessageTemplate(Element templateElement, ParsingContext context, QName templateName, Field[] fields) { + MessageTemplate messageTemplate = new MessageTemplate(templateName, fields); parseMore(templateElement, messageTemplate, context); if (loadTemplateIdFromAuxId && templateElement.hasAttribute("id")) { try { @@ -51,8 +62,9 @@ } catch (NumberFormatException e) { context.getTemplateRegistry().define(messageTemplate); } - } else + } else { context.getTemplateRegistry().define(messageTemplate); + } return messageTemplate; } Modified: trunk/src/main/java/org/openfast/template/loader/TemplateRefParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/TemplateRefParser.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/loader/TemplateRefParser.java 2008-10-27 23:58:28 UTC (rev 198) @@ -21,7 +21,6 @@ package org.openfast.template.loader; import org.openfast.QName; -import org.openfast.error.FastConstants; import org.openfast.template.DynamicTemplateReference; import org.openfast.template.Field; import org.openfast.template.StaticTemplateReference; @@ -34,13 +33,11 @@ if (element.hasAttribute("templateNs")) templateName = new QName(element.getAttribute("name"), element.getAttribute("templateNs")); else - templateName = new QName(element.getAttribute("name"), ""); - if (context.getTemplateRegistry().isDefined(templateName)) + templateName = new QName(element.getAttribute("name"), context.getTemplateNamespace()); + if (context.getTemplateRegistry().isDefined(templateName)) { return new StaticTemplateReference(context.getTemplateRegistry().get(templateName)); - else { - context.getErrorHandler().error(FastConstants.D8_TEMPLATE_NOT_EXIST, - "The template \"" + templateName + "\" was not found."); - return null; + } else { + throw new UnresolvedStaticTemplateReferenceException(); } } else { return DynamicTemplateReference.INSTANCE; Added: trunk/src/main/java/org/openfast/template/loader/UnresolvedStaticTemplateReferenceException.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/UnresolvedStaticTemplateReferenceException.java (rev 0) +++ trunk/src/main/java/org/openfast/template/loader/UnresolvedStaticTemplateReferenceException.java 2008-10-27 23:58:28 UTC (rev 198) @@ -0,0 +1,6 @@ +package org.openfast.template.loader; + +public class UnresolvedStaticTemplateReferenceException extends RuntimeException { + private static final long serialVersionUID = 1L; + +} Modified: trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-10-27 23:58:28 UTC (rev 198) @@ -32,6 +32,7 @@ import org.openfast.error.ErrorHandler; import org.openfast.error.FastAlertSeverity; import org.openfast.error.FastConstants; +import org.openfast.error.FastException; import org.openfast.template.BasicTemplateRegistry; import org.openfast.template.MessageTemplate; import org.openfast.template.TemplateRegistry; @@ -114,9 +115,23 @@ NodeList templateTags = root.getElementsByTagName("template"); MessageTemplate[] templates = new MessageTemplate[templateTags.getLength()]; - for (int i = 0; i < templateTags.getLength(); i++) { - Element templateTag = (Element) templateTags.item(i); - templates[i] = (MessageTemplate) templateParser.parse(templateTag, context); + int templatesToLoad = templates.length; + int previousNumberOfTemplatesLeft = templates.length; + while (templatesToLoad > 0) { + for (int i = 0; i < templateTags.getLength(); i++) { + if (templates[i] == null) { + Element templateTag = (Element) templateTags.item(i); + MessageTemplate template = (MessageTemplate) templateParser.parse(templateTag, context); + if (template != null) { + templates[i] = template; + templatesToLoad--; + } + } + } + if (previousNumberOfTemplatesLeft == templatesToLoad) { + throw new FastException("Unresolved static template references exist.", FastConstants.PARSE_ERROR); + } + previousNumberOfTemplatesLeft = templatesToLoad; } return templates; } else { Modified: trunk/src/main/java/org/openfast/template/operator/DeltaStringOperatorCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/operator/DeltaStringOperatorCodec.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/operator/DeltaStringOperatorCodec.java 2008-10-27 23:58:28 UTC (rev 198) @@ -25,7 +25,6 @@ import org.openfast.Global; import org.openfast.ScalarValue; -import org.openfast.StringValue; import org.openfast.error.FastConstants; import org.openfast.template.Scalar; import org.openfast.template.TwinValue; @@ -36,7 +35,7 @@ private static final long serialVersionUID = 1L; DeltaStringOperatorCodec() { - super(Operator.DELTA, new Type[] { Type.ASCII, Type.STRING }); + super(Operator.DELTA, new Type[] { Type.ASCII, Type.STRING, Type.UNICODE, Type.BYTE_VECTOR }); } /** @@ -54,7 +53,7 @@ return null; } ScalarValue base = (priorValue.isUndefined()) ? field.getBaseValue() : priorValue; - return Util.getDifference((StringValue) value, (StringValue) base); + return Util.getDifference(value.getBytes(), base.getBytes()); } /** @@ -75,7 +74,8 @@ Global.handleError(FastConstants.D7_SUBTRCTN_LEN_LONG, "The string diff <" + diffValue + "> cannot be applied to the base value \"" + base + "\" because the subtraction length is too long."); } - return Util.applyDifference((StringValue) base, diffValue); + byte[] bytes = Util.applyDifference(base, diffValue); + return field.getType().getValue(bytes); } public ScalarValue decodeEmptyValue(ScalarValue previousValue, Scalar field) { Modified: trunk/src/main/java/org/openfast/template/type/ByteVectorType.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/ByteVectorType.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/type/ByteVectorType.java 2008-10-27 23:58:28 UTC (rev 198) @@ -59,4 +59,8 @@ public boolean isValueOf(ScalarValue previousValue) { return previousValue instanceof ByteVectorValue; } + + public ScalarValue getValue(byte[] bytes) { + return new ByteVectorValue(bytes); + } } \ No newline at end of file Modified: trunk/src/main/java/org/openfast/template/type/Type.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/Type.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/template/type/Type.java 2008-10-27 23:58:28 UTC (rev 198) @@ -21,10 +21,11 @@ package org.openfast.template.type; import java.io.Serializable; +import java.io.UnsupportedEncodingException; import java.util.LinkedHashMap; import java.util.Map; - import org.openfast.ScalarValue; +import org.openfast.StringValue; import org.openfast.template.operator.Operator; import org.openfast.template.type.codec.TypeCodec; import org.openfast.util.Util; @@ -81,9 +82,31 @@ public final static Type I16 = new SignedIntegerType(16, Short.MIN_VALUE, Short.MAX_VALUE); public final static Type I32 = new SignedIntegerType(32, Integer.MIN_VALUE, Integer.MAX_VALUE); public final static Type I64 = new SignedIntegerType(64, Long.MIN_VALUE, Long.MAX_VALUE); - public final static Type STRING = new StringType("string", TypeCodec.ASCII, TypeCodec.NULLABLE_ASCII); - public final static Type ASCII = new StringType("ascii", TypeCodec.ASCII, TypeCodec.NULLABLE_ASCII); - public final static Type UNICODE = new StringType("unicode", TypeCodec.UNICODE, TypeCodec.NULLABLE_UNICODE); + public final static Type STRING = new StringType("string", TypeCodec.ASCII, TypeCodec.NULLABLE_ASCII) { + private static final long serialVersionUID = 1L; + + public ScalarValue getValue(byte[] bytes) { + return new StringValue(new String(bytes)); + } + }; + public final static Type ASCII = new StringType("ascii", TypeCodec.ASCII, TypeCodec.NULLABLE_ASCII) { + private static final long serialVersionUID = 1L; + + public ScalarValue getValue(byte[] bytes) { + return new StringValue(new String(bytes)); + } + }; + public final static Type UNICODE = new StringType("unicode", TypeCodec.UNICODE, TypeCodec.NULLABLE_UNICODE) { + private static final long serialVersionUID = 1L; + + public ScalarValue getValue(byte[] bytes) { + try { + return new StringValue(new String(bytes, "UTF8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + }; public final static Type BYTE_VECTOR = new ByteVectorType(); public final static Type DECIMAL = new DecimalType(); public static final Type[] ALL_TYPES = new Type[] { U8, U16, U32, U64, I8, I16, I32, I64, STRING, ASCII, UNICODE, BYTE_VECTOR, @@ -101,4 +124,7 @@ public int hashCode() { return name.hashCode(); } + public ScalarValue getValue(byte[] bytes) { + throw new UnsupportedOperationException(); + } } Modified: trunk/src/main/java/org/openfast/util/Util.java =================================================================== --- trunk/src/main/java/org/openfast/util/Util.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/main/java/org/openfast/util/Util.java 2008-10-27 23:58:28 UTC (rev 198) @@ -20,16 +20,18 @@ */ package org.openfast.util; +import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.TimeZone; +import org.openfast.ByteUtil; +import org.openfast.ByteVectorValue; import org.openfast.Global; import org.openfast.IntegerValue; import org.openfast.QName; import org.openfast.ScalarValue; -import org.openfast.StringValue; import org.openfast.template.ComposedScalar; import org.openfast.template.Scalar; import org.openfast.template.TwinValue; @@ -38,46 +40,45 @@ import org.openfast.template.type.Type; public class Util { - private static final TwinValue NO_DIFF = new TwinValue(new IntegerValue(0), new StringValue("")); + private static final TwinValue NO_DIFF = new TwinValue(new IntegerValue(0), ByteVectorValue.EMPTY_BYTES); public static boolean isBiggerThanInt(long value) { return (value > Integer.MAX_VALUE) || (value < Integer.MIN_VALUE); } - public static ScalarValue getDifference(StringValue newValue, StringValue priorValue) { - String value = newValue.value; - if ((priorValue == null) || (priorValue.value.length() == 0)) { - return new TwinValue(new IntegerValue(0), newValue); + public static ScalarValue getDifference(byte[] newValue, byte[] priorValue) { + if ((priorValue == null) || (priorValue.length == 0)) { + return new TwinValue(new IntegerValue(0), new ByteVectorValue(newValue)); } - if (priorValue.equals(newValue)) { + if (Arrays.equals(priorValue, newValue)) { return NO_DIFF; } - String base = priorValue.value; int appendIndex = 0; - while ((appendIndex < base.length()) && (appendIndex < value.length()) - && (value.charAt(appendIndex) == base.charAt(appendIndex))) + while ((appendIndex < priorValue.length) && (appendIndex < newValue.length) + && (newValue[appendIndex] == priorValue[appendIndex])) appendIndex++; - String append = value.substring(appendIndex); int prependIndex = 1; - while ((prependIndex <= value.length()) && (prependIndex <= base.length()) - && (value.charAt(value.length() - prependIndex) == base.charAt(base.length() - prependIndex))) + while ((prependIndex <= newValue.length) && (prependIndex <= priorValue.length) + && (newValue[newValue.length - prependIndex] == priorValue[priorValue.length - prependIndex])) prependIndex++; - String prepend = value.substring(0, value.length() - prependIndex + 1); - if (prepend.length() < append.length()) { - return new TwinValue(new IntegerValue(prependIndex - base.length() - 2), new StringValue(prepend)); +// String prepend = newValue.substring(0, value.length() - prependIndex + 1); + int prependLength = newValue.length - prependIndex + 1; + int appendLength = newValue.length - appendIndex; + if (prependLength < appendLength) { + return new TwinValue(new IntegerValue(prependIndex - priorValue.length - 2), new ByteVectorValue(newValue, 0, prependLength)); } - return new TwinValue(new IntegerValue(base.length() - appendIndex), new StringValue(append)); + return new TwinValue(new IntegerValue(priorValue.length - appendIndex), new ByteVectorValue(newValue, appendIndex, appendLength)); } - public static StringValue applyDifference(StringValue baseValue, TwinValue diffValue) { + public static byte[] applyDifference(ScalarValue baseValue, TwinValue diffValue) { int subtraction = ((IntegerValue) diffValue.first).value; - String base = baseValue.value; - String diff = ((StringValue) diffValue.second).value; + byte[] base = baseValue.getBytes(); + byte[] diff = diffValue.second.getBytes(); if (subtraction < 0) { subtraction = (-1 * subtraction) - 1; - return new StringValue(diff + base.substring(subtraction, base.length())); + return ByteUtil.combine(diff, 0, diff.length, base, subtraction, base.length); } - return new StringValue(base.substring(0, base.length() - subtraction) + diff); + return ByteUtil.combine(base, 0, base.length - subtraction, diff, 0, diff.length); } public static String collectionToString(Collection set) { Added: trunk/src/main/resources/scpTemplates-1.1.xml =================================================================== --- trunk/src/main/resources/scpTemplates-1.1.xml (rev 0) +++ trunk/src/main/resources/scpTemplates-1.1.xml 2008-10-27 23:58:28 UTC (rev 198) @@ -0,0 +1,239 @@ +<templates xmlns:scp="http://www.fixprotocol.org/ns/fast/scp/1.1" xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" templateNs="http://www.fixprotocol.org/ns/fast/scp/1.1" ns="http://www.fixprotocol.org/ns/fast/scp/1.1"> + + <template name="Hello" scp:reset="yes" id="16002"> + <typeRef name="Hello"/> + <string name="SenderName"/> + <string name="VendorId" presence="optional"/> + </template> + + <template name="Alert" id="16003"> + <typeRef name="Alert"/> + <uInt32 name="Severity"/> + <uInt32 name="Code"/> + <uInt32 name="Value" presence="optional"/> + <string name="Description" presence="optional"/> + </template> + + <template name="Reset" scp:reset="yes" id="120"> <typeRef name="Reset"/> </template> + + <template name="NsName"> + <string name="Ns" charset="unicode"> <copy/> </string> + <string name="Name" charset="unicode"/> + </template> + + <template name="TemplateName"> + <string name="Ns" charset="unicode"> <copy dictionary="template"/> </string> + <string name="Name" charset="unicode"/> + </template> + + <template name="TypeRef"> + <group name="TypeRef" presence="optional"> + <templateRef name="NsName"/> + <templateRef name="Other"/> + </group> + </template> + + <template name="TemplateDecl" id="16010"> + <typeRef name="TemplateDecl"/> + <templateRef name="TemplateName"/> + <uInt32 name="TemplateId"/> + </template> + + <template name="TemplateDef" id="16011"> + <typeRef name="TemplateDef"/> + <templateRef name="TemplateName"/> + <string name="AuxId" charset="unicode" presence="optional"/> + <uInt32 name="TemplateId" presence="optional"/> + <templateRef name="TypeRef"/> + <uInt32 name="Reset"/> + <templateRef name="Other"/> + <sequence name="Instructions"> <templateRef/> </sequence> + </template> + + <template name="NsNameWithAuxId"> + <templateRef name="NsName"/> + <string name="AuxId" charset="unicode" presence="optional"/> + </template> + + <template name="FieldBase"> + <templateRef name="NsNameWithAuxId"/> + <uInt32 name="Optional"/> + <templateRef name="Other"/> + </template> + + <template name="PrimFieldBase"> + <templateRef name="FieldBase"/> + <group name="Operator" presence="optional"> <templateRef/> </group> + </template> + + <template name="LengthPreamble"> + <templateRef name="NsNameWithAuxId"/> + <templateRef name="Other"/> + </template> + + <template name="PrimFieldBaseWithLength"> + <templateRef name="PrimFieldBase"/> + <group name="Length" presence="optional"> <templateRef name="LengthPreamble"/> </group> + </template> + + <template name="Int32Instr" id="16012"> + <typeRef name="Int32Instr"/> + <templateRef name="PrimFieldBase"/> + <int32 name="InitialValue" presence="optional"/> + </template> + + <template name="UInt32Instr" id="16013"> + <typeRef name="UInt32Instr"/> + <templateRef name="PrimFieldBase"/> + <uInt32 name="InitialValue" presence="optional"/> + </template> + + <template name="Int64Instr" id="16014"> + <typeRef name="Int64Instr"/> + <templateRef name="PrimFieldBase"/> + <int64 name="InitialValue" presence="optional"/> + </template> + + <template name="UInt64Instr" id="16015"> + <typeRef name="UInt64Instr"/> + <templateRef name="PrimFieldBase"/> + <uInt64 name="InitialValue" presence="optional"/> + </template> + + <template name="DecimalInstr" id="16016"> + <typeRef name="DecimalInstr"/> + <templateRef name="PrimFieldBase"/> + <decimal name="InitialValue" presence="optional"/> + </template> + + <template name="CompositeDecimalInstr" id="16017"> + <typeRef name="CompositeDecimalInstr"/> + <templateRef name="FieldBase"/> + <group name="Exponent" presence="optional"> + <group name="Operator"> <templateRef/> </group> + <int32 name="InitialValue" presence="optional"/> + <templateRef name="Other"/> + </group> + <group name="Mantissa" presence="optional"> + <group name="Operator"> <templateRef/> </group> + <int64 name="InitialValue" presence="optional"/> + <templateRef name="Other"/> + </group> + </template> + + <template name="AsciiStringInstr" id="16018"> + <typeRef name="AsciiStringInstr"/> + <templateRef name="PrimFieldBase"/> + <string name="InitialValue" presence="optional"/> + </template> + + <template name="UnicodeStringInstr" id="16019"> + <typeRef name="UnicodeStringInstr"/> + <templateRef name="PrimFieldBaseWithLength"/> + <string name="InitialValue" presence="optional" charset="unicode"/> + </template> + + <template name="ByteVectorInstr" id="16020"> + <typeRef name="ByteVectorInstr"/> + <templateRef name="PrimFieldBaseWithLength"/> + <byteVector name="InitialValue" presence="optional"/> + </template> + + <template name="StaticTemplateRefInstr" id="16021"> + <typeRef name="StaticTemplateRefInstr"/> + <templateRef name="TemplateName"/> + <templateRef name="Other"/> + </template> + + <template name="DynamicTemplateRefInstr" id="16022"> + <typeRef name="DynamicTemplateRefInstr"/> + <templateRef name="Other"/> + </template> + + <template name="SequenceInstr" id="16023"> + <typeRef name="SequenceInstr"/> + <templateRef name="FieldBase"/> + <templateRef name="TypeRef"/> + <group name="Length" presence="optional"> + <group name="Name" presence="optional"> <templateRef name="NsNameWithAuxId"/> </group> + <group name="Operator" presence="optional"> <templateRef/> </group> + <uInt32 name="InitialValue" presence="optional"/> + <templateRef name="Other"/> + </group> + <sequence name="Instructions"> <templateRef/> </sequence> + </template> + + <template name="GroupInstr" id="16024"> + <typeRef name="GroupInstr"/> + <templateRef name="FieldBase"/> + <templateRef name="TypeRef"/> + <sequence name="Instructions"> <templateRef/> </sequence> + </template> + + <template name="OpBase"> + <string name="Dictionary" presence="optional" charset="unicode"/> + <group name="Key" presence="optional"> <templateRef name="NsName"/> </group> + <templateRef name="Other"/> + </template> + + <template name="ConstantOp" id="16025"> + <typeRef name="ConstantOp"/> + <templateRef name="Other"/> + </template> + + <template name="DefaultOp" id="16026"> + <typeRef name="DefaultOp"/> + <templateRef name="Other"/> + </template> + + <template name="CopyOp" id="16027"> + <typeRef name="CopyOp"/> + <templateRef name="OpBase"/> + </template> + + <template name="IncrementOp" id="16028"> + <typeRef name="IncrementOp"/> + <templateRef name="OpBase"/> + </template> + + <template name="DeltaOp" id="16029"> + <typeRef name="DeltaOp"/> + <templateRef name="OpBase"/> + </template> + + <template name="TailOp" id="16030"> + <typeRef name="TailOp"/> + <templateRef name="OpBase"/> + </template> + + <template name="Other"> + <group name="Other" presence="optional"> + <sequence name="ForeignAttributes"> <templateRef name="Attribute"/> </sequence> + <sequence name="ForeignElements"> <templateRef name="Element"/> </sequence> + </group> + </template> + + <template name="ForeignInstr" id="16031"> + <typeRef name="ForeignInstr"/> + <templateRef name="Element"/> + </template> + + <template name="Attribute"> + <string name="Ns" charset="unicode"> <copy dictionary="template"/> </string> + <string name="Name" charset="unicode"/> + <string name="Value" charset="unicode"/> + </template> + + <template name="Element" id="16032"> + <typeRef name="Element"/> + <string name="Ns" charset="unicode"> <copy dictionary="template"/> </string> + <string name="Name" charset="unicode"/> + <sequence name="Attributes"> <templateRef name="Attribute"/> </sequence> + <sequence name="Content"> <templateRef/> </sequence> + </template> + + <template name="Text" id="16033"> + <typeRef name="Text"/> + <string name="Value" charset="unicode"/> + </template> +</templates> Modified: trunk/src/test/java/org/openfast/ByteUtilTest.java =================================================================== --- trunk/src/test/java/org/openfast/ByteUtilTest.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/test/java/org/openfast/ByteUtilTest.java 2008-10-27 23:58:28 UTC (rev 198) @@ -3,12 +3,17 @@ import org.openfast.test.OpenFastTestCase; public class ByteUtilTest extends OpenFastTestCase { - - public void testCombine() { - assertEquals("00000000 01111111", ByteUtil.combine(new byte[] { 0x00 }, new byte[] { 0x7f })); - assertEquals("00000000 01000000 01111111 00111111", ByteUtil.combine(new byte[] { 0x00, 0x40 }, new byte[] { 0x7f, 0x3f })); - assertEquals("00000000", ByteUtil.combine(new byte[] { 0x00 }, new byte[] {})); - assertEquals("01111111", ByteUtil.combine(new byte[] { }, new byte[] { 0x7f })); - } - + public void testCombine() { + assertEquals("00000000 01111111", ByteUtil.combine(new byte[] { 0x00 }, new byte[] { 0x7f })); + assertEquals("00000000 01000000 01111111 00111111", ByteUtil.combine(new byte[] { 0x00, 0x40 }, new byte[] { 0x7f, 0x3f })); + assertEquals("00000000", ByteUtil.combine(new byte[] { 0x00 }, new byte[] {})); + assertEquals("01111111", ByteUtil.combine(new byte[] {}, new byte[] { 0x7f })); + } + + public void testCombineOffset() { + assertEquals("00000000 01111111", ByteUtil.combine(new byte[] { 0x00 , 0x01}, 0, 1, new byte[] { 0x7f }, 0, 2)); +// assertEquals("00000000 01000000 01111111 00111111", ByteUtil.combine(new byte[] { 0x00, 0x40 }, new byte[] { 0x7f, 0x3f })); +// assertEquals("00000000", ByteUtil.combine(new byte[] { 0x00 }, new byte[] {})); +// assertEquals("01111111", ByteUtil.combine(new byte[] {}, new byte[] { 0x7f })); + } } Modified: trunk/src/test/java/org/openfast/ByteVectorValueTest.java =================================================================== --- trunk/src/test/java/org/openfast/ByteVectorValueTest.java 2008-10-24 17:41:54 UTC (rev 197) +++ trunk/src/test/java/org/openfast/ByteVectorValueTest.java 2008-10-27 23:58:28 UTC (rev 198) @@ -31,9 +31,4 @@ ByteVectorValue actual = new ByteVectorValue(new byte[] { (byte) 0xff }); assertEquals(expected, actual); } - - public void testConvertToString() { - assertEquals("61626364", byt("abcd".getBytes()).toString()); - assertEquals("7a4f4e65", byt("zONe".getBytes()).toString()); - } } Modified: trunk/src/test/java/org/openfast/TypeConversionTest.java =================================================================== --- trunk/src/test/java/org/openfast/TypeConversio... [truncated message content] |
From: <ope...@li...> - 2008-10-24 17:41:58
|
Revision: 197 http://openfast.svn.sourceforge.net/openfast/?rev=197&view=rev Author: jacob_northey Date: 2008-10-24 17:41:54 +0000 (Fri, 24 Oct 2008) Log Message: ----------- Modified Paths: -------------- trunk/src/main/java/org/openfast/examples/OpenFastExample.java trunk/src/main/java/org/openfast/examples/consumer/Main.java trunk/src/main/java/org/openfast/examples/performance/Main.java Modified: trunk/src/main/java/org/openfast/examples/OpenFastExample.java =================================================================== --- trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-10-24 15:57:08 UTC (rev 196) +++ trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-10-24 17:41:54 UTC (rev 197) @@ -8,19 +8,19 @@ import org.apache.commons.cli.ParseException; public class OpenFastExample { - protected static CommandLine parseCommandLine(String[] args, Options options) { + protected static CommandLine parseCommandLine(String name, String[] args, Options options) { try { BasicParser parser = new BasicParser(); return parser.parse(options, args); } catch (ParseException e) { - displayHelp(options); + displayHelp(name, options); return null; } } - protected static void displayHelp(Options options) { + protected static void displayHelp(String name, Options options) { HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp("perf", options); + formatter.printHelp(name, options); System.exit(1); } Modified: trunk/src/main/java/org/openfast/examples/consumer/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-10-24 15:57:08 UTC (rev 196) +++ trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-10-24 17:41:54 UTC (rev 197) @@ -33,9 +33,9 @@ * @param args */ public static void main(String[] args) { - CommandLine cl = parseCommandLine(args, options); + CommandLine cl = parseCommandLine("consumer", args, options); if (cl.hasOption("help")) { - displayHelp(options); + displayHelp("consumer", options); } Endpoint endpoint = null; boolean showStacktrace = cl.hasOption(ERROR); @@ -59,7 +59,7 @@ Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); } catch (AssertionError e) { System.out.println(e.getMessage()); - displayHelp(options); + displayHelp("consumer", options); } FastMessageConsumer consumer = new FastMessageConsumer(endpoint, templatesFile); try { Modified: trunk/src/main/java/org/openfast/examples/performance/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-24 15:57:08 UTC (rev 196) +++ trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-24 17:41:54 UTC (rev 197) @@ -25,9 +25,9 @@ * @param args */ public static void main(String[] args) { - CommandLine cl = parseCommandLine(args, options); + CommandLine cl = parseCommandLine("perf", args, options); if (cl.hasOption("help")) { - displayHelp(options); + displayHelp("perf", options); } try { File templatesFile = new File(getString(cl, "template")); @@ -52,7 +52,7 @@ } } catch (AssertionError ae) { System.out.println(ae.getMessage()); - displayHelp(options); + displayHelp("perf", options); } catch (Exception e) { if (cl.hasOption("error")) e.printStackTrace(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-24 15:57:13
|
Revision: 196 http://openfast.svn.sourceforge.net/openfast/?rev=196&view=rev Author: jacob_northey Date: 2008-10-24 15:57:08 +0000 (Fri, 24 Oct 2008) Log Message: ----------- [FAST-7] GroupValue.isDefined is a little friendlier now Modified Paths: -------------- trunk/src/main/java/org/openfast/GroupValue.java trunk/src/test/java/org/openfast/GroupValueTest.java Modified: trunk/src/main/java/org/openfast/GroupValue.java =================================================================== --- trunk/src/main/java/org/openfast/GroupValue.java 2008-10-24 15:40:16 UTC (rev 195) +++ trunk/src/main/java/org/openfast/GroupValue.java 2008-10-24 15:57:08 UTC (rev 196) @@ -177,9 +177,8 @@ public FieldValue getValue(String fieldName) { if (!group.hasField(fieldName)) { - throw new IllegalArgumentException("The field \"" + fieldName + "\" does not exist in group " + group); + return null; } - return values[group.getFieldIndex(fieldName)]; } @@ -322,7 +321,7 @@ } public boolean isDefined(int fieldIndex) { - return fieldIndex < values.length && values[fieldIndex] != null; + return fieldIndex < values.length && fieldIndex >= 0 && values[fieldIndex] != null; } public boolean isDefined(String fieldName) { Modified: trunk/src/test/java/org/openfast/GroupValueTest.java =================================================================== --- trunk/src/test/java/org/openfast/GroupValueTest.java 2008-10-24 15:40:16 UTC (rev 195) +++ trunk/src/test/java/org/openfast/GroupValueTest.java 2008-10-24 15:57:08 UTC (rev 196) @@ -1,14 +1,17 @@ package org.openfast; import junit.framework.TestCase; - import org.openfast.test.ObjectMother; public class GroupValueTest extends TestCase { - - public void testEquals() { - GroupValue v = ObjectMother.newAllocation(null, 10.0, 11.0); - GroupValue v2 = ObjectMother.newAllocation(null, 10.0, 11.0); - assertEquals(v, v2); - } + public void testEquals() { + GroupValue v = ObjectMother.newAllocation(null, 10.0, 11.0); + GroupValue v2 = ObjectMother.newAllocation(null, 10.0, 11.0); + assertEquals(v, v2); + } + + public void testIsDefinedOnInvalidField() { + GroupValue v = ObjectMother.newAllocation(null, 20.1, 20.2); + assertFalse(v.isDefined("undefinedField")); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-24 15:40:36
|
Revision: 195 http://openfast.svn.sourceforge.net/openfast/?rev=195&view=rev Author: jacob_northey Date: 2008-10-24 15:40:16 +0000 (Fri, 24 Oct 2008) Log Message: ----------- [FAST-4] Added original message to session error handler [FAST-8] Fixed StaticTemplateReference template dictionary scope bug by adding a reference to the template definition to all fields Modified Paths: -------------- trunk/src/main/java/org/openfast/session/Session.java trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java trunk/src/main/java/org/openfast/template/Field.java trunk/src/main/java/org/openfast/template/Group.java trunk/src/main/java/org/openfast/template/MessageTemplate.java trunk/src/test/java/org/openfast/TemplateTest.java trunk/src/test/java/org/openfast/session/template/exchange/ScalarConverterTest.java Added Paths: ----------- trunk/src/test/java/org/openfast/submitted/TemplateDictionaryScopeTest.java Modified: trunk/src/main/java/org/openfast/session/Session.java =================================================================== --- trunk/src/main/java/org/openfast/session/Session.java 2008-10-23 18:04:11 UTC (rev 194) +++ trunk/src/main/java/org/openfast/session/Session.java 2008-10-24 15:40:16 UTC (rev 195) @@ -94,7 +94,7 @@ public void error(ErrorCode code, String message) { if (code.equals(FastConstants.D9_TEMPLATE_NOT_REGISTERED)) { code = SessionConstants.TEMPLATE_NOT_SUPPORTED; - message = "Template Not Supported"; + message = "Template Not Supported: " + message; } protocol.onError(this, code, message); errorHandler.error(code, message); Modified: trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java =================================================================== --- trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-23 18:04:11 UTC (rev 194) +++ trunk/src/main/java/org/openfast/session/SessionControlProtocol_1_1.java 2008-10-24 15:40:16 UTC (rev 195) @@ -24,6 +24,7 @@ import java.util.Map; import org.openfast.Context; +import org.openfast.Dictionary; import org.openfast.FieldValue; import org.openfast.Message; import org.openfast.MessageHandler; @@ -250,10 +251,11 @@ new Sequence(qualify("ForeignAttributes"), new Field[] { new StaticTemplateReference(ATTRIBUTE) }, true), new Sequence(qualify("ForeignElements"), new Field[] { new StaticTemplateReference(ELEMENT) }, true) }, true) }); private static final MessageTemplate TEMPLATE_NAME = new MessageTemplate(new QName("TemplateName", NAMESPACE), new Field[] { + dict("Ns", Type.UNICODE, false, Dictionary.TEMPLATE), + new Scalar(qualify("Name"), Type.UNICODE, Operator.NONE, null, false) }); + private static final MessageTemplate NS_NAME = new MessageTemplate(new QName("NsName", NAMESPACE), new Field[] { new Scalar(qualify("Ns"), Type.UNICODE, Operator.COPY, null, false), new Scalar(qualify("Name"), Type.UNICODE, Operator.NONE, null, false) }); - private static final MessageTemplate NS_NAME = new MessageTemplate(new QName("NsName", NAMESPACE), new Field[] { - dict("Ns", Type.UNICODE, false, "template"), new Scalar(qualify("Name"), Type.UNICODE, Operator.NONE, null, false) }); private static final MessageTemplate NS_NAME_WITH_AUX_ID = new MessageTemplate( new QName("NsNameWithAuxId", NAMESPACE), new Field[] { new StaticTemplateReference(NS_NAME), new Scalar(qualify("AuxId"), Type.UNICODE, Operator.NONE, null, true) }); @@ -345,7 +347,7 @@ return new Scalar(qualify(name), Type.U32, Operator.NONE, null, false); } private static Field dict(String name, Type type, boolean optional, String dictionary) { - Scalar scalar = new Scalar(qualify(name), Type.UNICODE, Operator.COPY, null, optional); + Scalar scalar = new Scalar(qualify(name), type, Operator.COPY, null, optional); scalar.setDictionary(dictionary); return scalar; } Modified: trunk/src/main/java/org/openfast/template/Field.java =================================================================== --- trunk/src/main/java/org/openfast/template/Field.java 2008-10-23 18:04:11 UTC (rev 194) +++ trunk/src/main/java/org/openfast/template/Field.java 2008-10-24 15:40:16 UTC (rev 195) @@ -37,6 +37,7 @@ protected final boolean optional; protected String id; private Map attributes; + private MessageTemplate template; /** * Field Constructor @@ -227,4 +228,12 @@ * getTypeName method declaration */ public abstract String getTypeName(); + + public MessageTemplate getTemplate() { + return template; + } + + public void setMessageTemplate(MessageTemplate template) { + this.template = template; + } } Modified: trunk/src/main/java/org/openfast/template/Group.java =================================================================== --- trunk/src/main/java/org/openfast/template/Group.java 2008-10-23 18:04:11 UTC (rev 194) +++ trunk/src/main/java/org/openfast/template/Group.java 2008-10-24 15:40:16 UTC (rev 195) @@ -171,7 +171,10 @@ Field field = getField(fieldIndex); if (!field.isOptional() && fieldValue == null) Global.handleError(FastConstants.GENERAL_ERROR, "Mandatory field " + field + " is null"); - byte[] encoding = field.encode(fieldValue, template, context, presenceMapBuilder); + Group fieldTmpl = template; + if (field.getTemplate() != null) + fieldTmpl = field.getTemplate(); + byte[] encoding = field.encode(fieldValue, fieldTmpl, context, presenceMapBuilder); fieldEncodings[fieldIndex] = encoding; } ByteArrayOutputStream buffer = new ByteArrayOutputStream(); @@ -282,7 +285,10 @@ int start = this instanceof MessageTemplate ? 1 : 0; for (int fieldIndex = start; fieldIndex < fields.length; fieldIndex++) { Field field = getField(fieldIndex); - values[fieldIndex] = field.decode(in, template, context, pmapReader); + Group fieldTmpl = template; + if (field.getTemplate() != null) + fieldTmpl = field.getTemplate(); + values[fieldIndex] = field.decode(in, fieldTmpl, context, pmapReader); } if (pmapReader.hasMoreBitsSet()) Global.handleError(FastConstants.R8_PMAP_TOO_MANY_BITS, "The presence map " + pmapReader Modified: trunk/src/main/java/org/openfast/template/MessageTemplate.java =================================================================== --- trunk/src/main/java/org/openfast/template/MessageTemplate.java 2008-10-23 18:04:11 UTC (rev 194) +++ trunk/src/main/java/org/openfast/template/MessageTemplate.java 2008-10-24 15:40:16 UTC (rev 195) @@ -38,8 +38,16 @@ public MessageTemplate(QName name, Field[] fields) { super(name, addTemplateIdField(fields), false); + updateTemplateReference(fields); + this.fields[0].setMessageTemplate(this); } + private void updateTemplateReference(Field[] fields) { + for (int i=0; i<fields.length; i++) { + fields[i].setMessageTemplate(this); + } + } + public boolean usesPresenceMap() { return true; } Modified: trunk/src/test/java/org/openfast/TemplateTest.java =================================================================== --- trunk/src/test/java/org/openfast/TemplateTest.java 2008-10-23 18:04:11 UTC (rev 194) +++ trunk/src/test/java/org/openfast/TemplateTest.java 2008-10-24 15:40:16 UTC (rev 195) @@ -1,39 +1,33 @@ package org.openfast; - import org.openfast.template.MessageTemplate; import org.openfast.template.loader.MessageTemplateLoader; import org.openfast.template.loader.XMLMessageTemplateLoader; import org.openfast.test.OpenFastTestCase; public class TemplateTest extends OpenFastTestCase { - private static final String SCP_1_1_NS = "http://www.fixprotocol.org/ns/fast/scp/1.1"; - private static final String PRE_TRADE_NS = "http://www.openfast.org/fix44/preTrade"; - private static final String SESSION_NS = "http://www.openfast.org/fix44/session"; - private static final String COMPONENTS_NS = "http://www.openfast.org/fix44/components"; - private static final String FIX_44_NS = "http://www.openfast.org/fix44"; - private static final String EXT_NS = "http://www.openfast.org/ext"; - private MessageTemplateLoader loader; + private static final String SCP_1_1_NS = "http://www.fixprotocol.org/ns/fast/scp/1.1"; + private static final String PRE_TRADE_NS = "http://www.openfast.org/fix44/preTrade"; + private static final String SESSION_NS = "http://www.openfast.org/fix44/session"; + private static final String FIX_44_NS = "http://www.openfast.org/fix44"; + private static final String EXT_NS = "http://www.openfast.org/ext"; + private MessageTemplateLoader loader; - protected void setUp() throws Exception { - loader = new XMLMessageTemplateLoader(true); - loader.load(resource("components.xml")); - loader.load(resource("preTrade.xml")); - loader.load(resource("session.xml")); - } + protected void setUp() throws Exception { + loader = new XMLMessageTemplateLoader(true); + loader.load(resource("components.xml")); + loader.load(resource("preTrade.xml")); + loader.load(resource("session.xml")); + } - public void testTemplates() { - MessageTemplate quote = loader.getTemplateRegistry().get(new QName("Quote", PRE_TRADE_NS)); - - assertEquals(FIX_44_NS, quote.getField("QuoteID").getQName().getNamespace()); - assertNotNull(quote.getField(new QName("Group", EXT_NS))); - - assertEquals(1, quote.getStaticTemplateReferences().length); - assertNotNull(quote.getStaticTemplateReference(new QName("Instrument", COMPONENTS_NS))); - } - - public void testTemplateExtension() { - MessageTemplate logon = loader.getTemplateRegistry().get(new QName("Logon", SESSION_NS)); - assertTrue(logon.hasAttribute(new QName("reset", SCP_1_1_NS))); - } + public void testTemplates() { + MessageTemplate quote = loader.getTemplateRegistry().get(new QName("Quote", PRE_TRADE_NS)); + assertEquals(FIX_44_NS, quote.getField("QuoteID").getQName().getNamespace()); + assertNotNull(quote.getField(new QName("Group", EXT_NS))); + } + + public void testTemplateExtension() { + MessageTemplate logon = loader.getTemplateRegistry().get(new QName("Logon", SESSION_NS)); + assertTrue(logon.hasAttribute(new QName("reset", SCP_1_1_NS))); + } } Modified: trunk/src/test/java/org/openfast/session/template/exchange/ScalarConverterTest.java =================================================================== --- trunk/src/test/java/org/openfast/session/template/exchange/ScalarConverterTest.java 2008-10-23 18:04:11 UTC (rev 194) +++ trunk/src/test/java/org/openfast/session/template/exchange/ScalarConverterTest.java 2008-10-24 15:40:16 UTC (rev 195) @@ -8,32 +8,28 @@ import org.openfast.template.TemplateRegistry; import org.openfast.template.operator.Operator; import org.openfast.template.type.Type; - import junit.framework.TestCase; public class ScalarConverterTest extends TestCase { + private ScalarConverter converter; + private ConversionContext context; - private ScalarConverter converter; - private ConversionContext context; + protected void setUp() throws Exception { + converter = new ScalarConverter(); + context = SessionControlProtocol_1_1.createInitialContext(); + } - protected void setUp() throws Exception { - converter = new ScalarConverter(); - context = SessionControlProtocol_1_1.createInitialContext(); - } - - public void testConvertDefaultWithDefaultValue() { - Field scalar = new Scalar("default10", Type.U32, Operator.DEFAULT, new IntegerValue(10), false); - GroupValue fieldDef = converter.convert(scalar, context); - Field decodedScalar = converter.convert(fieldDef, TemplateRegistry.NULL, context); - - assertEquals(scalar, decodedScalar); - } - - public void testConvertDeltaWithDefaultValue() { - Field scalar = new Scalar("value", Type.U32, Operator.DELTA, new IntegerValue(1), false); - GroupValue fieldDef = converter.convert(scalar, context); - Field decodedScalar = converter.convert(fieldDef, TemplateRegistry.NULL, context); - assertEquals(scalar, decodedScalar); - } + public void testConvertDefaultWithDefaultValue() { + Field scalar = new Scalar("default10", Type.U32, Operator.DEFAULT, new IntegerValue(10), false); + GroupValue fieldDef = converter.convert(scalar, context); + Field decodedScalar = converter.convert(fieldDef, TemplateRegistry.NULL, context); + assertEquals(scalar, decodedScalar); + } + public void testConvertDeltaWithDefaultValue() { + Field scalar = new Scalar("value", Type.U32, Operator.DELTA, new IntegerValue(1), false); + GroupValue fieldDef = converter.convert(scalar, context); + Field decodedScalar = converter.convert(fieldDef, TemplateRegistry.NULL, context); + assertEquals(scalar, decodedScalar); + } } Added: trunk/src/test/java/org/openfast/submitted/TemplateDictionaryScopeTest.java =================================================================== --- trunk/src/test/java/org/openfast/submitted/TemplateDictionaryScopeTest.java (rev 0) +++ trunk/src/test/java/org/openfast/submitted/TemplateDictionaryScopeTest.java 2008-10-24 15:40:16 UTC (rev 195) @@ -0,0 +1,77 @@ +package org.openfast.submitted; + +import java.io.InputStream; +import org.openfast.Context; +import org.openfast.Dictionary; +import org.openfast.Message; +import org.openfast.ScalarValue; +import org.openfast.codec.FastDecoder; +import org.openfast.codec.FastEncoder; +import org.openfast.template.Field; +import org.openfast.template.MessageTemplate; +import org.openfast.template.Scalar; +import org.openfast.template.StaticTemplateReference; +import org.openfast.template.operator.Operator; +import org.openfast.template.type.Type; +import org.openfast.test.OpenFastTestCase; + +public class TemplateDictionaryScopeTest extends OpenFastTestCase { + private MessageTemplate nameTemplate; + private MessageTemplate startTemplate; + private MessageTemplate definitionTemplate; + private Context context; + + protected void setUp() throws Exception { + Scalar ns = new Scalar("Ns", Type.STRING, Operator.COPY, ScalarValue.UNDEFINED, false); + ns.setDictionary(Dictionary.TEMPLATE); + Scalar name = new Scalar("Name", Type.STRING, Operator.COPY, ScalarValue.UNDEFINED, false); + name.setDictionary(Dictionary.TEMPLATE); + nameTemplate = new MessageTemplate("Name", new Field[] { + ns, + name + }); + startTemplate = new MessageTemplate("Start", new Field[]{ + new StaticTemplateReference(nameTemplate) + }); + definitionTemplate = new MessageTemplate("Definition", new Field[]{ + new StaticTemplateReference(nameTemplate) + }); + + context = new Context(); + context.getTemplateRegistry().register(1, nameTemplate); + context.getTemplateRegistry().register(2, startTemplate); + context.getTemplateRegistry().register(3, definitionTemplate); + } + + public void testEncodeNestedStaticTemplateReference() { + FastEncoder encoder = new FastEncoder(context); + Message startMsg = new Message(startTemplate); + startMsg.setString("Ns", "myNS"); + startMsg.setString("Name", "A"); + + assertEquals("11110000 10000010 01101101 01111001 01001110 11010011 11000001", encoder.encode(startMsg)); + + Message defMsg = new Message(definitionTemplate); + defMsg.setString("Ns", "myNS"); + defMsg.setString("Name", "B"); + + assertEquals("11010000 10000011 11000010", encoder.encode(defMsg)); + } + + public void testDecodeNestedStaticTemplateReference() { + InputStream byteIn = bitStream("11110000 10000010 01101101 01111001 01001110 11010011 11000001 11010000 10000011 11000010"); + FastDecoder decoder = new FastDecoder(context, byteIn); + + Message startMsg = new Message(startTemplate); + startMsg.setString("Ns", "myNS"); + startMsg.setString("Name", "A"); + + assertEquals(startMsg, decoder.readMessage()); + + Message defMsg = new Message(definitionTemplate); + defMsg.setString("Ns", "myNS"); + defMsg.setString("Name", "B"); + + assertEquals(defMsg, decoder.readMessage()); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-23 18:04:21
|
Revision: 194 http://openfast.svn.sourceforge.net/openfast/?rev=194&view=rev Author: jacob_northey Date: 2008-10-23 18:04:11 +0000 (Thu, 23 Oct 2008) Log Message: ----------- Moved extension proposals to extensions package Modified Paths: -------------- trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java trunk/src/main/java/org/openfast/template/loader/ParsingContext.java trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java trunk/src/main/java/org/openfast/template/operator/Operator.java Added Paths: ----------- trunk/src/main/java/org/openfast/extensions/ trunk/src/main/java/org/openfast/extensions/MapFieldParser.java trunk/src/main/java/org/openfast/extensions/MapScalar.java trunk/src/test/java/org/openfast/extensions/ Removed Paths: ------------- trunk/src/main/java/org/openfast/template/MapScalar.java trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java Modified: trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java 2008-10-23 16:47:27 UTC (rev 193) +++ trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java 2008-10-23 18:04:11 UTC (rev 194) @@ -9,6 +9,7 @@ import org.openfast.Message; import org.openfast.SequenceValue; import org.openfast.codec.FastDecoder; +import org.openfast.extensions.MapFieldParser; import org.openfast.template.MessageTemplate; import org.openfast.template.Sequence; import org.openfast.template.TemplateRegistry; @@ -29,6 +30,7 @@ public FastToXmlConverter() { XMLMessageTemplateLoader xmlTemplateLoader = new XMLMessageTemplateLoader(); xmlTemplateLoader.setLoadTemplateIdFromAuxId(true); + xmlTemplateLoader.addFieldParser(new MapFieldParser()); xmlTemplateLoader.load(this.getClass().getResourceAsStream("xmlOverFastTemplates.xml")); this.templateRegistry = xmlTemplateLoader.getTemplateRegistry(); this.elementTemplate = templateRegistry.get("element"); Modified: trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java 2008-10-23 16:47:27 UTC (rev 193) +++ trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java 2008-10-23 18:04:11 UTC (rev 194) @@ -8,6 +8,7 @@ import org.openfast.Message; import org.openfast.MessageOutputStream; import org.openfast.SequenceValue; +import org.openfast.extensions.MapFieldParser; import org.openfast.template.MessageTemplate; import org.openfast.template.Sequence; import org.openfast.template.TemplateRegistry; @@ -30,6 +31,7 @@ public XmlToFastConverter() { XMLMessageTemplateLoader xmlTemplateLoader = new XMLMessageTemplateLoader(); xmlTemplateLoader.setLoadTemplateIdFromAuxId(true); + xmlTemplateLoader.addFieldParser(new MapFieldParser()); xmlTemplateLoader.load(this.getClass().getResourceAsStream("xmlOverFastTemplates.xml")); this.templateRegistry = xmlTemplateLoader.getTemplateRegistry(); this.elementTemplate = templateRegistry.get("element"); Copied: trunk/src/main/java/org/openfast/extensions/MapFieldParser.java (from rev 187, trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java) =================================================================== --- trunk/src/main/java/org/openfast/extensions/MapFieldParser.java (rev 0) +++ trunk/src/main/java/org/openfast/extensions/MapFieldParser.java 2008-10-23 18:04:11 UTC (rev 194) @@ -0,0 +1,28 @@ +package org.openfast.extensions; + +import org.openfast.QName; +import org.openfast.template.Field; +import org.openfast.template.loader.FieldParser; +import org.openfast.template.loader.ParsingContext; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +public class MapFieldParser implements FieldParser { + public boolean canParse(Element element, ParsingContext context) { + NodeList children = element.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + String nodeName = children.item(i).getNodeName(); + if (nodeName.equals("map")) + return true; + } + return false; + } + + public Field parse(Element fieldNode, ParsingContext context) { + String key = fieldNode.hasAttribute("key") ? fieldNode.getAttribute("key") : null; + boolean optional = "optional".equals(fieldNode.getAttribute("presence")); + String name = fieldNode.getAttribute("name"); + QName qname = new QName(name, context.getNamespace()); + return new MapScalar(qname, optional, new QName(key)); + } +} Property changes on: trunk/src/main/java/org/openfast/extensions/MapFieldParser.java ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/src/main/java/org/openfast/extensions/MapScalar.java (from rev 187, trunk/src/main/java/org/openfast/template/MapScalar.java) =================================================================== --- trunk/src/main/java/org/openfast/extensions/MapScalar.java (rev 0) +++ trunk/src/main/java/org/openfast/extensions/MapScalar.java 2008-10-23 18:04:11 UTC (rev 194) @@ -0,0 +1,70 @@ +package org.openfast.extensions; + +import java.io.InputStream; +import org.openfast.BitVectorBuilder; +import org.openfast.BitVectorReader; +import org.openfast.ByteUtil; +import org.openfast.Context; +import org.openfast.FieldValue; +import org.openfast.IntegerValue; +import org.openfast.QName; +import org.openfast.ScalarValue; +import org.openfast.template.Field; +import org.openfast.template.Group; +import org.openfast.template.type.codec.TypeCodec; + +public class MapScalar extends Field { + private static final long serialVersionUID = 1L; + + public MapScalar(QName name, boolean optional, QName key) { + super(name, key, optional); + } + + public FieldValue createValue(String value) { + return null; + } + + public FieldValue decode(InputStream in, Group template, Context context, BitVectorReader presenceMapReader) { + boolean newDefinition = presenceMapReader.read(); + int index = TypeCodec.UINT.decode(in).toInt(); + if (index == 0) { + return ScalarValue.NULL; + } + if (!newDefinition) + return context.getCache(getKey()).lookup(index); + ScalarValue value = TypeCodec.ASCII.decode(in); + context.store(getKey(), index, value); + return value; + } + + public byte[] encode(FieldValue value, Group template, Context context, BitVectorBuilder presenceMapBuilder) { + if (context.getCache(getKey()).containsValue(value)) { + int index = context.getCache(getKey()).getIndex(value); + byte[] encoded = TypeCodec.UINT.encode(new IntegerValue(index)); + presenceMapBuilder.skip(); + return encoded; + } else { + int nextIndex = context.getCache(getKey()).store(value); + byte[] indexBytes = TypeCodec.UINT.encode(new IntegerValue(nextIndex)); + byte[] valueBytes = TypeCodec.ASCII.encode((ScalarValue) value); + presenceMapBuilder.set(); + return ByteUtil.combine(indexBytes, valueBytes); + } + } + + public String getTypeName() { + return null; + } + + public Class getValueType() { + return null; + } + + public boolean isPresenceMapBitSet(byte[] encoding, FieldValue fieldValue) { + return false; + } + + public boolean usesPresenceMapBit() { + return true; + } +} Property changes on: trunk/src/main/java/org/openfast/extensions/MapScalar.java ___________________________________________________________________ Added: svn:mergeinfo + Deleted: trunk/src/main/java/org/openfast/template/MapScalar.java =================================================================== --- trunk/src/main/java/org/openfast/template/MapScalar.java 2008-10-23 16:47:27 UTC (rev 193) +++ trunk/src/main/java/org/openfast/template/MapScalar.java 2008-10-23 18:04:11 UTC (rev 194) @@ -1,68 +0,0 @@ -package org.openfast.template; - -import java.io.InputStream; -import org.openfast.BitVectorBuilder; -import org.openfast.BitVectorReader; -import org.openfast.ByteUtil; -import org.openfast.Context; -import org.openfast.FieldValue; -import org.openfast.IntegerValue; -import org.openfast.QName; -import org.openfast.ScalarValue; -import org.openfast.template.type.codec.TypeCodec; - -public class MapScalar extends Field { - private static final long serialVersionUID = 1L; - - public MapScalar(QName name, boolean optional, QName key) { - super(name, key, optional); - } - - public FieldValue createValue(String value) { - return null; - } - - public FieldValue decode(InputStream in, Group template, Context context, BitVectorReader presenceMapReader) { - boolean newDefinition = presenceMapReader.read(); - int index = TypeCodec.UINT.decode(in).toInt(); - if (index == 0) { - return ScalarValue.NULL; - } - if (!newDefinition) - return context.getCache(getKey()).lookup(index); - ScalarValue value = TypeCodec.ASCII.decode(in); - context.store(getKey(), index, value); - return value; - } - - public byte[] encode(FieldValue value, Group template, Context context, BitVectorBuilder presenceMapBuilder) { - if (context.getCache(getKey()).containsValue(value)) { - int index = context.getCache(getKey()).getIndex(value); - byte[] encoded = TypeCodec.UINT.encode(new IntegerValue(index)); - presenceMapBuilder.skip(); - return encoded; - } else { - int nextIndex = context.getCache(getKey()).store(value); - byte[] indexBytes = TypeCodec.UINT.encode(new IntegerValue(nextIndex)); - byte[] valueBytes = TypeCodec.ASCII.encode((ScalarValue) value); - presenceMapBuilder.set(); - return ByteUtil.combine(indexBytes, valueBytes); - } - } - - public String getTypeName() { - return null; - } - - public Class getValueType() { - return null; - } - - public boolean isPresenceMapBitSet(byte[] encoding, FieldValue fieldValue) { - return false; - } - - public boolean usesPresenceMapBit() { - return true; - } -} Deleted: trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java 2008-10-23 16:47:27 UTC (rev 193) +++ trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java 2008-10-23 18:04:11 UTC (rev 194) @@ -1,27 +0,0 @@ -package org.openfast.template.loader; - -import org.openfast.QName; -import org.openfast.template.Field; -import org.openfast.template.MapScalar; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - -public class MapFieldParser implements FieldParser { - public boolean canParse(Element element, ParsingContext context) { - NodeList children = element.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - String nodeName = children.item(i).getNodeName(); - if (nodeName.equals("map")) - return true; - } - return false; - } - - public Field parse(Element fieldNode, ParsingContext context) { - String key = fieldNode.hasAttribute("key") ? fieldNode.getAttribute("key") : null; - boolean optional = "optional".equals(fieldNode.getAttribute("presence")); - String name = fieldNode.getAttribute("name"); - QName qname = new QName(name, context.getNamespace()); - return new MapScalar(qname, optional, new QName(key)); - } -} Modified: trunk/src/main/java/org/openfast/template/loader/ParsingContext.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/ParsingContext.java 2008-10-23 16:47:27 UTC (rev 193) +++ trunk/src/main/java/org/openfast/template/loader/ParsingContext.java 2008-10-23 18:04:11 UTC (rev 194) @@ -27,7 +27,7 @@ import org.openfast.template.TemplateRegistry; import org.w3c.dom.Element; -class ParsingContext { +public class ParsingContext { static final ParsingContext NULL = new ParsingContext(); static { NULL.setDictionary("global"); Modified: trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-10-23 16:47:27 UTC (rev 193) +++ trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-10-23 18:04:11 UTC (rev 194) @@ -83,7 +83,6 @@ initialContext.addFieldParser(new StringParser()); initialContext.addFieldParser(new ByteVectorParser()); initialContext.addFieldParser(new TemplateRefParser()); - initialContext.addFieldParser(new MapFieldParser()); return initialContext; } Modified: trunk/src/main/java/org/openfast/template/operator/Operator.java =================================================================== --- trunk/src/main/java/org/openfast/template/operator/Operator.java 2008-10-23 16:47:27 UTC (rev 193) +++ trunk/src/main/java/org/openfast/template/operator/Operator.java 2008-10-23 18:04:11 UTC (rev 194) @@ -49,18 +49,6 @@ } }; - public static final Operator MAP = new Operator("map") { - private static final long serialVersionUID = 2L; - - public boolean usesDictionary() { - return false; - } - - public boolean shouldStoreValue(ScalarValue value) { - return false; - } - }; - public static final Operator CONSTANT = new Operator("constant") { private static final long serialVersionUID = 1L; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-23 16:47:46
|
Revision: 193 http://openfast.svn.sourceforge.net/openfast/?rev=193&view=rev Author: jacob_northey Date: 2008-10-23 16:47:27 +0000 (Thu, 23 Oct 2008) Log Message: ----------- Re-instated 1.4 compatibility by removing reference to 1.5 interface Iterable Modified Paths: -------------- trunk/src/main/java/org/openfast/template/TemplateRegistry.java Modified: trunk/src/main/java/org/openfast/template/TemplateRegistry.java =================================================================== --- trunk/src/main/java/org/openfast/template/TemplateRegistry.java 2008-10-23 16:30:19 UTC (rev 192) +++ trunk/src/main/java/org/openfast/template/TemplateRegistry.java 2008-10-23 16:47:27 UTC (rev 193) @@ -24,7 +24,7 @@ import org.openfast.QName; -public interface TemplateRegistry extends Iterable { +public interface TemplateRegistry { TemplateRegistry NULL = new NullTemplateRegistry(); void registerAll(TemplateRegistry registry); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-23 16:30:26
|
Revision: 192 http://openfast.svn.sourceforge.net/openfast/?rev=192&view=rev Author: jacob_northey Date: 2008-10-23 16:30:19 +0000 (Thu, 23 Oct 2008) Log Message: ----------- -Improved decoding performance by 15-20% -Added repeat and continuous options to PerformanceRunner NOTE: When running the performance runner, the first run takes twice as long for small data sets due to most of the time spent on class loading. Use the repeat option and 3rd run as the benchmark. Modified Paths: -------------- trunk/pom.xml trunk/src/main/java/org/openfast/Global.java trunk/src/main/java/org/openfast/codec/FastDecoder.java trunk/src/main/java/org/openfast/examples/performance/Main.java trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java trunk/src/main/java/org/openfast/template/BasicTemplateRegistry.java trunk/src/main/java/org/openfast/template/ComposedScalar.java trunk/src/main/java/org/openfast/template/Sequence.java trunk/src/main/java/org/openfast/template/type/DecimalConverter.java trunk/src/main/java/org/openfast/template/type/codec/AsciiString.java trunk/src/main/java/org/openfast/template/type/codec/BitVectorType.java trunk/src/main/java/org/openfast/template/type/codec/NullableAsciiString.java trunk/src/main/java/org/openfast/template/type/codec/NullableSingleFieldDecimal.java trunk/src/main/java/org/openfast/template/type/codec/SingleFieldDecimal.java Added Paths: ----------- trunk/src/main/java/org/openfast/util/IntegerMap.java trunk/src/main/java/org/openfast/util/SimpleIntegerMap.java trunk/src/test/java/org/openfast/util/SimpleIntegerMapTest.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/pom.xml 2008-10-23 16:30:19 UTC (rev 192) @@ -122,6 +122,10 @@ <resources> <resource> <directory>src/main/resources</directory> + <excludes> + <exclude>**/*.bat</exclude> + <exclude>**/*.sh</exclude> + </excludes> </resource> <resource> <directory>src/main/java</directory> Modified: trunk/src/main/java/org/openfast/Global.java =================================================================== --- trunk/src/main/java/org/openfast/Global.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/Global.java 2008-10-23 16:30:19 UTC (rev 192) @@ -20,12 +20,16 @@ */ package org.openfast; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; import org.openfast.error.ErrorCode; import org.openfast.error.ErrorHandler; public final class Global { private static ErrorHandler errorHandler = ErrorHandler.DEFAULT; private static int currentImplicitId = (int) (System.currentTimeMillis() % 10000); + private static List buffers = new ArrayList(); public static void setErrorHandler(ErrorHandler handler) { if (handler == null) { @@ -47,4 +51,24 @@ } private Global() {} + + public static ByteArrayOutputStream getBuffer() { + synchronized(buffers) { + if (buffers.isEmpty()) + return new PooledByteArrayOutputStream(); + ByteArrayOutputStream buffer = (ByteArrayOutputStream) buffers.remove(0); + buffer.reset(); + return buffer; + } + } + + private static class PooledByteArrayOutputStream extends ByteArrayOutputStream { + public synchronized byte[] toByteArray() { + byte[] byteArray = super.toByteArray(); + synchronized(buffers) { + buffers.add(this); + } + return byteArray; + } + } } Modified: trunk/src/main/java/org/openfast/codec/FastDecoder.java =================================================================== --- trunk/src/main/java/org/openfast/codec/FastDecoder.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/codec/FastDecoder.java 2008-10-23 16:30:19 UTC (rev 192) @@ -53,7 +53,7 @@ BitVectorReader presenceMapReader = new BitVectorReader(pmap); // if template id is not present, use previous, else decode template id - int templateId = (presenceMapReader.read()) ? ((IntegerValue) TypeCodec.UINT.decode(in)).value : context.getLastTemplateId(); + int templateId = (presenceMapReader.read()) ? TypeCodec.UINT.decode(in).toInt() : context.getLastTemplateId(); MessageTemplate template = context.getTemplate(templateId); if (template == null) { Modified: trunk/src/main/java/org/openfast/examples/performance/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-23 16:30:19 UTC (rev 192) @@ -17,7 +17,8 @@ options.addOption("p", "preload", false, "Preload data into memory instead of decoding directly from file"); options.addOption("e", "error", false, "Show stacktrace information"); options.addOption("r", "repeat", true, "Re process data file X number of times"); - options.addOption("f", "format", true, "Data format [hex|binary] default is binary "); + options.addOption("f", "format", true, "Data format [hex|binary] default is binary"); + options.addOption("c", "continuous", false, "Keep repeating the test until the process is killed"); } /** @@ -40,10 +41,15 @@ performanceRunner.setPreloadData(true); if (cl.hasOption("format")) performanceRunner.setFormat(cl.getOptionValue("format")); - PerformanceResult result = performanceRunner.run(); - - System.out.println("Decoded " + result.getMessageCount() + " messages in " + result.getTime() + " milliseconds."); - System.out.println("Average decode time per message: " + ((result.getTime() * 1000) / (result.getMessageCount())) + " microseconds"); + + if (cl.hasOption("continuous")) + runContinuous(performanceRunner); + else if (cl.hasOption("repeat")) + runRepeat(performanceRunner, Integer.parseInt(cl.getOptionValue("repeat"))); + else { + run(performanceRunner); + run(performanceRunner); + } } catch (AssertionError ae) { System.out.println(ae.getMessage()); displayHelp(options); @@ -54,6 +60,24 @@ } } + private static void runRepeat(PerformanceRunner performanceRunner, int repeat) { + for (int i=0; i<repeat; i++) + run(performanceRunner); + } + + private static void runContinuous(PerformanceRunner performanceRunner) { + while (true) { + run (performanceRunner); + } + } + + private static void run(PerformanceRunner performanceRunner) { + PerformanceResult result = performanceRunner.run(); + + System.out.println("Decoded " + result.getMessageCount() + " messages in " + result.getTime() + " milliseconds."); + System.out.println("Average decode time per message: " + ((result.getTime() * 1000) / (result.getMessageCount())) + " microseconds"); + } + private static String getString(CommandLine cl, String option) { Assert.assertTrue(cl.hasOption(option), "The required parameter \"" + option + "\" was not specified."); return cl.getOptionValue(option); Modified: trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java 2008-10-23 16:30:19 UTC (rev 192) @@ -16,6 +16,7 @@ import org.openfast.error.ErrorCode; import org.openfast.error.ErrorHandler; import org.openfast.examples.Assert; +import org.openfast.template.TemplateRegistry; import org.openfast.template.loader.XMLMessageTemplateLoader; public class PerformanceRunner implements ErrorHandler { @@ -26,6 +27,8 @@ private boolean namespaceAware; private boolean preloadData; private String format; + private ByteArrayInputStream byteIn; + private TemplateRegistry templateRegistry; public PerformanceRunner(File templatesFile, File dataFile) { this.templatesFile = templatesFile; @@ -33,17 +36,11 @@ } public PerformanceResult run() { - XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); - loader.setLoadTemplateIdFromAuxId(true); - - InputStream source = null; try { - Assert.assertTrue(templatesFile.exists(), "The message template file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); - source = new FileInputStream(templatesFile); - loader.load(source); + loadTemplates(); InputStream dataIn = getFastEncodedDataStream(); Context context = new Context(); - context.setTemplateRegistry(loader.getTemplateRegistry()); + context.setTemplateRegistry(templateRegistry); context.setErrorHandler(this); FastDecoder decoder = new FastDecoder(context, dataIn); PerformanceResult result = new PerformanceResult(); @@ -63,16 +60,30 @@ } else { System.out.println("Error occurred while decoding messages: " + e.getMessage()); } - } finally { - if (source != null) - try { - source.close(); - } catch (IOException e) { - } } return null; } + private void loadTemplates() throws FileNotFoundException { + InputStream source = null; + if (templateRegistry == null) { + try { + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); + loader.setLoadTemplateIdFromAuxId(true); + Assert.assertTrue(templatesFile.exists(), "The message template file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + source = new FileInputStream(templatesFile); + loader.load(source); + this.templateRegistry = loader.getTemplateRegistry(); + } finally { + if (source != null) + try { + source.close(); + } catch (IOException e) { + } + } + } + } + public void setPreloadData(boolean preloadData) { this.preloadData = preloadData; } @@ -86,6 +97,10 @@ } private InputStream getFastEncodedDataStream() { + if (preloadData && byteIn != null) { + byteIn.reset(); + return byteIn; + } Assert.assertTrue(dataFile.exists() && dataFile.canRead(), "The file \"" + dataFile.getAbsolutePath() + "\" does not exist."); try { InputStream dataIn = null; @@ -98,7 +113,7 @@ ByteArrayOutputStream byteOut = new ByteArrayOutputStream((int) dataFile.length()); copy(dataIn, byteOut, 1024); byte[] buffer = byteOut.toByteArray(); - InputStream byteIn = new ByteArrayInputStream(buffer); + byteIn = new ByteArrayInputStream(buffer); return byteIn; } return new BufferedInputStream(dataIn); Modified: trunk/src/main/java/org/openfast/template/BasicTemplateRegistry.java =================================================================== --- trunk/src/main/java/org/openfast/template/BasicTemplateRegistry.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/BasicTemplateRegistry.java 2008-10-23 16:30:19 UTC (rev 192) @@ -27,17 +27,19 @@ import java.util.Map; import org.openfast.QName; +import org.openfast.util.IntegerMap; +import org.openfast.util.SimpleIntegerMap; public class BasicTemplateRegistry extends AbstractTemplateRegistry { private Map nameMap = new HashMap(); - private Map idMap = new HashMap(); + private IntegerMap idMap = new SimpleIntegerMap(); private Map templateMap = new HashMap(); private List templates = new ArrayList(); public void register(int id, MessageTemplate template) { define(template); Integer tid = new Integer(id); - idMap.put(tid, template); + idMap.put(id, template); templateMap.put(template, tid); notifyTemplateRegistered(template, id); } @@ -47,7 +49,7 @@ Integer tid = new Integer(id); MessageTemplate template = (MessageTemplate) nameMap.get(name); templateMap.put(template, tid); - idMap.put(tid, template); + idMap.put(id, template); notifyTemplateRegistered(template, id); } public void define(MessageTemplate template) { @@ -63,7 +65,7 @@ return ((Integer) templateMap.get(template)).intValue(); } public MessageTemplate get(int templateId) { - return (MessageTemplate) idMap.get(new Integer(templateId)); + return (MessageTemplate) idMap.get(templateId); } public MessageTemplate get(QName name) { return (MessageTemplate) nameMap.get(name); @@ -77,7 +79,7 @@ return nameMap.containsKey(name); } public boolean isRegistered(int templateId) { - return idMap.containsKey(new Integer(templateId)); + return idMap.containsKey(templateId); } public boolean isRegistered(MessageTemplate template) { return templateMap.containsKey(template); @@ -91,16 +93,16 @@ public void remove(QName name) { MessageTemplate template = (MessageTemplate) nameMap.remove(name); Object id = templateMap.remove(template); - idMap.remove(id); + idMap.remove(((Integer) id).intValue()); templates.remove(template); } public void remove(MessageTemplate template) { Object id = templateMap.remove(template); nameMap.remove(template.getName()); - idMap.remove(id); + idMap.remove(((Integer)id).intValue()); } public void remove(int id) { - MessageTemplate template = (MessageTemplate) idMap.remove(new Integer(id)); + MessageTemplate template = (MessageTemplate) idMap.remove(id); templateMap.remove(template); nameMap.remove(template.getName()); } Modified: trunk/src/main/java/org/openfast/template/ComposedScalar.java =================================================================== --- trunk/src/main/java/org/openfast/template/ComposedScalar.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/ComposedScalar.java 2008-10-23 16:30:19 UTC (rev 192) @@ -23,6 +23,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; import org.openfast.BitVectorBuilder; import org.openfast.BitVectorReader; import org.openfast.Context; @@ -36,6 +37,7 @@ private Scalar[] fields; private ComposedValueConverter valueConverter; private Type type; + private FieldValue[] values; public ComposedScalar(String name, Type type, Scalar[] fields, boolean optional, ComposedValueConverter valueConverter) { this(new QName(name), type, fields, optional, valueConverter); @@ -46,6 +48,7 @@ this.fields = fields; this.valueConverter = valueConverter; this.type = type; + this.values = new FieldValue[fields.length]; } public FieldValue createValue(String value) { @@ -53,13 +56,15 @@ } public FieldValue decode(InputStream in, Group template, Context context, BitVectorReader presenceMapReader) { - FieldValue[] values = new FieldValue[fields.length]; - for (int i = 0; i < fields.length; i++) { - values[i] = fields[i].decode(in, template, context, presenceMapReader); - if (i == 0 && values[0] == null) - return null; + synchronized(values) { + Arrays.fill(values, null); + for (int i = 0; i < fields.length; i++) { + values[i] = fields[i].decode(in, template, context, presenceMapReader); + if (i == 0 && values[0] == null) + return null; + } + return valueConverter.compose(values); } - return valueConverter.compose(values); } public byte[] encode(FieldValue value, Group template, Context context, BitVectorBuilder presenceMapBuilder) { Modified: trunk/src/main/java/org/openfast/template/Sequence.java =================================================================== --- trunk/src/main/java/org/openfast/template/Sequence.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/Sequence.java 2008-10-23 16:30:19 UTC (rev 192) @@ -197,11 +197,11 @@ */ public FieldValue decode(InputStream in, Group template, Context context, BitVectorReader pmapReader) { SequenceValue sequenceValue = new SequenceValue(this); - FieldValue lengthValue = length.decode(in, template, context, pmapReader); + ScalarValue lengthValue = (ScalarValue) length.decode(in, template, context, pmapReader); if ((lengthValue == ScalarValue.NULL) || (lengthValue == null)) { return null; } - int len = ((IntegerValue) lengthValue).value; + int len = lengthValue.toInt(); for (int i = 0; i < len; i++) sequenceValue.add((GroupValue) group.decode(in, template, context, BitVectorReader.INFINITE_TRUE)); return sequenceValue; Modified: trunk/src/main/java/org/openfast/template/type/DecimalConverter.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/DecimalConverter.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/type/DecimalConverter.java 2008-10-23 16:30:19 UTC (rev 192) @@ -46,6 +46,6 @@ return null; if (values[0] == ScalarValue.UNDEFINED) return ScalarValue.UNDEFINED; - return new DecimalValue(((ScalarValue) values[1]).toLong(), ((IntegerValue) values[0]).value); + return new DecimalValue(((ScalarValue) values[1]).toLong(), ((ScalarValue) values[0]).toInt()); } } Modified: trunk/src/main/java/org/openfast/template/type/codec/AsciiString.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/AsciiString.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/type/codec/AsciiString.java 2008-10-23 16:30:19 UTC (rev 192) @@ -68,8 +68,8 @@ * @return Returns a new StringValue object with the data stream as a String */ public ScalarValue decode(InputStream in) { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int byt; + ByteArrayOutputStream buffer = Global.getBuffer(); try { do { byt = in.read(); Modified: trunk/src/main/java/org/openfast/template/type/codec/BitVectorType.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/BitVectorType.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/type/codec/BitVectorType.java 2008-10-23 16:30:19 UTC (rev 192) @@ -25,6 +25,7 @@ import org.openfast.BitVector; import org.openfast.BitVectorValue; +import org.openfast.Global; import org.openfast.ScalarValue; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -54,8 +55,8 @@ * @return Returns a new BitVector object with the data stream as an array */ public ScalarValue decode(InputStream in) { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int byt; + ByteArrayOutputStream buffer = Global.getBuffer(); do { try { byt = in.read(); Modified: trunk/src/main/java/org/openfast/template/type/codec/NullableAsciiString.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/NullableAsciiString.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/type/codec/NullableAsciiString.java 2008-10-23 16:30:19 UTC (rev 192) @@ -67,8 +67,8 @@ * @return Returns a new StringValue object with the data stream as a String */ public ScalarValue decode(InputStream in) { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int byt; + ByteArrayOutputStream buffer = Global.getBuffer(); try { do { byt = in.read(); Modified: trunk/src/main/java/org/openfast/template/type/codec/NullableSingleFieldDecimal.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/NullableSingleFieldDecimal.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/type/codec/NullableSingleFieldDecimal.java 2008-10-23 16:30:19 UTC (rev 192) @@ -50,7 +50,7 @@ if (v == ScalarValue.NULL) { return TypeCodec.NULL_VALUE_ENCODING; } - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + ByteArrayOutputStream buffer = Global.getBuffer(); DecimalValue value = (DecimalValue) v; try { if (Math.abs(value.exponent) > 63) { Modified: trunk/src/main/java/org/openfast/template/type/codec/SingleFieldDecimal.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/SingleFieldDecimal.java 2008-10-16 18:58:49 UTC (rev 191) +++ trunk/src/main/java/org/openfast/template/type/codec/SingleFieldDecimal.java 2008-10-23 16:30:19 UTC (rev 192) @@ -49,7 +49,7 @@ if (v == ScalarValue.NULL) { return TypeCodec.NULL_VALUE_ENCODING; } - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + ByteArrayOutputStream buffer = Global.getBuffer(); DecimalValue value = (DecimalValue) v; try { if (Math.abs(value.exponent) > 63) { Added: trunk/src/main/java/org/openfast/util/IntegerMap.java =================================================================== --- trunk/src/main/java/org/openfast/util/IntegerMap.java (rev 0) +++ trunk/src/main/java/org/openfast/util/IntegerMap.java 2008-10-23 16:30:19 UTC (rev 192) @@ -0,0 +1,13 @@ +package org.openfast.util; + + +public interface IntegerMap { + + void put(int key, Object value); + + Object get(int key); + + boolean containsKey(int key); + + Object remove(int key); +} Added: trunk/src/main/java/org/openfast/util/SimpleIntegerMap.java =================================================================== --- trunk/src/main/java/org/openfast/util/SimpleIntegerMap.java (rev 0) +++ trunk/src/main/java/org/openfast/util/SimpleIntegerMap.java 2008-10-23 16:30:19 UTC (rev 192) @@ -0,0 +1,65 @@ +package org.openfast.util; + + + +public class SimpleIntegerMap implements IntegerMap { + private static final int DEFAULT_INC_SIZE = 32; + private Object[] table; + private int firstKey; + private final int incSize; + + public SimpleIntegerMap() { + this(DEFAULT_INC_SIZE); + } + + public SimpleIntegerMap(int size) { + this.incSize = size; + } + + public void put(int key, Object object) { + adjust(key); + table[key - firstKey] = object; + } + + private void adjust(int key) { + if (table == null) { + table = new Object[incSize]; + firstKey = key; + } else if (firstKey > key) { + Object[] originalTable = table; + int diff = firstKey - key; + table = new Object[originalTable.length + diff]; + System.arraycopy(originalTable, 0, table, diff, originalTable.length); + firstKey = key; + } else if (key >= firstKey + table.length) { + Object[] originalTable = table; + int diff = key - (firstKey + table.length); + table = new Object[originalTable.length + diff + incSize]; + System.arraycopy(originalTable, 0, table, 0, originalTable.length); + } + } + + public Object get(int key) { + if (undefined(key)) + return null; + return table[key-firstKey]; + } + + private boolean undefined(int key) { + return table == null || key < firstKey || key >= table.length + firstKey; + } + + public boolean containsKey(int key) { + if (undefined(key)) + return false; + return table[key-firstKey] != null; + } + + public Object remove(int key) { + if (undefined(key)) + return null; + Object removed = table[key-firstKey]; + table[key-firstKey] = null; + return removed; + } +} Added: trunk/src/test/java/org/openfast/util/SimpleIntegerMapTest.java =================================================================== --- trunk/src/test/java/org/openfast/util/SimpleIntegerMapTest.java (rev 0) +++ trunk/src/test/java/org/openfast/util/SimpleIntegerMapTest.java 2008-10-23 16:30:19 UTC (rev 192) @@ -0,0 +1,32 @@ +package org.openfast.util; + +import junit.framework.TestCase; + +public class SimpleIntegerMapTest extends TestCase { + public void testPut() { + IntegerMap map = new SimpleIntegerMap(); + Object o = new Object(); + map.put(0, o); + assertEquals(o, map.get(0)); + } + + public void testPutShortMiss() { + IntegerMap map = new SimpleIntegerMap(); + Object o = new Object(); + map.put(5, o); + Object o2 = new Object(); + map.put(1, o2); + assertEquals(o, map.get(5)); + assertEquals(o2, map.get(1)); + } + + public void testPutLongMiss() { + IntegerMap map = new SimpleIntegerMap(); + Object o = new Object(); + map.put(5, o); + Object o2 = new Object(); + map.put(100, o2); + assertEquals(o, map.get(5)); + assertEquals(o2, map.get(100)); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-16 18:58:59
|
Revision: 191 http://openfast.svn.sourceforge.net/openfast/?rev=191&view=rev Author: jacob_northey Date: 2008-10-16 18:58:49 +0000 (Thu, 16 Oct 2008) Log Message: ----------- Fixed batch scripts Modified Paths: -------------- trunk/src/main/resources/consumer.bat trunk/src/main/resources/fast2Xml.bat trunk/src/main/resources/perf.bat trunk/src/main/resources/xml2Fast.bat Modified: trunk/src/main/resources/consumer.bat =================================================================== --- trunk/src/main/resources/consumer.bat 2008-10-15 21:16:12 UTC (rev 190) +++ trunk/src/main/resources/consumer.bat 2008-10-16 18:58:49 UTC (rev 191) @@ -1,6 +1,6 @@ @echo off -set OPENFAST_HOME=%~dp0%\.. +set OPENFAST_HOME=%~dp0%.. if not "%JAVA_HOME%" == "" goto GotJava echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. exit /B 1 Modified: trunk/src/main/resources/fast2Xml.bat =================================================================== --- trunk/src/main/resources/fast2Xml.bat 2008-10-15 21:16:12 UTC (rev 190) +++ trunk/src/main/resources/fast2Xml.bat 2008-10-16 18:58:49 UTC (rev 191) @@ -1,6 +1,6 @@ @echo off -set OPENFAST_HOME=%~dp0%\.. +set OPENFAST_HOME=%~dp0%.. if not "%JAVA_HOME%" == "" goto GotJava echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. exit /B 1 Modified: trunk/src/main/resources/perf.bat =================================================================== --- trunk/src/main/resources/perf.bat 2008-10-15 21:16:12 UTC (rev 190) +++ trunk/src/main/resources/perf.bat 2008-10-16 18:58:49 UTC (rev 191) @@ -1,6 +1,6 @@ @echo off -set OPENFAST_HOME=%~dp0%\.. +set OPENFAST_HOME=%~dp0%.. if not "%JAVA_HOME%" == "" goto GotJava echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. exit /B 1 Modified: trunk/src/main/resources/xml2Fast.bat =================================================================== --- trunk/src/main/resources/xml2Fast.bat 2008-10-15 21:16:12 UTC (rev 190) +++ trunk/src/main/resources/xml2Fast.bat 2008-10-16 18:58:49 UTC (rev 191) @@ -1,6 +1,6 @@ @echo off -set OPENFAST_HOME=%~dp0%\.. +set OPENFAST_HOME=%~dp0%.. if not "%JAVA_HOME%" == "" goto GotJava echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. exit /B 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-15 21:16:19
|
Revision: 190 http://openfast.svn.sourceforge.net/openfast/?rev=190&view=rev Author: jacob_northey Date: 2008-10-15 21:16:12 +0000 (Wed, 15 Oct 2008) Log Message: ----------- Updated unit tests that use time to use GMT as the standard time zone Modified Paths: -------------- trunk/src/main/java/org/openfast/template/type/codec/DateString.java trunk/src/main/java/org/openfast/template/type/codec/MillisecondsSinceMidnight.java trunk/src/main/java/org/openfast/util/Util.java trunk/src/test/java/org/openfast/template/type/codec/DateStringTest.java trunk/src/test/java/org/openfast/template/type/codec/EpochTimestampTest.java trunk/src/test/java/org/openfast/template/type/codec/MillisecondsSinceMidnightTest.java trunk/src/test/java/org/openfast/test/OpenFastTestCase.java trunk/src/test/java/org/openfast/util/UtilTest.java Modified: trunk/src/main/java/org/openfast/template/type/codec/DateString.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/DateString.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/main/java/org/openfast/template/type/codec/DateString.java 2008-10-15 21:16:12 UTC (rev 190) @@ -24,6 +24,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.TimeZone; import org.openfast.DateValue; import org.openfast.Global; import org.openfast.ScalarValue; @@ -36,6 +37,7 @@ public DateString(String format) { formatter = new SimpleDateFormat(format); + formatter.setTimeZone(TimeZone.getTimeZone("GMT")); } public ScalarValue decode(InputStream in) { Modified: trunk/src/main/java/org/openfast/template/type/codec/MillisecondsSinceMidnight.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/MillisecondsSinceMidnight.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/main/java/org/openfast/template/type/codec/MillisecondsSinceMidnight.java 2008-10-15 21:16:12 UTC (rev 190) @@ -23,6 +23,7 @@ import java.io.InputStream; import java.util.Calendar; import java.util.Date; +import java.util.TimeZone; import org.openfast.DateValue; import org.openfast.IntegerValue; import org.openfast.ScalarValue; @@ -34,6 +35,7 @@ public ScalarValue decode(InputStream in) { int millisecondsSinceMidnight = TypeCodec.INTEGER.decode(in).toInt(); Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); int hour = millisecondsSinceMidnight / 3600000; millisecondsSinceMidnight -= hour * 3600000; cal.set(Calendar.HOUR_OF_DAY, hour); Modified: trunk/src/main/java/org/openfast/util/Util.java =================================================================== --- trunk/src/main/java/org/openfast/util/Util.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/main/java/org/openfast/util/Util.java 2008-10-15 21:16:12 UTC (rev 190) @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.Date; import java.util.Iterator; +import java.util.TimeZone; import org.openfast.Global; import org.openfast.IntegerValue; import org.openfast.QName; @@ -97,6 +98,7 @@ public static int millisecondsSinceMidnight(Date date) { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.setTime(date); return cal.get(Calendar.HOUR_OF_DAY) * 3600000 + cal.get(Calendar.MINUTE) * 60000 + cal.get(Calendar.SECOND) * 1000 + cal.get(Calendar.MILLISECOND); @@ -114,18 +116,21 @@ */ public static Date date(int year, int month, int day) { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.set(year - 1900, month - 1, day); return cal.getTime(); } public static int dateToInt(Date date) { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.setTime(date); return cal.get(Calendar.YEAR) * 10000 + (cal.get(Calendar.MONTH) + 1) * 100 + cal.get(Calendar.DATE); } public static int timeToInt(Date date) { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.setTime(date); return cal.get(Calendar.HOUR_OF_DAY) * 10000000 + cal.get(Calendar.MINUTE) * 100000 + cal.get(Calendar.SECOND) * 1000 + cal.get(Calendar.MILLISECOND); @@ -137,6 +142,7 @@ public static Date toTimestamp(long value) { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); int year = (int) (value / 10000000000000L); value %= 10000000000000L; int month = (int) (value / 100000000000L); Modified: trunk/src/test/java/org/openfast/template/type/codec/DateStringTest.java =================================================================== --- trunk/src/test/java/org/openfast/template/type/codec/DateStringTest.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/test/java/org/openfast/template/type/codec/DateStringTest.java 2008-10-15 21:16:12 UTC (rev 190) @@ -1,13 +1,11 @@ package org.openfast.template.type.codec; - import org.openfast.DateValue; import org.openfast.test.OpenFastTestCase; public class DateStringTest extends OpenFastTestCase { - - public void testEncodeDecode() { - assertEncodeDecode(new DateValue(date(2007, 7, 7)), "00110010 00110000 00110000 00110111 00110000 00111000 00110000 10110111", TypeCodec.DATE_STRING); - } - -} + public void testEncodeDecode() { + assertEncodeDecode(new DateValue(date(2007, 7, 7)), "00110010 00110000 00110000 00110111 00110000 00111000 00110000 10110111", + TypeCodec.DATE_STRING); + } +} \ No newline at end of file Modified: trunk/src/test/java/org/openfast/template/type/codec/EpochTimestampTest.java =================================================================== --- trunk/src/test/java/org/openfast/template/type/codec/EpochTimestampTest.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/test/java/org/openfast/template/type/codec/EpochTimestampTest.java 2008-10-15 21:16:12 UTC (rev 190) @@ -1,16 +1,17 @@ package org.openfast.template.type.codec; import java.util.Calendar; - +import java.util.TimeZone; import org.openfast.DateValue; import org.openfast.test.OpenFastTestCase; public class EpochTimestampTest extends OpenFastTestCase { - - public void testEncodeDecode() { - Calendar cal = Calendar.getInstance(); - cal.set(2007, 7, 7, 12, 0, 0); - cal.set(Calendar.MILLISECOND, 0); - assertEncodeDecode(new DateValue(cal.getTime()), "00100010 01000100 00001000 00110111 00110000 10000000", TypeCodec.EPOCH_TIMESTAMP); - } + public void testEncodeDecode() { + Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); + cal.set(2007, 7, 7, 12, 0, 0); + cal.set(Calendar.MILLISECOND, 0); + assertEncodeDecode(new DateValue(cal.getTime()), "00100010 01000100 00000001 01001000 00111100 10000000", + TypeCodec.EPOCH_TIMESTAMP); + } } Modified: trunk/src/test/java/org/openfast/template/type/codec/MillisecondsSinceMidnightTest.java =================================================================== --- trunk/src/test/java/org/openfast/template/type/codec/MillisecondsSinceMidnightTest.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/test/java/org/openfast/template/type/codec/MillisecondsSinceMidnightTest.java 2008-10-15 21:16:12 UTC (rev 190) @@ -1,13 +1,10 @@ package org.openfast.template.type.codec; - import org.openfast.DateValue; import org.openfast.test.OpenFastTestCase; public class MillisecondsSinceMidnightTest extends OpenFastTestCase { - - public void testEncodeDecode() { - assertEncodeDecode(new DateValue(time(5, 30, 25, 254)), "00001001 00111010 00000100 11100110", TypeCodec.TIME_IN_MS); - } - + public void testEncodeDecode() { + assertEncodeDecode(new DateValue(time(5, 30, 25, 254)), "00001001 00111010 00000100 11100110", TypeCodec.TIME_IN_MS); + } } Modified: trunk/src/test/java/org/openfast/test/OpenFastTestCase.java =================================================================== --- trunk/src/test/java/org/openfast/test/OpenFastTestCase.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/test/java/org/openfast/test/OpenFastTestCase.java 2008-10-15 21:16:12 UTC (rev 190) @@ -26,6 +26,7 @@ import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; +import java.util.TimeZone; import javax.xml.parsers.DocumentBuilderFactory; @@ -125,6 +126,7 @@ protected static Date date(int year, int month, int day) { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.set(year, month, day, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); @@ -132,6 +134,7 @@ protected static Date time(int hour, int min, int sec, int ms) { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, min); cal.set(Calendar.SECOND, sec); Modified: trunk/src/test/java/org/openfast/util/UtilTest.java =================================================================== --- trunk/src/test/java/org/openfast/util/UtilTest.java 2008-10-10 15:03:14 UTC (rev 189) +++ trunk/src/test/java/org/openfast/util/UtilTest.java 2008-10-15 21:16:12 UTC (rev 190) @@ -24,6 +24,7 @@ import java.util.Calendar; import java.util.LinkedHashMap; import java.util.Map; +import java.util.TimeZone; import junit.framework.TestCase; @@ -86,6 +87,7 @@ } public void testIntToTimestamp() { Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.set(2007, 0, 10, 14, 25, 12); cal.set(Calendar.MILLISECOND, 253); assertEquals(cal.getTime(), Util.toTimestamp(20070110142512253L)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-10 15:03:28
|
Revision: 189 http://openfast.svn.sourceforge.net/openfast/?rev=189&view=rev Author: jacob_northey Date: 2008-10-10 15:03:14 +0000 (Fri, 10 Oct 2008) Log Message: ----------- Added better error handling to examples Modified Paths: -------------- trunk/src/main/java/org/openfast/examples/OpenFastExample.java trunk/src/main/java/org/openfast/examples/consumer/Main.java trunk/src/main/java/org/openfast/examples/performance/Main.java Modified: trunk/src/main/java/org/openfast/examples/OpenFastExample.java =================================================================== --- trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-10-10 12:18:46 UTC (rev 188) +++ trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-10-10 15:03:14 UTC (rev 189) @@ -28,14 +28,14 @@ try { return Integer.parseInt(cl.getOptionValue(option)); } catch (NumberFormatException e) { - System.out.println("The required option \"" + option + "\" must be an integer."); + System.out.println("The required parameter \"" + option + "\" must be an integer."); System.exit(1); return 0; } } protected static File getFile(CommandLine cl, String option) { - Assert.assertTrue(cl.hasOption(option), "The required parameter " + option + " is missing."); + Assert.assertTrue(cl.hasOption(option), "The required parameter \"" + option + "\" is missing."); File file = new File(cl.getOptionValue(option)); return file; } Modified: trunk/src/main/java/org/openfast/examples/consumer/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-10-10 12:18:46 UTC (rev 188) +++ trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-10-10 15:03:14 UTC (rev 189) @@ -37,24 +37,30 @@ if (cl.hasOption("help")) { displayHelp(options); } - Assert.assertTrue(cl.hasOption(PORT), "The required parameter " + PORT + " is missing."); - int port = getInteger(cl, PORT); - String host = cl.hasOption(HOST) ? cl.getOptionValue(HOST) : "localhost"; + Endpoint endpoint = null; boolean showStacktrace = cl.hasOption(ERROR); - Endpoint endpoint = null; - - if (cl.hasOption(PROTOCOL)) { - if ("udp".equals(cl.getOptionValue(PROTOCOL))) { - endpoint = new MulticastEndpoint(port, host); + File templatesFile = null; + try { + Assert.assertTrue(cl.hasOption(PORT), "The required parameter \"" + PORT + "\" is missing."); + int port = getInteger(cl, PORT); + String host = cl.hasOption(HOST) ? cl.getOptionValue(HOST) : "localhost"; + + if (cl.hasOption(PROTOCOL)) { + if ("udp".equals(cl.getOptionValue(PROTOCOL))) { + endpoint = new MulticastEndpoint(port, host); + } } + if (endpoint == null) { + endpoint = new TcpEndpoint(host, port); + } + templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + } catch (AssertionError e) { + System.out.println(e.getMessage()); + displayHelp(options); } - if (endpoint == null) { - endpoint = new TcpEndpoint(host, port); - } - File templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); - Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); - Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); - Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); FastMessageConsumer consumer = new FastMessageConsumer(endpoint, templatesFile); try { consumer.start(); Modified: trunk/src/main/java/org/openfast/examples/performance/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-10 12:18:46 UTC (rev 188) +++ trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-10 15:03:14 UTC (rev 189) @@ -28,9 +28,9 @@ if (cl.hasOption("help")) { displayHelp(options); } - File templatesFile = new File(getString(cl, "template")); - File dataFile = new File(getString(cl, "data")); try { + File templatesFile = new File(getString(cl, "template")); + File dataFile = new File(getString(cl, "data")); PerformanceRunner performanceRunner = new PerformanceRunner(templatesFile, dataFile); if (cl.hasOption("ns")) performanceRunner.setNamespaceAwareness(true); @@ -46,6 +46,7 @@ System.out.println("Average decode time per message: " + ((result.getTime() * 1000) / (result.getMessageCount())) + " microseconds"); } catch (AssertionError ae) { System.out.println(ae.getMessage()); + displayHelp(options); } catch (Exception e) { if (cl.hasOption("error")) e.printStackTrace(); @@ -54,7 +55,7 @@ } private static String getString(CommandLine cl, String option) { - Assert.assertTrue(cl.hasOption(option), "The required option \"" + option + "\" was not specified."); + Assert.assertTrue(cl.hasOption(option), "The required parameter \"" + option + "\" was not specified."); return cl.getOptionValue(option); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-10 12:18:59
|
Revision: 188 http://openfast.svn.sourceforge.net/openfast/?rev=188&view=rev Author: jacob_northey Date: 2008-10-10 12:18:46 +0000 (Fri, 10 Oct 2008) Log Message: ----------- Added Acknowledgments section and YourKit blurb to web site. Modified Paths: -------------- trunk/src/site/xdoc/index.xml.vm Modified: trunk/src/site/xdoc/index.xml.vm =================================================================== --- trunk/src/site/xdoc/index.xml.vm 2008-10-09 14:23:28 UTC (rev 187) +++ trunk/src/site/xdoc/index.xml.vm 2008-10-10 12:18:46 UTC (rev 188) @@ -58,6 +58,14 @@ <li>Licensed under the <a href="http://www.mozilla.org/MPL/MPL-1.1.html">Mozilla Public License</a></li> </ul> </subsection> + <subsection name="Acknowledgments"> + <h4>OpenFAST uses The YourKit Java Profiler for Performance Tuning</h4> + <p>YourKit is kindly supporting open source projects with its full-featured Java Profiler. + YourKit, LLC is the creator of innovative and intelligent tools for profiling + Java and .NET applications. Take a look at YourKit's leading software products: + <a href="http://www.yourkit.com/java/profiler/index.jsp">YourKit Java Profiler</a> and + <a href="http://www.yourkit.com/.net/profiler/index.jsp">YourKit .NET Profiler</a>.</p> + </subsection> </section> </body> </document> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-10-09 14:23:40
|
Revision: 187 http://openfast.svn.sourceforge.net/openfast/?rev=187&view=rev Author: jacob_northey Date: 2008-10-09 14:23:28 +0000 (Thu, 09 Oct 2008) Log Message: ----------- Created examples for xml conversion, performance testing, and basic fast message consuming; build proof of concept Map operator in combination with xml conversion examples Modified Paths: -------------- trunk/pom.xml trunk/src/assembly/binary.xml trunk/src/main/java/org/openfast/Context.java trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java trunk/src/main/java/org/openfast/template/operator/Operator.java Added Paths: ----------- trunk/src/main/java/org/openfast/examples/ trunk/src/main/java/org/openfast/examples/Assert.java trunk/src/main/java/org/openfast/examples/OpenFastExample.java trunk/src/main/java/org/openfast/examples/consumer/ trunk/src/main/java/org/openfast/examples/consumer/FastMessageConsumer.java trunk/src/main/java/org/openfast/examples/consumer/Main.java trunk/src/main/java/org/openfast/examples/performance/ trunk/src/main/java/org/openfast/examples/performance/HexadecimalInputStream.java trunk/src/main/java/org/openfast/examples/performance/Main.java trunk/src/main/java/org/openfast/examples/performance/PerformanceResult.java trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java trunk/src/main/java/org/openfast/examples/xml/ trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java trunk/src/main/java/org/openfast/examples/xml/FastToXmlMain.java trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java trunk/src/main/java/org/openfast/examples/xml/XmlToFastMain.java trunk/src/main/java/org/openfast/examples/xml/xmlOverFastTemplates.xml trunk/src/main/java/org/openfast/template/MapScalar.java trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java trunk/src/main/java/org/openfast/util/Cache.java trunk/src/main/java/org/openfast/util/UnboundedCache.java trunk/src/main/resources/consumer.bat trunk/src/main/resources/consumer.sh trunk/src/main/resources/fast2Xml.bat trunk/src/main/resources/fast2Xml.sh trunk/src/main/resources/perf.bat trunk/src/main/resources/perf.sh trunk/src/main/resources/xml2Fast.bat trunk/src/main/resources/xml2Fast.sh Property Changed: ---------------- trunk/ Property changes on: trunk ___________________________________________________________________ Modified: svn:ignore - bin build doc build_sf target .classpath .project .settings + bin build doc build_sf target .classpath .project .settings hotspot.log Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2008-08-05 14:33:23 UTC (rev 186) +++ trunk/pom.xml 2008-10-09 14:23:28 UTC (rev 187) @@ -3,7 +3,7 @@ <groupId>org.openfast</groupId> <artifactId>openfast</artifactId> <packaging>jar</packaging> - <version>1.0.1-SNAPSHOT</version> + <version>1.1.0-SNAPSHOT</version> <organization> <name>The LaSalle Technology Group, LLC</name> @@ -123,6 +123,12 @@ <resource> <directory>src/main/resources</directory> </resource> + <resource> + <directory>src/main/java</directory> + <excludes> + <exclude>**/*.java</exclude> + </excludes> + </resource> </resources> <extensions> @@ -196,6 +202,18 @@ <dependencies> <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + <version>1.1</version> + <optional>true</optional> + </dependency> + <dependency> + <groupId>com.thoughtworks.xstream</groupId> + <artifactId>xstream</artifactId> + <version>1.3</version> + <optional>true</optional> + </dependency> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.2</version> @@ -208,21 +226,21 @@ <id>sourceforge.net</id> <name>Sourceforge.net Repository</name> <url> - scp://shell.sourceforge.net/home/groups/o/op/openfast/htdocs/maven/release + scp://web.sourceforge.net/home/groups/o/op/openfast/htdocs/maven/release </url> </repository> <snapshotRepository> <id>sourceforge.net</id> <name>Sourceforge.net Snapshot Repository</name> <url> - scp://shell.sourceforge.net/home/groups/o/op/openfast/htdocs/maven/snapshot + scp://web.sourceforge.net/home/groups/o/op/openfast/htdocs/maven/snapshot </url> </snapshotRepository> <site> <id>sourceforge.net</id> <name>Sourceforge.net OpenFAST Web Site</name> <url> - scp://shell.sourceforge.net/home/groups/o/op/openfast/htdocs/ + scp://web.sourceforge.net/home/groups/o/op/openfast/htdocs/ </url> </site> </distributionManagement> Modified: trunk/src/assembly/binary.xml =================================================================== --- trunk/src/assembly/binary.xml 2008-08-05 14:33:23 UTC (rev 186) +++ trunk/src/assembly/binary.xml 2008-10-09 14:23:28 UTC (rev 187) @@ -8,25 +8,43 @@ <fileSets> <fileSet> <directory>src/main/java</directory> - <outputDirectory>/src</outputDirectory> + <outputDirectory>src</outputDirectory> </fileSet> <fileSet> + <directory>src/main/resources</directory> + <outputDirectory>bin</outputDirectory> + <includes> + <include>*.bat</include> + </includes> + <filtered>true</filtered> + </fileSet> + <fileSet> + <directory>src/main/resources</directory> + <outputDirectory>bin</outputDirectory> + <includes> + <include>*.sh</include> + </includes> + <filtered>true</filtered> + <lineEnding>unix</lineEnding> + <fileMode>0755</fileMode> + </fileSet> + <fileSet> <directory>/</directory> - <outputDirectory>/</outputDirectory> + <outputDirectory></outputDirectory> <includes> <include>license.txt</include> </includes> </fileSet> <fileSet> <directory>target</directory> - <outputDirectory>/</outputDirectory> + <outputDirectory></outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <fileSet> <directory>target/apidocs</directory> - <outputDirectory>/docs/api</outputDirectory> + <outputDirectory>docs/api</outputDirectory> </fileSet> </fileSets> <moduleSets> @@ -38,4 +56,9 @@ </binaries> </moduleSet> </moduleSets> + <dependencySets> + <dependencySet> + <outputDirectory>lib</outputDirectory> + </dependencySet> + </dependencySets> </assembly> \ No newline at end of file Modified: trunk/src/main/java/org/openfast/Context.java =================================================================== --- trunk/src/main/java/org/openfast/Context.java 2008-08-05 14:33:23 UTC (rev 186) +++ trunk/src/main/java/org/openfast/Context.java 2008-10-09 14:23:28 UTC (rev 187) @@ -36,6 +36,8 @@ import org.openfast.template.MessageTemplate; import org.openfast.template.TemplateRegisteredListener; import org.openfast.template.TemplateRegistry; +import org.openfast.util.Cache; +import org.openfast.util.UnboundedCache; /** * Manages current state of an encoding or decoding process. Each encoder/decoder should have a separate context @@ -52,6 +54,7 @@ private boolean traceEnabled; private Trace encodeTrace; private Trace decodeTrace; + private Map caches = new HashMap(); public Context() { dictionaries.put("global", new GlobalDictionary()); @@ -144,4 +147,16 @@ public Trace getDecodeTrace() { return decodeTrace; } + public Cache getCache(QName key) { + if (!caches.containsKey(key)) { + caches.put(key, new UnboundedCache()); + } + return (Cache) caches.get(key); + } + public void store(QName key, int index, ScalarValue value) { + if (!caches.containsKey(key)) { + caches.put(key, new UnboundedCache()); + } + ((Cache)caches.get(key)).store(index, value); + } } Added: trunk/src/main/java/org/openfast/examples/Assert.java =================================================================== --- trunk/src/main/java/org/openfast/examples/Assert.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/Assert.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,8 @@ +package org.openfast.examples; + +public class Assert { + public static void assertTrue(boolean condition, String errorMessage) { + if (!condition) + throw new AssertionError(errorMessage); + } +} Added: trunk/src/main/java/org/openfast/examples/OpenFastExample.java =================================================================== --- trunk/src/main/java/org/openfast/examples/OpenFastExample.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/OpenFastExample.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,42 @@ +package org.openfast.examples; + +import java.io.File; +import org.apache.commons.cli.BasicParser; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +public class OpenFastExample { + protected static CommandLine parseCommandLine(String[] args, Options options) { + try { + BasicParser parser = new BasicParser(); + return parser.parse(options, args); + } catch (ParseException e) { + displayHelp(options); + return null; + } + } + + protected static void displayHelp(Options options) { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp("perf", options); + System.exit(1); + } + + protected static int getInteger(CommandLine cl, String option) { + try { + return Integer.parseInt(cl.getOptionValue(option)); + } catch (NumberFormatException e) { + System.out.println("The required option \"" + option + "\" must be an integer."); + System.exit(1); + return 0; + } + } + + protected static File getFile(CommandLine cl, String option) { + Assert.assertTrue(cl.hasOption(option), "The required parameter " + option + " is missing."); + File file = new File(cl.getOptionValue(option)); + return file; + } +} Added: trunk/src/main/java/org/openfast/examples/consumer/FastMessageConsumer.java =================================================================== --- trunk/src/main/java/org/openfast/examples/consumer/FastMessageConsumer.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/consumer/FastMessageConsumer.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,47 @@ +package org.openfast.examples.consumer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.codec.FastDecoder; +import org.openfast.session.Connection; +import org.openfast.session.Endpoint; +import org.openfast.session.FastConnectionException; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +public class FastMessageConsumer { + private final Endpoint endpoint; + private final TemplateRegistry templateRegistry; + + public FastMessageConsumer(Endpoint endpoint, File templatesFile) { + this.endpoint = endpoint; + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(); + loader.setLoadTemplateIdFromAuxId(true); + try { + loader.load(new FileInputStream(templatesFile)); + } catch (FileNotFoundException e) { + throw new RuntimeException(e.getMessage(), e); + } + this.templateRegistry = loader.getTemplateRegistry(); + } + + public void start() throws FastConnectionException, IOException { + final Connection connection = endpoint.connect(); + Context context = new Context(); + context.setTemplateRegistry(templateRegistry); + FastDecoder decoder = new FastDecoder(context, connection.getInputStream()); + Runtime.getRuntime().addShutdownHook(new Thread() { + public void run() { + connection.close(); + } + }); + while (true) { + Message message = decoder.readMessage(); + System.out.println(message.toString()); + } + } +} Added: trunk/src/main/java/org/openfast/examples/consumer/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/consumer/Main.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/consumer/Main.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,73 @@ +package org.openfast.examples.consumer; + +import java.io.File; +import java.io.IOException; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; +import org.openfast.session.Endpoint; +import org.openfast.session.FastConnectionException; +import org.openfast.session.multicast.MulticastEndpoint; +import org.openfast.session.tcp.TcpEndpoint; + +public class Main extends OpenFastExample { + private static final String MESSAGE_TEMPLATE_FILE = "template"; + private static final String PORT = "port"; + private static final String PROTOCOL = "protocol"; + private static final String HOST = "host"; + private static final String ERROR = "error"; + + private static Options options = new Options(); + + static { + options.addOption("?", "help", false, "Displays this message"); + options.addOption("t", "protocol", true, "Protocol [tcp|udp] defaults to tcp"); + options.addOption("p", PORT, true, "Port to connect to"); + options.addOption("h", "host", true, "The host name of the server (or group name for multicast)"); + options.addOption("e", "error", false, "Show stacktrace information"); + options.addOption("m", MESSAGE_TEMPLATE_FILE, true, "Message template definition file"); + } + + /** + * @param args + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine(args, options); + if (cl.hasOption("help")) { + displayHelp(options); + } + Assert.assertTrue(cl.hasOption(PORT), "The required parameter " + PORT + " is missing."); + int port = getInteger(cl, PORT); + String host = cl.hasOption(HOST) ? cl.getOptionValue(HOST) : "localhost"; + boolean showStacktrace = cl.hasOption(ERROR); + Endpoint endpoint = null; + + if (cl.hasOption(PROTOCOL)) { + if ("udp".equals(cl.getOptionValue(PROTOCOL))) { + endpoint = new MulticastEndpoint(port, host); + } + } + if (endpoint == null) { + endpoint = new TcpEndpoint(host, port); + } + File templatesFile = getFile(cl, MESSAGE_TEMPLATE_FILE); + Assert.assertTrue(templatesFile.exists(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + Assert.assertTrue(!templatesFile.isDirectory(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is a directory."); + Assert.assertTrue(templatesFile.canRead(), "The template definition file \"" + templatesFile.getAbsolutePath() + "\" is not readable."); + FastMessageConsumer consumer = new FastMessageConsumer(endpoint, templatesFile); + try { + consumer.start(); + } catch (FastConnectionException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("Unable to connect to endpoint: " + e.getMessage()); + System.exit(1); + } catch (IOException e) { + if (showStacktrace) + e.printStackTrace(); + System.out.println("An IO error occurred while consuming messages: " + e.getMessage()); + System.exit(1); + } + } +} Added: trunk/src/main/java/org/openfast/examples/performance/HexadecimalInputStream.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/HexadecimalInputStream.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/performance/HexadecimalInputStream.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,56 @@ +package org.openfast.examples.performance; + +import java.io.IOException; +import java.io.InputStream; + +public class HexadecimalInputStream extends InputStream { + private final InputStream in; + private byte[] buffer = new byte[32]; + + public HexadecimalInputStream(InputStream in) { + this.in = in; + } + + public int read(byte[] b, int off, int len) throws IOException { + if (buffer.length < len * 2) { + buffer = new byte[len * 2]; + } + int byteCount = 0; + while (byteCount < len) { + int toRead = (len - byteCount) * 2; + int numRead = in.read(buffer, 0, toRead); + boolean eof = numRead < toRead; + int index = 0; + while (index < numRead) { + if (buffer[index] == '\r' || buffer[index] == '\n') { + index++; + continue; + } + if (index + 1 == numRead) { + byte[] temp = new byte[2]; + temp[0] = buffer[index]; + temp[1] = (byte) in.read(); + String data = new String(temp); + b[off + byteCount] = (byte) Integer.parseInt(data, 16); + byteCount++; + break; + } + String data = new String(buffer, index, 2); + b[off + byteCount] = (byte) Integer.parseInt(data, 16); + byteCount++; + index+=2; + } + if (eof) + return byteCount; + } + return byteCount; + } + + public int read() throws IOException { + throw new UnsupportedOperationException(); + } + + public void close() throws IOException { + in.close(); + } +} Added: trunk/src/main/java/org/openfast/examples/performance/Main.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/Main.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/performance/Main.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,60 @@ +package org.openfast.examples.performance; + +import java.io.File; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.openfast.examples.Assert; +import org.openfast.examples.OpenFastExample; + +public class Main extends OpenFastExample { + private static Options options = new Options(); + + static { + options.addOption("?", "help", false, "Displays this message."); + options.addOption("n", "ns", false, "Enables namespace awareness"); + options.addOption("t", "template", true, "Message Template definition file"); + options.addOption("d", "data", true, "FAST Encoded data"); + options.addOption("p", "preload", false, "Preload data into memory instead of decoding directly from file"); + options.addOption("e", "error", false, "Show stacktrace information"); + options.addOption("r", "repeat", true, "Re process data file X number of times"); + options.addOption("f", "format", true, "Data format [hex|binary] default is binary "); + } + + /** + * @param args + */ + public static void main(String[] args) { + CommandLine cl = parseCommandLine(args, options); + if (cl.hasOption("help")) { + displayHelp(options); + } + File templatesFile = new File(getString(cl, "template")); + File dataFile = new File(getString(cl, "data")); + try { + PerformanceRunner performanceRunner = new PerformanceRunner(templatesFile, dataFile); + if (cl.hasOption("ns")) + performanceRunner.setNamespaceAwareness(true); + if (cl.hasOption("error")) + performanceRunner.setShowStacktrace(true); + if (cl.hasOption("preload")) + performanceRunner.setPreloadData(true); + if (cl.hasOption("format")) + performanceRunner.setFormat(cl.getOptionValue("format")); + PerformanceResult result = performanceRunner.run(); + + System.out.println("Decoded " + result.getMessageCount() + " messages in " + result.getTime() + " milliseconds."); + System.out.println("Average decode time per message: " + ((result.getTime() * 1000) / (result.getMessageCount())) + " microseconds"); + } catch (AssertionError ae) { + System.out.println(ae.getMessage()); + } catch (Exception e) { + if (cl.hasOption("error")) + e.printStackTrace(); + System.out.println(e.getMessage()); + } + } + + private static String getString(CommandLine cl, String option) { + Assert.assertTrue(cl.hasOption(option), "The required option \"" + option + "\" was not specified."); + return cl.getOptionValue(option); + } +} Added: trunk/src/main/java/org/openfast/examples/performance/PerformanceResult.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/PerformanceResult.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/performance/PerformanceResult.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,32 @@ +package org.openfast.examples.performance; + +public class PerformanceResult { + + private long startTime; + private long stopTime; + private int numMessages = 0; + + public void start() { + startTime = System.currentTimeMillis(); + } + + public void startMessage() { + + } + + public void finishMessage() { + numMessages++; + } + + public void stop() { + stopTime = System.currentTimeMillis(); + } + + public int getMessageCount() { + return numMessages; + } + + public long getTime() { + return stopTime - startTime; + } +} Added: trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java =================================================================== --- trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/performance/PerformanceRunner.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,144 @@ +package org.openfast.examples.performance; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import org.openfast.Context; +import org.openfast.Message; +import org.openfast.codec.FastDecoder; +import org.openfast.error.ErrorCode; +import org.openfast.error.ErrorHandler; +import org.openfast.examples.Assert; +import org.openfast.template.loader.XMLMessageTemplateLoader; + +public class PerformanceRunner implements ErrorHandler { + + private File templatesFile; + private File dataFile; + private boolean showStacktrace; + private boolean namespaceAware; + private boolean preloadData; + private String format; + + public PerformanceRunner(File templatesFile, File dataFile) { + this.templatesFile = templatesFile; + this.dataFile = dataFile; + } + + public PerformanceResult run() { + XMLMessageTemplateLoader loader = new XMLMessageTemplateLoader(namespaceAware); + loader.setLoadTemplateIdFromAuxId(true); + + InputStream source = null; + try { + Assert.assertTrue(templatesFile.exists(), "The message template file \"" + templatesFile.getAbsolutePath() + "\" does not exist."); + source = new FileInputStream(templatesFile); + loader.load(source); + InputStream dataIn = getFastEncodedDataStream(); + Context context = new Context(); + context.setTemplateRegistry(loader.getTemplateRegistry()); + context.setErrorHandler(this); + FastDecoder decoder = new FastDecoder(context, dataIn); + PerformanceResult result = new PerformanceResult(); + Message msg = null; + result.start(); + do { + result.startMessage(); + msg = decoder.readMessage(); + if (msg != null) + result.finishMessage(); + } while (msg != null); + result.stop(); + return result; + } catch (Exception e) { + if (showStacktrace) { + e.printStackTrace(); + } else { + System.out.println("Error occurred while decoding messages: " + e.getMessage()); + } + } finally { + if (source != null) + try { + source.close(); + } catch (IOException e) { + } + } + return null; + } + + public void setPreloadData(boolean preloadData) { + this.preloadData = preloadData; + } + + public void setShowStacktrace(boolean showStacktrace) { + this.showStacktrace = showStacktrace; + } + + public void setNamespaceAwareness(boolean namespaceAwareness) { + this.namespaceAware = namespaceAwareness; + } + + private InputStream getFastEncodedDataStream() { + Assert.assertTrue(dataFile.exists() && dataFile.canRead(), "The file \"" + dataFile.getAbsolutePath() + "\" does not exist."); + try { + InputStream dataIn = null; + FileInputStream fileIn = new FileInputStream(dataFile); + if ("hex".equals(format)) + dataIn = new HexadecimalInputStream(fileIn); + else + dataIn = fileIn; + if (preloadData) { + ByteArrayOutputStream byteOut = new ByteArrayOutputStream((int) dataFile.length()); + copy(dataIn, byteOut, 1024); + byte[] buffer = byteOut.toByteArray(); + InputStream byteIn = new ByteArrayInputStream(buffer); + return byteIn; + } + return new BufferedInputStream(dataIn); + } catch (FileNotFoundException e) { + error(null, "File \"" + dataFile.getAbsolutePath() + "\" could not be found.", e); + } catch (IOException e) { + error(null, "File \"" + dataFile.getAbsolutePath() + "\" could not be found.", e); + } + + return null; + } + + public static void copy(InputStream in, OutputStream out, int bufferSize) throws IOException { + BufferedOutputStream bOut = new BufferedOutputStream(out); + BufferedInputStream bIn = new BufferedInputStream(in); + byte[] buffer = new byte[bufferSize]; + int len = 0; + try { + do { + len = bIn.read(buffer); + if (len < 0) break; + bOut.write(buffer, 0, len); + } while (len == bufferSize); + } finally { + bOut.close(); + bIn.close(); + } + } + + public void error(ErrorCode code, String message) { + error(code, message, null); + } + + public void error(ErrorCode code, String message, Throwable t) { + if (showStacktrace && t != null) + t.printStackTrace(); + throw new AssertionError(message); + } + + public void setFormat(String format) { + this.format = format; + } +} Added: trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/xml/FastToXmlConverter.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,87 @@ +package org.openfast.examples.xml; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Iterator; +import org.openfast.Context; +import org.openfast.GroupValue; +import org.openfast.Message; +import org.openfast.SequenceValue; +import org.openfast.codec.FastDecoder; +import org.openfast.template.MessageTemplate; +import org.openfast.template.Sequence; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; +import com.thoughtworks.xstream.io.xml.XppDriver; + +public class FastToXmlConverter { + private final TemplateRegistry templateRegistry; + private final MessageTemplate elementTemplate; + private final int nodeNameIdx; + private final int attributesIdx; + private final int childrenIdx; + private final int valueIdx; + private final int attributeNameIdx; + private final int attributeValueIdx; + + public FastToXmlConverter() { + XMLMessageTemplateLoader xmlTemplateLoader = new XMLMessageTemplateLoader(); + xmlTemplateLoader.setLoadTemplateIdFromAuxId(true); + xmlTemplateLoader.load(this.getClass().getResourceAsStream("xmlOverFastTemplates.xml")); + this.templateRegistry = xmlTemplateLoader.getTemplateRegistry(); + this.elementTemplate = templateRegistry.get("element"); + this.nodeNameIdx = elementTemplate.getFieldIndex("nodeName"); + this.attributesIdx = elementTemplate.getFieldIndex("attributes"); + Sequence attributesSequence = elementTemplate.getSequence("attributes"); + this.attributeNameIdx = attributesSequence.getGroup().getFieldIndex("name"); + this.attributeValueIdx = attributesSequence.getGroup().getFieldIndex("value"); + this.childrenIdx = elementTemplate.getFieldIndex("children"); + this.valueIdx = elementTemplate.getFieldIndex("value"); + } + + public void convert(InputStream in, OutputStream out) { + try { + HierarchicalStreamWriter writer = new XppDriver().createWriter(out); + Context context = new Context(); + context.setTemplateRegistry(templateRegistry); + FastDecoder decoder = new FastDecoder(context, in); + Message message = decoder.readMessage(); + writeXml(writer, message); + } finally { + try { + in.close(); + } catch (IOException e) { + } + try { + out.close(); + } catch (IOException e) { + } + } + } + + private void writeXml(HierarchicalStreamWriter writer, GroupValue message) { + writer.startNode(message.getString(nodeNameIdx)); + if (message.isDefined(attributesIdx)) { + SequenceValue attributes = message.getSequence(attributesIdx); + Iterator iter = attributes.iterator(); + while (iter.hasNext()) { + GroupValue attr = (GroupValue) iter.next(); + writer.addAttribute(attr.getString(attributeNameIdx), attr.getString(attributeValueIdx)); + } + } + if (message.isDefined(valueIdx)) { + writer.setValue(message.getString(valueIdx)); + } + if (message.isDefined(childrenIdx)) { + SequenceValue children = message.getSequence(childrenIdx); + Iterator iter = children.iterator(); + while (iter.hasNext()) { + GroupValue child = (GroupValue) iter.next(); + writeXml(writer, child.getGroup(0)); + } + } + writer.endNode(); + } +} Added: trunk/src/main/java/org/openfast/examples/xml/FastToXmlMain.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/FastToXmlMain.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/xml/FastToXmlMain.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,60 @@ +package org.openfast.examples.xml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class FastToXmlMain { + /** + * @param args + */ + public static void main(String[] args) { + InputStream in = System.in; + OutputStream out = System.out; + File xmlFile = null; + File fastFile = null; + if (args.length >= 1) { + xmlFile = new File(args[0]); + assertTrue(xmlFile.exists(), "The file \"" + xmlFile.getAbsolutePath() + "\" does not exist."); + assertTrue(!xmlFile.isDirectory(), "The file \"" + xmlFile.getAbsolutePath() + "\" is a directory."); + assertTrue(xmlFile.canRead(), "The file \"" + xmlFile.getAbsolutePath() + "\" cannot be read."); + try { + in = new FileInputStream(xmlFile); + } catch (FileNotFoundException e) { + System.out.println(e.getMessage()); + System.exit(1); + } + } + if (args.length >= 2) { + fastFile = new File(args[1]); + assertTrue(!fastFile.isDirectory(), "The file \"" + fastFile.getAbsolutePath() + "\" is a directory."); + if (!fastFile.exists()) + try { + assertTrue(fastFile.createNewFile(), "The file \"" + fastFile.getAbsolutePath() + "\" could not be created."); + } catch (IOException e) { + System.out.println(e.getMessage()); + System.exit(1); + } + assertTrue(fastFile.canWrite(), "The file \"" + fastFile.getAbsolutePath() + "\" cannot be written to."); + try { + out = new FileOutputStream(fastFile); + } catch (FileNotFoundException e) { + System.out.println(e.getMessage()); + System.exit(1); + } + } + FastToXmlConverter converter = new FastToXmlConverter(); + converter.convert(in, out); + } + + private static void assertTrue(boolean condition, String error) { + if (!condition) { + System.out.println(error); + System.exit(1); + } + } +} Added: trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/xml/XmlToFastConverter.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,91 @@ +package org.openfast.examples.xml; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import org.openfast.Context; +import org.openfast.GroupValue; +import org.openfast.Message; +import org.openfast.MessageOutputStream; +import org.openfast.SequenceValue; +import org.openfast.template.MessageTemplate; +import org.openfast.template.Sequence; +import org.openfast.template.TemplateRegistry; +import org.openfast.template.loader.XMLMessageTemplateLoader; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; +import com.thoughtworks.xstream.io.xml.XppDriver; + +public class XmlToFastConverter { + private final TemplateRegistry templateRegistry; + private final MessageTemplate elementTemplate; + private final int nodeNameIdx; + private final int attributesIdx; + private final int childrenIdx; + private final int valueIdx; + private final int attributeNameIdx; + private final int attributeValueIdx; + private final Sequence childrenSequence; + private final Sequence attributesSequence; + + public XmlToFastConverter() { + XMLMessageTemplateLoader xmlTemplateLoader = new XMLMessageTemplateLoader(); + xmlTemplateLoader.setLoadTemplateIdFromAuxId(true); + xmlTemplateLoader.load(this.getClass().getResourceAsStream("xmlOverFastTemplates.xml")); + this.templateRegistry = xmlTemplateLoader.getTemplateRegistry(); + this.elementTemplate = templateRegistry.get("element"); + this.nodeNameIdx = elementTemplate.getFieldIndex("nodeName"); + this.attributesIdx = elementTemplate.getFieldIndex("attributes"); + this.childrenSequence = elementTemplate.getSequence("children"); + this.attributesSequence = elementTemplate.getSequence("attributes"); + this.attributeNameIdx = attributesSequence.getGroup().getFieldIndex("name"); + this.attributeValueIdx = attributesSequence.getGroup().getFieldIndex("value"); + this.childrenIdx = elementTemplate.getFieldIndex("children"); + this.valueIdx = elementTemplate.getFieldIndex("value"); + } + + public void convert(InputStream in, OutputStream out) { + try { + HierarchicalStreamReader reader = new XppDriver().createReader(in); + Context context = new Context(); + context.setTemplateRegistry(templateRegistry); + MessageOutputStream messageOut = new MessageOutputStream(out, context); + Message message = convertElementToMessage(reader); + messageOut.writeMessage(message); + } finally { + try { + in.close(); + } catch (IOException e) { + } + try { + out.close(); + } catch (IOException e) { + } + } + } + + private Message convertElementToMessage(HierarchicalStreamReader reader) { + Message message = new Message(elementTemplate); + message.setString(nodeNameIdx, reader.getNodeName()); + SequenceValue attributes = new SequenceValue(attributesSequence); + for (int i=0; i<reader.getAttributeCount(); i++) { + GroupValue attribute = new GroupValue(this.attributesSequence.getGroup()); + attribute.setString(attributeNameIdx, reader.getAttributeName(i)); + attribute.setString(attributeValueIdx, reader.getAttribute(i)); + attributes.add(attribute); + } + message.setFieldValue(attributesIdx, attributes); + if (reader.getValue() != null && !"".equals(reader.getValue())) + message.setString(valueIdx, reader.getValue()); + SequenceValue children = new SequenceValue(childrenSequence); + while (reader.hasMoreChildren()) { + reader.moveDown(); + GroupValue childValue = new GroupValue(childrenSequence.getGroup()); + Message child = convertElementToMessage(reader); + childValue.setFieldValue(0, child); + children.add(childValue); + reader.moveUp(); + } + message.setFieldValue(childrenIdx, children); + return message; + } +} Added: trunk/src/main/java/org/openfast/examples/xml/XmlToFastMain.java =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/XmlToFastMain.java (rev 0) +++ trunk/src/main/java/org/openfast/examples/xml/XmlToFastMain.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,71 @@ +package org.openfast.examples.xml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class XmlToFastMain { + /** + * @param args + */ + public static void main(String[] args) { + InputStream in = System.in; + OutputStream out = System.out; + File xmlFile = null; + File fastFile = null; + if (args.length >= 1) { + xmlFile = new File(args[0]); + assertTrue(xmlFile.exists(), "The file \"" + xmlFile.getAbsolutePath() + "\" does not exist."); + assertTrue(!xmlFile.isDirectory(), "The file \"" + xmlFile.getAbsolutePath() + "\" is a directory."); + assertTrue(xmlFile.canRead(), "The file \"" + xmlFile.getAbsolutePath() + "\" cannot be read."); + try { + in = new FileInputStream(xmlFile); + } catch (FileNotFoundException e) { + System.out.println(e.getMessage()); + System.exit(1); + } + } + if (args.length >= 2) { + fastFile = new File(args[1]); + assertTrue(!fastFile.isDirectory(), "The file \"" + fastFile.getAbsolutePath() + "\" is a directory."); + if (!fastFile.exists()) + try { + assertTrue(fastFile.createNewFile(), "The file \"" + fastFile.getAbsolutePath() + "\" could not be created."); + } catch (IOException e) { + System.out.println(e.getMessage()); + System.exit(1); + } + assertTrue(fastFile.canWrite(), "The file \"" + fastFile.getAbsolutePath() + "\" cannot be written to."); + try { + out = new FileOutputStream(fastFile); + } catch (FileNotFoundException e) { + System.out.println(e.getMessage()); + System.exit(1); + } + } + XmlToFastConverter converter = new XmlToFastConverter(); + converter.convert(in, out); + + if (xmlFile != null && fastFile != null) { + System.out.println("Original XML size: " + xmlFile.length() + " bytes"); + System.out.println("Compressed FAST size: " + fastFile.length() + " bytes"); + double compressionRate = fastFile.length() / (double) xmlFile.length(); + System.out.println(round(compressionRate * 100) + "% compression rate"); + } + } + + private static double round(double d) { + return ((int) (d * 100.0)) / 100.0; + } + + private static void assertTrue(boolean condition, String error) { + if (!condition) { + System.out.println(error); + System.exit(1); + } + } +} Added: trunk/src/main/java/org/openfast/examples/xml/xmlOverFastTemplates.xml =================================================================== --- trunk/src/main/java/org/openfast/examples/xml/xmlOverFastTemplates.xml (rev 0) +++ trunk/src/main/java/org/openfast/examples/xml/xmlOverFastTemplates.xml 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,13 @@ +<templates> + <template name="element" id="1"> + <string name="nodeName" key="names"><map/></string> + <sequence name="attributes" presence="optional"> + <string name="name" key="names"><map/></string> + <string name="value" key="values"><map/></string> + </sequence> + <sequence name="children" presence="optional"> + <templateRef/> + </sequence> + <string name="value" presence="optional"/> + </template> +</templates> \ No newline at end of file Added: trunk/src/main/java/org/openfast/template/MapScalar.java =================================================================== --- trunk/src/main/java/org/openfast/template/MapScalar.java (rev 0) +++ trunk/src/main/java/org/openfast/template/MapScalar.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,68 @@ +package org.openfast.template; + +import java.io.InputStream; +import org.openfast.BitVectorBuilder; +import org.openfast.BitVectorReader; +import org.openfast.ByteUtil; +import org.openfast.Context; +import org.openfast.FieldValue; +import org.openfast.IntegerValue; +import org.openfast.QName; +import org.openfast.ScalarValue; +import org.openfast.template.type.codec.TypeCodec; + +public class MapScalar extends Field { + private static final long serialVersionUID = 1L; + + public MapScalar(QName name, boolean optional, QName key) { + super(name, key, optional); + } + + public FieldValue createValue(String value) { + return null; + } + + public FieldValue decode(InputStream in, Group template, Context context, BitVectorReader presenceMapReader) { + boolean newDefinition = presenceMapReader.read(); + int index = TypeCodec.UINT.decode(in).toInt(); + if (index == 0) { + return ScalarValue.NULL; + } + if (!newDefinition) + return context.getCache(getKey()).lookup(index); + ScalarValue value = TypeCodec.ASCII.decode(in); + context.store(getKey(), index, value); + return value; + } + + public byte[] encode(FieldValue value, Group template, Context context, BitVectorBuilder presenceMapBuilder) { + if (context.getCache(getKey()).containsValue(value)) { + int index = context.getCache(getKey()).getIndex(value); + byte[] encoded = TypeCodec.UINT.encode(new IntegerValue(index)); + presenceMapBuilder.skip(); + return encoded; + } else { + int nextIndex = context.getCache(getKey()).store(value); + byte[] indexBytes = TypeCodec.UINT.encode(new IntegerValue(nextIndex)); + byte[] valueBytes = TypeCodec.ASCII.encode((ScalarValue) value); + presenceMapBuilder.set(); + return ByteUtil.combine(indexBytes, valueBytes); + } + } + + public String getTypeName() { + return null; + } + + public Class getValueType() { + return null; + } + + public boolean isPresenceMapBitSet(byte[] encoding, FieldValue fieldValue) { + return false; + } + + public boolean usesPresenceMapBit() { + return true; + } +} Added: trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java (rev 0) +++ trunk/src/main/java/org/openfast/template/loader/MapFieldParser.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,27 @@ +package org.openfast.template.loader; + +import org.openfast.QName; +import org.openfast.template.Field; +import org.openfast.template.MapScalar; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +public class MapFieldParser implements FieldParser { + public boolean canParse(Element element, ParsingContext context) { + NodeList children = element.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + String nodeName = children.item(i).getNodeName(); + if (nodeName.equals("map")) + return true; + } + return false; + } + + public Field parse(Element fieldNode, ParsingContext context) { + String key = fieldNode.hasAttribute("key") ? fieldNode.getAttribute("key") : null; + boolean optional = "optional".equals(fieldNode.getAttribute("presence")); + String name = fieldNode.getAttribute("name"); + QName qname = new QName(name, context.getNamespace()); + return new MapScalar(qname, optional, new QName(key)); + } +} Modified: trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java =================================================================== --- trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-08-05 14:33:23 UTC (rev 186) +++ trunk/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-10-09 14:23:28 UTC (rev 187) @@ -83,6 +83,7 @@ initialContext.addFieldParser(new StringParser()); initialContext.addFieldParser(new ByteVectorParser()); initialContext.addFieldParser(new TemplateRefParser()); + initialContext.addFieldParser(new MapFieldParser()); return initialContext; } Modified: trunk/src/main/java/org/openfast/template/operator/Operator.java =================================================================== --- trunk/src/main/java/org/openfast/template/operator/Operator.java 2008-08-05 14:33:23 UTC (rev 186) +++ trunk/src/main/java/org/openfast/template/operator/Operator.java 2008-10-09 14:23:28 UTC (rev 187) @@ -48,6 +48,18 @@ return false; } }; + + public static final Operator MAP = new Operator("map") { + private static final long serialVersionUID = 2L; + + public boolean usesDictionary() { + return false; + } + + public boolean shouldStoreValue(ScalarValue value) { + return false; + } + }; public static final Operator CONSTANT = new Operator("constant") { private static final long serialVersionUID = 1L; Added: trunk/src/main/java/org/openfast/util/Cache.java =================================================================== --- trunk/src/main/java/org/openfast/util/Cache.java (rev 0) +++ trunk/src/main/java/org/openfast/util/Cache.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,16 @@ +package org.openfast.util; + +import org.openfast.FieldValue; + +public interface Cache { + + boolean containsValue(FieldValue value); + + int getIndex(FieldValue value); + + int store(FieldValue value); + + void store(int index, FieldValue value); + + FieldValue lookup(int index); +} Added: trunk/src/main/java/org/openfast/util/UnboundedCache.java =================================================================== --- trunk/src/main/java/org/openfast/util/UnboundedCache.java (rev 0) +++ trunk/src/main/java/org/openfast/util/UnboundedCache.java 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,37 @@ +package org.openfast.util; + +import java.util.HashMap; +import java.util.Map; +import org.openfast.FieldValue; + +public class UnboundedCache implements Cache { + private int nextIndex = 1; + private final Map indexToValueMap = new HashMap(); + private final Map valueToIndexMap = new HashMap(); + + public int getIndex(FieldValue value) { + return ((Integer)valueToIndexMap.get(value)).intValue(); + } + + public int store(FieldValue value) { + Integer next = new Integer(nextIndex); + indexToValueMap.put(next, value); + valueToIndexMap.put(value, next); + nextIndex++; + return next.intValue(); + } + + public void store(int index, FieldValue value) { + Integer indexVal = new Integer(index); + indexToValueMap.put(indexVal, value); + valueToIndexMap.put(value, indexVal); + } + + public boolean containsValue(FieldValue value) { + return valueToIndexMap.containsKey(value); + } + + public FieldValue lookup(int index) { + return (FieldValue) indexToValueMap.get(new Integer(index)); + } +} Added: trunk/src/main/resources/consumer.bat =================================================================== --- trunk/src/main/resources/consumer.bat (rev 0) +++ trunk/src/main/resources/consumer.bat 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%\.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\commons-cli-1.1.jar +set MAIN=org.openfast.examples.consumer.Main + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/consumer.sh =================================================================== --- trunk/src/main/resources/consumer.sh (rev 0) +++ trunk/src/main/resources/consumer.sh 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/commons-cli-1.1.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.consumer.Main +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file Added: trunk/src/main/resources/fast2Xml.bat =================================================================== --- trunk/src/main/resources/fast2Xml.bat (rev 0) +++ trunk/src/main/resources/fast2Xml.bat 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%\.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\xstream-1.3.jar;%OPENFAST_HOME%\lib\xpp3_min-1.1.4c.jar +set MAIN=org.openfast.examples.xml.FastToXmlMain + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/fast2Xml.sh =================================================================== --- trunk/src/main/resources/fast2Xml.sh (rev 0) +++ trunk/src/main/resources/fast2Xml.sh 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/xstream-1.3.jar:$OPENFAST/lib/xpp3_min-1.1.4c.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.xml.FastToXmlMain +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file Added: trunk/src/main/resources/perf.bat =================================================================== --- trunk/src/main/resources/perf.bat (rev 0) +++ trunk/src/main/resources/perf.bat 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%\.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\commons-cli-1.1.jar +set MAIN=org.openfast.examples.performance.Main + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/perf.sh =================================================================== --- trunk/src/main/resources/perf.sh (rev 0) +++ trunk/src/main/resources/perf.sh 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST/lib/commons-cli-1.1.jar:$OPENFAST/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.performance.Main +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file Added: trunk/src/main/resources/xml2Fast.bat =================================================================== --- trunk/src/main/resources/xml2Fast.bat (rev 0) +++ trunk/src/main/resources/xml2Fast.bat 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,20 @@ +@echo off + +set OPENFAST_HOME=%~dp0%\.. +if not "%JAVA_HOME%" == "" goto GotJava +echo Please set the JAVA_HOME environment variable to the install location of a valid JRE. +exit /B 1 + +:GotJava + +if exist "%JAVA_HOME%\bin\java.exe" goto JavaGood +echo The JAVA_HOME environment variable is not set correctly. +exit /B 1 + +:JavaGood + +set JAVAEXE="%JAVA_HOME%\bin\java" +set CP=%OPENFAST_HOME%\${project.artifactId}-${project.version}.jar;%OPENFAST_HOME%\lib\xstream-1.3.jar;%OPENFAST_HOME%\lib\xpp3_min-1.1.4c.jar +set MAIN=org.openfast.examples.xml.XmlToFastMain + +%JAVAEXE% -classpath "%CP%" %MAIN% %* Added: trunk/src/main/resources/xml2Fast.sh =================================================================== --- trunk/src/main/resources/xml2Fast.sh (rev 0) +++ trunk/src/main/resources/xml2Fast.sh 2008-10-09 14:23:28 UTC (rev 187) @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ ! $JAVA_HOME ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +if [ ! -f $JAVA_HOME/bin/java ]; then +echo "Please set the JAVA_HOME environment variable to point to a valid Java install location." +exit 1 +fi + +OPENFAST_HOME=$( cd -P -- "$(dirname -- "$0")" && pwd -P)/.. +JAVA="$JAVA_HOME/bin/java" + +CLASSPATH=$OPENFAST_HOME/lib/xstream-1.3.jar:$OPENFAST_HOME/lib/xpp3_min-1.1.4c.jar:$OPENFAST_HOME/${project.artifactId}-${project.version}.jar +MAIN=org.openfast.examples.xml.XmlToFastMain +$JAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN $* \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-08-05 14:33:18
|
Revision: 186 http://openfast.svn.sourceforge.net/openfast/?rev=186&view=rev Author: jacob_northey Date: 2008-08-05 14:33:23 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Fixed warnings Modified Paths: -------------- trunk/src/main/java/org/openfast/NumericValue.java trunk/src/main/java/org/openfast/template/Field.java trunk/src/main/java/org/openfast/template/operator/AlwaysPresentOperatorCodec.java trunk/src/main/java/org/openfast/template/operator/OperatorCodec.java trunk/src/main/java/org/openfast/template/operator/OptionallyPresentOperatorCodec.java trunk/src/main/java/org/openfast/template/type/IntegerType.java trunk/src/main/java/org/openfast/template/type/SimpleType.java trunk/src/main/java/org/openfast/template/type/Type.java trunk/src/main/java/org/openfast/template/type/codec/IntegerCodec.java trunk/src/main/java/org/openfast/template/type/codec/NotStopBitEncodedTypeCodec.java trunk/src/main/java/org/openfast/template/type/codec/TypeCodec.java Modified: trunk/src/main/java/org/openfast/NumericValue.java =================================================================== --- trunk/src/main/java/org/openfast/NumericValue.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/NumericValue.java 2008-08-05 14:33:23 UTC (rev 186) @@ -21,6 +21,7 @@ package org.openfast; public abstract class NumericValue extends ScalarValue { + private static final long serialVersionUID = 1L; public abstract NumericValue increment(); public abstract NumericValue decrement(); public abstract NumericValue subtract(NumericValue priorValue); Modified: trunk/src/main/java/org/openfast/template/Field.java =================================================================== --- trunk/src/main/java/org/openfast/template/Field.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/Field.java 2008-08-05 14:33:23 UTC (rev 186) @@ -31,6 +31,7 @@ import org.openfast.QName; public abstract class Field implements Serializable { + private static final long serialVersionUID = 1L; protected final QName name; protected QName key; protected final boolean optional; Modified: trunk/src/main/java/org/openfast/template/operator/AlwaysPresentOperatorCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/operator/AlwaysPresentOperatorCodec.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/operator/AlwaysPresentOperatorCodec.java 2008-08-05 14:33:23 UTC (rev 186) @@ -26,6 +26,8 @@ import org.openfast.template.type.Type; public abstract class AlwaysPresentOperatorCodec extends OperatorCodec { + private static final long serialVersionUID = 1L; + protected AlwaysPresentOperatorCodec(Operator operator, Type[] types) { super(operator, types); } Modified: trunk/src/main/java/org/openfast/template/operator/OperatorCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/operator/OperatorCodec.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/operator/OperatorCodec.java 2008-08-05 14:33:23 UTC (rev 186) @@ -33,6 +33,7 @@ import org.openfast.util.Key; public abstract class OperatorCodec implements Serializable { + private static final long serialVersionUID = 1L; private static final Map OPERATOR_MAP = new HashMap(); protected static final OperatorCodec NONE_ALL = new NoneOperatorCodec(Operator.NONE, Type.ALL_TYPES); protected static final OperatorCodec CONSTANT_ALL = new ConstantOperatorCodec(Operator.CONSTANT, Type.ALL_TYPES); Modified: trunk/src/main/java/org/openfast/template/operator/OptionallyPresentOperatorCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/operator/OptionallyPresentOperatorCodec.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/operator/OptionallyPresentOperatorCodec.java 2008-08-05 14:33:23 UTC (rev 186) @@ -30,6 +30,8 @@ public abstract class OptionallyPresentOperatorCodec extends OperatorCodec { + private static final long serialVersionUID = 1L; + protected OptionallyPresentOperatorCodec(Operator operator, Type[] types) { super(operator, types); } Modified: trunk/src/main/java/org/openfast/template/type/IntegerType.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/IntegerType.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/type/IntegerType.java 2008-08-05 14:33:23 UTC (rev 186) @@ -29,7 +29,7 @@ import org.openfast.util.Util; public abstract class IntegerType extends SimpleType { - + private static final long serialVersionUID = 1L; protected final long minValue; protected final long maxValue; Modified: trunk/src/main/java/org/openfast/template/type/SimpleType.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/SimpleType.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/type/SimpleType.java 2008-08-05 14:33:23 UTC (rev 186) @@ -25,6 +25,7 @@ import org.openfast.template.type.codec.TypeCodec; public abstract class SimpleType extends Type { + private static final long serialVersionUID = 1L; private final TypeCodec codec; private final TypeCodec nullableCodec; Modified: trunk/src/main/java/org/openfast/template/type/Type.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/Type.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/type/Type.java 2008-08-05 14:33:23 UTC (rev 186) @@ -30,6 +30,7 @@ import org.openfast.util.Util; public abstract class Type implements Serializable { + private static final long serialVersionUID = 1L; private final static Map TYPE_NAME_MAP = new LinkedHashMap(); private final String name; Modified: trunk/src/main/java/org/openfast/template/type/codec/IntegerCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/IntegerCodec.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/type/codec/IntegerCodec.java 2008-08-05 14:33:23 UTC (rev 186) @@ -26,6 +26,8 @@ import org.openfast.util.Util; public abstract class IntegerCodec extends TypeCodec { + private static final long serialVersionUID = 1L; + protected IntegerCodec() {} /** Modified: trunk/src/main/java/org/openfast/template/type/codec/NotStopBitEncodedTypeCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/NotStopBitEncodedTypeCodec.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/type/codec/NotStopBitEncodedTypeCodec.java 2008-08-05 14:33:23 UTC (rev 186) @@ -23,6 +23,8 @@ import org.openfast.ScalarValue; public abstract class NotStopBitEncodedTypeCodec extends TypeCodec { + private static final long serialVersionUID = 1L; + public byte[] encode(ScalarValue value) { return encodeValue(value); } Modified: trunk/src/main/java/org/openfast/template/type/codec/TypeCodec.java =================================================================== --- trunk/src/main/java/org/openfast/template/type/codec/TypeCodec.java 2008-08-05 14:30:01 UTC (rev 185) +++ trunk/src/main/java/org/openfast/template/type/codec/TypeCodec.java 2008-08-05 14:33:23 UTC (rev 186) @@ -25,6 +25,7 @@ import org.openfast.ScalarValue; public abstract class TypeCodec implements Serializable { + private static final long serialVersionUID = 1L; protected static final byte STOP_BIT = (byte) 0x80; static final byte[] NULL_VALUE_ENCODING = new byte[] { STOP_BIT }; // Codec Definitions This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-08-05 14:30:12
|
Revision: 185 http://openfast.svn.sourceforge.net/openfast/?rev=185&view=rev Author: jacob_northey Date: 2008-08-05 14:30:01 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Removed generics from entity framework; implemented sequence codec Modified Paths: -------------- branches/openfast-2.x/core/pom.xml branches/openfast-2.x/core/src/main/java/org/openfast/Message.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicCodecFactory.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/FastTypeCodecs.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/FastEntityType.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleComposite.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastField.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastObject.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleGroup.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessage.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplate.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplateFactory.java branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleSequence.java branches/openfast-2.x/core/src/main/java/org/openfast/template/Composite.java branches/openfast-2.x/core/src/main/java/org/openfast/template/Field.java branches/openfast-2.x/core/src/main/java/org/openfast/template/Group.java branches/openfast-2.x/core/src/main/java/org/openfast/template/MessageTemplate.java branches/openfast-2.x/core/src/main/java/org/openfast/template/Sequence.java branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/FieldParser.java branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/GroupParser.java branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java branches/openfast-2.x/core/src/test/java/org/openfast/BasicMessageEncodingAcceptanceTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastLongOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastStringOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/IncrementLongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/template/loader/XMLMessageTemplateLoaderTest.java branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/simple/SimpleServer.java branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/xml/XmlToFastTool.java branches/openfast-2.x/util/src/main/java/com/lasalletech/openfast/util/csv/CsvParser.java branches/openfast-2.x/util/src/test/java/com/lasalletech/openfast/codec/operator/CacheStringCodecTest.java Added Paths: ----------- branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerPlaceholder.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/SequenceCodec.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/BasicSequenceCodecTest.java Removed Paths: ------------- branches/openfast-2.x/core/src/main/java/org/openfast/FastObject.java Modified: branches/openfast-2.x/core/pom.xml =================================================================== --- branches/openfast-2.x/core/pom.xml 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/pom.xml 2008-08-05 14:30:01 UTC (rev 185) @@ -82,7 +82,7 @@ <dependency> <groupId>com.lasalletech.entity</groupId> <artifactId>entity</artifactId> - <version>0.4.0-SNAPSHOT</version> + <version>1.0.0-SNAPSHOT</version> </dependency> </dependencies> </project> \ No newline at end of file Deleted: branches/openfast-2.x/core/src/main/java/org/openfast/FastObject.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/FastObject.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/FastObject.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,11 +0,0 @@ -package org.openfast; - -import org.lasalletech.entity.EObject; -import org.openfast.template.Composite; -import org.openfast.template.Field; -import org.openfast.template.MessageTemplate; -import org.openfast.template.Type; - -public interface FastObject extends EObject<Composite<FastObject>, FastObject, Type, Field, MessageTemplate, Message, Composite<FastObject>, FastObject> { - -} Modified: branches/openfast-2.x/core/src/main/java/org/openfast/Message.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/Message.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/Message.java 2008-08-05 14:30:01 UTC (rev 185) @@ -21,11 +21,8 @@ package org.openfast; import org.lasalletech.entity.EObject; -import org.openfast.template.Composite; -import org.openfast.template.Field; import org.openfast.template.MessageTemplate; -import org.openfast.template.Type; -public interface Message extends EObject<MessageTemplate, Message, Type, Field, MessageTemplate, Message, Composite<FastObject>, FastObject> { +public interface Message extends EObject { MessageTemplate getTemplate(); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicCodecFactory.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicCodecFactory.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicCodecFactory.java 2008-08-05 14:30:01 UTC (rev 185) @@ -2,10 +2,9 @@ import java.util.HashMap; import java.util.Map; -import org.openfast.FastObject; +import org.lasalletech.entity.EntityType; import org.openfast.dictionary.DictionaryRegistry; import org.openfast.fast.impl.FastImplementation; -import org.openfast.template.Composite; import org.openfast.template.Field; import org.openfast.template.MessageTemplate; import org.openfast.template.Scalar; @@ -34,12 +33,12 @@ public FieldCodec createCompositeCodec(MessageTemplate template, Field field, FastImplementation implementation, DictionaryRegistry dictionaryRegistry) { if (field.getType().isRepeating()) { - return new BasicSequenceCodec(template, field, implementation, dictionaryRegistry, this); + return new BasicSequenceCodec(template, field, implementation, dictionaryRegistry); } return createGroupCodec(template, field, implementation, dictionaryRegistry); } public FieldCodec createGroupCodec(MessageTemplate template, Field field, FastImplementation implementation, DictionaryRegistry dictionaryRegistry) { - return new BasicGroupCodec(template, (Composite<FastObject>) field, implementation, dictionaryRegistry); + return new BasicGroupCodec(template, ((EntityType)field.getType()).getEntity(), implementation, dictionaryRegistry); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java 2008-08-05 14:30:01 UTC (rev 185) @@ -2,13 +2,12 @@ import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; +import org.lasalletech.entity.Entity; import org.openfast.Context; -import org.openfast.FastObject; import org.openfast.dictionary.DictionaryRegistry; import org.openfast.error.FastConstants; import org.openfast.fast.FastTypes; import org.openfast.fast.impl.FastImplementation; -import org.openfast.template.Composite; import org.openfast.template.Field; import org.openfast.template.MessageTemplate; import org.openfast.template.Scalar; @@ -19,21 +18,21 @@ public class BasicGroupCodec implements GroupCodec { private final BitVectorCodec bitVectorCodec; private final FieldCodec[] fieldCodecs; - private final Composite<FastObject> composite; + private final Entity composite; - public BasicGroupCodec(MessageTemplate template, Composite<FastObject> composite, FastImplementation implementation, DictionaryRegistry dictionaryRegistry) { + public BasicGroupCodec(MessageTemplate template, Entity composite, FastImplementation implementation, DictionaryRegistry dictionaryRegistry) { this.bitVectorCodec = implementation.getTypeCodecRegistry().getBitVectorCodec(FastTypes.BIT_VECTOR); this.fieldCodecs = new FieldCodec[composite.getFieldCount()]; this.composite = composite; int index = 0; CodecFactory codecFactory = implementation.getCodecFactory(); - for (Field field : composite.getFields()) { + for (org.lasalletech.entity.Field field : composite.getFields()) { if (field instanceof Scalar) { Scalar scalar = (Scalar) field; fieldCodecs[index] = codecFactory.createScalarCodec(template, scalar, implementation, dictionaryRegistry); index++; } else { - fieldCodecs[index] = codecFactory.createCompositeCodec(template, field, implementation, dictionaryRegistry); + fieldCodecs[index] = codecFactory.createCompositeCodec(template, (Field) field, implementation, dictionaryRegistry); index++; } } @@ -46,7 +45,7 @@ public EObject decode(ByteBuffer buffer, BitVectorReader reader, Context context) { BitVector vector = bitVectorCodec.decode(buffer); BitVectorReader pmapReader = new BitVectorReader(vector); - FastObject o = composite.newObject(); + EObject o = composite.newObject(); for (int i=0; i<fieldCodecs.length; i++) { fieldCodecs[i].decode(o, i, buffer, pmapReader, context); } @@ -59,8 +58,6 @@ public void encode(EObject object, ByteBuffer buffer, Context context) { ByteBuffer temp = context.getTemporaryBuffer(); - int index = 0; - int pmapLen = 0; try { BitVectorBuilder pmapBuilder = new BitVectorBuilder(7); // TODO - calculate size of pmap builder for (int i=0; i<fieldCodecs.length; i++) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java 2008-08-05 14:30:01 UTC (rev 185) @@ -25,13 +25,13 @@ this.bitVectorCodec = implementation.getTypeCodecRegistry().getBitVectorCodec(FastTypes.BIT_VECTOR); this.fieldCodecs = new FieldCodec[template.getFieldCount()]; int index = 0; - for (Field field : template.getFields()) { + for (org.lasalletech.entity.Field field : template.getFields()) { if (field instanceof Scalar) { Scalar scalar = (Scalar) field; fieldCodecs[index] = codecFactory.createScalarCodec(template, scalar, implementation, dictionaryRegistry); index++; } else { - fieldCodecs[index] = codecFactory.createCompositeCodec(template, field, implementation, dictionaryRegistry); + fieldCodecs[index] = codecFactory.createCompositeCodec(template, (Field) field, implementation, dictionaryRegistry); index++; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java 2008-08-05 14:30:01 UTC (rev 185) @@ -5,6 +5,7 @@ import org.lasalletech.entity.EObjectList; import org.lasalletech.entity.EmptyEObject; import org.lasalletech.entity.EntityType; +import org.lasalletech.entity.simple.SimpleEObjectList; import org.openfast.Context; import org.openfast.dictionary.DictionaryRegistry; import org.openfast.fast.impl.FastImplementation; @@ -15,7 +16,7 @@ import org.openfast.util.BitVectorBuilder; import org.openfast.util.BitVectorReader; -public class BasicSequenceCodec implements FieldCodec { +public class BasicSequenceCodec implements SequenceCodec { public class IntEObjectWrapper extends EmptyEObject { private final int value; @@ -37,11 +38,11 @@ private final Scalar lengthScalar; private final BasicGroupCodec groupCodec; - public BasicSequenceCodec(MessageTemplate template, Field field, FastImplementation implementation, - DictionaryRegistry dictionaryRegistry, BasicCodecFactory basicCodecFactory) { + public BasicSequenceCodec(MessageTemplate template, Field field, FastImplementation implementation, DictionaryRegistry dictionaryRegistry) { lengthScalar = ((Sequence) ((EntityType)field.getType()).getEntity()).getLength(); - lengthCodec = basicCodecFactory.createScalarCodec(template, lengthScalar, implementation, dictionaryRegistry); - groupCodec = (BasicGroupCodec) basicCodecFactory.createGroupCodec(template, field, implementation, dictionaryRegistry); + CodecFactory codecFactory = implementation.getCodecFactory(); + lengthCodec = codecFactory.createScalarCodec(template, lengthScalar, implementation, dictionaryRegistry); + groupCodec = (BasicGroupCodec) codecFactory.createGroupCodec(template, field, implementation, dictionaryRegistry); } public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader pmapReader, Context context) { @@ -53,14 +54,31 @@ return; } EObjectList list = object.getList(index); - EObject wrapper = new IntEObjectWrapper(list.size()); - lengthCodec.encode(wrapper, 0, buffer, pmapBuilder, context); - for (EObject o : list) { - groupCodec.encode(o, buffer, context); - } + encode(list, buffer, pmapBuilder, context); } public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; } + + public EObjectList decode(ByteBuffer buffer, BitVectorReader pmapReader, Context context) { + IntegerPlaceholder placeholder = new IntegerPlaceholder(); + lengthCodec.decode(placeholder, 0, buffer, pmapReader, context); + if (placeholder.isNull()) + return null; + EObjectList list = new SimpleEObjectList(); + for (int i=0; i<placeholder.getValue(); i++) { + EObject object = groupCodec.decode(buffer, pmapReader, context); + list.add(object); + } + return list; + } + + public void encode(EObjectList objects, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { + EObject wrapper = new IntEObjectWrapper(objects.size()); + lengthCodec.encode(wrapper, 0, buffer, pmapBuilder, context); + for (EObject o : objects) { + groupCodec.encode(o, buffer, context); + } + } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java 2008-08-05 14:30:01 UTC (rev 185) @@ -47,7 +47,7 @@ } MessageTemplate template = context.getTemplate(templateId); MessageCodec codec = getCodec(templateId, template); - Message message = template.newObject(); + Message message = template.newMessage(); codec.decode(message, buffer, reader, context); if (messageHandlers.containsKey(message.getTemplate())) messageHandlers.get(message.getTemplate()).handleMessage(message, context, this); Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java 2008-08-05 14:30:01 UTC (rev 185) @@ -16,7 +16,6 @@ * @param context the current decoding context * @param field the field definition that this codec was built from */ - @SuppressWarnings("unchecked") void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader pmapReader, Context context); /** * @param object @@ -26,7 +25,6 @@ * @param context * @param field */ - @SuppressWarnings("unchecked") void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context); int getLength(ByteBuffer buffer, BitVectorReader reader); } Added: branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerPlaceholder.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerPlaceholder.java (rev 0) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerPlaceholder.java 2008-08-05 14:30:01 UTC (rev 185) @@ -0,0 +1,22 @@ +package org.openfast.codec; + +import org.lasalletech.entity.EmptyEObject; + +public class IntegerPlaceholder extends EmptyEObject { + private int value; + private boolean isNull = true; + + public int getValue() { + return value; + } + + public boolean isNull() { + return isNull; + } + + @Override + public void set(int index, int value) { + this.isNull = false; + this.value = value; + } +} Added: branches/openfast-2.x/core/src/main/java/org/openfast/codec/SequenceCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/SequenceCodec.java (rev 0) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/SequenceCodec.java 2008-08-05 14:30:01 UTC (rev 185) @@ -0,0 +1,12 @@ +package org.openfast.codec; + +import java.nio.ByteBuffer; +import org.lasalletech.entity.EObjectList; +import org.openfast.Context; +import org.openfast.util.BitVectorBuilder; +import org.openfast.util.BitVectorReader; + +public interface SequenceCodec extends FieldCodec { + void encode(EObjectList objects, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context); + EObjectList decode(ByteBuffer buffer, BitVectorReader pmapReader, Context context); +} Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java 2008-08-05 14:30:01 UTC (rev 185) @@ -6,7 +6,6 @@ import org.openfast.Fast; import org.openfast.codec.FieldCodec; import org.openfast.codec.IntegerCodec; -import org.openfast.template.Scalar; public class NoneIntegerCodec extends AlwaysPresentCodec implements FieldCodec { private IntegerCodec integerCodec; Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/FastTypeCodecs.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/FastTypeCodecs.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/FastTypeCodecs.java 2008-08-05 14:30:01 UTC (rev 185) @@ -4,7 +4,6 @@ import org.openfast.codec.IntegerCodec; import org.openfast.codec.LongCodec; import org.openfast.codec.StringCodec; -import org.openfast.codec.TypeCodec; import org.openfast.codec.ULongCodec; public class FastTypeCodecs { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/FastEntityType.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/FastEntityType.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/FastEntityType.java 2008-08-05 14:30:01 UTC (rev 185) @@ -3,18 +3,16 @@ import org.lasalletech.entity.EObject; import org.lasalletech.entity.Entity; import org.lasalletech.entity.EntityType; -import org.lasalletech.entity.QName; import org.openfast.template.Type; -@SuppressWarnings("unchecked") -public class FastEntityType<T extends Entity> extends EntityType<T> implements Type { +public class FastEntityType extends EntityType implements Type { private static final long serialVersionUID = 1L; - public FastEntityType(T entity) { + public FastEntityType(Entity entity) { this(entity, false); } - public FastEntityType(T entity, boolean repeating) { + public FastEntityType(Entity entity, boolean repeating) { super(entity, repeating); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleComposite.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleComposite.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleComposite.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,18 +1,14 @@ package org.openfast.simple; -import org.lasalletech.entity.EObject; import org.lasalletech.entity.EntityType; import org.lasalletech.entity.QName; import org.lasalletech.entity.simple.SimpleEntity; import org.openfast.template.Composite; -import org.openfast.template.Field; import org.openfast.template.Group; import org.openfast.template.Scalar; import org.openfast.template.Sequence; -import org.openfast.template.Type; -@SuppressWarnings("unchecked") -public abstract class SimpleComposite<O extends EObject> extends SimpleEntity<O, Type, Field> implements Composite<O> { +public abstract class SimpleComposite extends SimpleEntity implements Composite { public SimpleComposite(QName name) { super(name); } @@ -45,10 +41,10 @@ } public Group getGroup(int index) { - return ((EntityType<Group>)getField(index).getType()).getEntity(); + return (Group) ((EntityType)getField(index).getType()).getEntity(); } public Sequence getSequence(int index) { - return ((EntityType<Sequence>)getField(index).getType()).getEntity(); + return (Sequence) ((EntityType)getField(index).getType()).getEntity(); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastField.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastField.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastField.java 2008-08-05 14:30:01 UTC (rev 185) @@ -5,7 +5,7 @@ import org.openfast.template.Field; import org.openfast.template.Type; -public class SimpleFastField extends SimpleField<Type> implements Field { +public class SimpleFastField extends SimpleField implements Field { private static final long serialVersionUID = 1L; public SimpleFastField(String name, Type type) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastObject.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastObject.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleFastObject.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,15 +1,11 @@ package org.openfast.simple; +import org.lasalletech.entity.EObject; +import org.lasalletech.entity.Entity; import org.lasalletech.entity.simple.SimpleEObject; -import org.openfast.FastObject; -import org.openfast.Message; -import org.openfast.template.Composite; -import org.openfast.template.Field; -import org.openfast.template.MessageTemplate; -import org.openfast.template.Type; -public class SimpleFastObject extends SimpleEObject<Composite<FastObject>, FastObject, Type, Field, MessageTemplate, Message, Composite<FastObject>, FastObject> implements FastObject { - protected SimpleFastObject(Composite<FastObject> composite) { +public class SimpleFastObject extends SimpleEObject implements EObject { + protected SimpleFastObject(Entity composite) { super(composite); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleGroup.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleGroup.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleGroup.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,16 +1,16 @@ package org.openfast.simple; +import org.lasalletech.entity.EObject; import org.lasalletech.entity.QName; -import org.openfast.FastObject; import org.openfast.template.Group; -public class SimpleGroup extends SimpleComposite<FastObject> implements Group { +public class SimpleGroup extends SimpleComposite implements Group { public SimpleGroup(QName name) { super(name); } - public FastObject newObject() { + public EObject newObject() { return new SimpleFastObject(this); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessage.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessage.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessage.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,21 +1,17 @@ package org.openfast.simple; import org.lasalletech.entity.simple.SimpleEObject; -import org.openfast.FastObject; import org.openfast.Message; -import org.openfast.template.Composite; -import org.openfast.template.Field; import org.openfast.template.MessageTemplate; -import org.openfast.template.Type; -public class SimpleMessage extends SimpleEObject<MessageTemplate, Message, Type, Field, MessageTemplate, Message, Composite<FastObject>, FastObject> implements Message { +public class SimpleMessage extends SimpleEObject implements Message { protected SimpleMessage(MessageTemplate template) { super(template); } public MessageTemplate getTemplate() { - return getEntity(); + return (MessageTemplate) getEntity(); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplate.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplate.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplate.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,10 +1,11 @@ package org.openfast.simple; +import org.lasalletech.entity.EObject; import org.lasalletech.entity.QName; import org.openfast.Message; import org.openfast.template.MessageTemplate; -public class SimpleMessageTemplate extends SimpleComposite<Message> implements MessageTemplate { +public class SimpleMessageTemplate extends SimpleComposite implements MessageTemplate { public SimpleMessageTemplate(QName name) { super(name); } @@ -13,7 +14,11 @@ super(new QName(name)); } - public Message newObject() { + public EObject newObject() { + return newMessage(); + } + + public Message newMessage() { return new SimpleMessage(this); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplateFactory.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplateFactory.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleMessageTemplateFactory.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,7 +1,6 @@ package org.openfast.simple; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import org.lasalletech.entity.QName; import org.openfast.MessageTemplateBuilder; @@ -37,11 +36,11 @@ } public Field createField(Group group, boolean optional) { - return new SimpleFastField(group.getName(), new FastEntityType<Group>(group)); + return new SimpleFastField(group.getName(), new FastEntityType(group)); } public Field createField(Sequence sequence, boolean optional) { - return new SimpleFastField(sequence.getName(), new FastEntityType<Sequence>(sequence, true)); + return new SimpleFastField(sequence.getName(), new FastEntityType(sequence, true)); } public Group createGroup(QName name, Field[] fields) { @@ -63,8 +62,8 @@ for (Field field : fields) { if (field instanceof StaticTemplateReference) { StaticTemplateReference reference = (StaticTemplateReference) field; - for (Field referencedField : reference.getTemplate().getFields()) - newFields.add(referencedField); + for (org.lasalletech.entity.Field referencedField : reference.getTemplate().getFields()) + newFields.add((Field) referencedField); // if (staticTemplateReferences.isEmpty()) { // staticTemplateReferences = new LinkedList<StaticTemplateReference>(); // } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleSequence.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleSequence.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/simple/SimpleSequence.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,11 +1,11 @@ package org.openfast.simple; +import org.lasalletech.entity.EObject; import org.lasalletech.entity.QName; -import org.openfast.FastObject; import org.openfast.template.Scalar; import org.openfast.template.Sequence; -public class SimpleSequence extends SimpleComposite<FastObject> implements Sequence { +public class SimpleSequence extends SimpleComposite implements Sequence { private final Scalar length; public SimpleSequence(QName name, Scalar length) { @@ -13,7 +13,7 @@ this.length = length; } - public FastObject newObject() { + public EObject newObject() { return new SimpleFastObject(this); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/Composite.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/Composite.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/Composite.java 2008-08-05 14:30:01 UTC (rev 185) @@ -1,11 +1,9 @@ package org.openfast.template; -import org.lasalletech.entity.EObject; import org.lasalletech.entity.Entity; import org.lasalletech.entity.QName; -@SuppressWarnings("unchecked") -public interface Composite<O extends EObject> extends Entity<O, Field> { +public interface Composite extends Entity { Scalar getScalar(int index); Sequence getSequence(int index); Group getGroup(int index); Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/Field.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/Field.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/Field.java 2008-08-05 14:30:01 UTC (rev 185) @@ -24,7 +24,7 @@ import org.lasalletech.entity.Named; import org.lasalletech.entity.QName; -public interface Field extends org.lasalletech.entity.Field<Type>, Named, Serializable { +public interface Field extends org.lasalletech.entity.Field, Named, Serializable { boolean isOptional(); QName getKey(); void setKey(QName key); Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/Group.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/Group.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/Group.java 2008-08-05 14:30:01 UTC (rev 185) @@ -20,10 +20,8 @@ */ package org.openfast.template; -import org.lasalletech.entity.QName; -import org.openfast.FastObject; -public interface Group extends Composite<FastObject> { +public interface Group extends Composite { // private static final long serialVersionUID = 1L; // protected QName typeReference = null; Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/MessageTemplate.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/MessageTemplate.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/MessageTemplate.java 2008-08-05 14:30:01 UTC (rev 185) @@ -22,6 +22,7 @@ import org.openfast.Message; -public interface MessageTemplate extends Composite<Message> { +public interface MessageTemplate extends Composite { + Message newMessage(); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/Sequence.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/Sequence.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/Sequence.java 2008-08-05 14:30:01 UTC (rev 185) @@ -20,10 +20,9 @@ */ package org.openfast.template; -import org.openfast.FastObject; -public interface Sequence extends Composite<FastObject> { +public interface Sequence extends Composite { // private static final long serialVersionUID = 1L; // private final Group group; // private final Scalar length; Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/FieldParser.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/FieldParser.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/FieldParser.java 2008-08-05 14:30:01 UTC (rev 185) @@ -21,7 +21,6 @@ package org.openfast.template.loader; import org.openfast.template.Field; -import org.w3c.dom.Element; public interface FieldParser extends Parser<Field> { } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/GroupParser.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/GroupParser.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/GroupParser.java 2008-08-05 14:30:01 UTC (rev 185) @@ -52,7 +52,7 @@ return Fast.SIMPLE.createField(group, optional); } - protected static void parseMore(Element groupElement, Composite<?> group, ParsingContext context) { + protected static void parseMore(Element groupElement, Composite group, ParsingContext context) { group.setChildNamespace(context.getNamespace()); // if (groupElement.hasAttribute("id")) // group.setId(groupElement.getAttribute("id")); Modified: branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/main/java/org/openfast/template/loader/XMLMessageTemplateLoader.java 2008-08-05 14:30:01 UTC (rev 185) @@ -59,8 +59,6 @@ private boolean loadTemplateIdFromAuxId; - private final FastImplementation implementation; - private MessageTemplateFactory templateFactory = new SimpleMessageTemplateFactory(); public XMLMessageTemplateLoader() { @@ -73,7 +71,6 @@ public XMLMessageTemplateLoader(FastImplementation implementation, boolean namespaceAwareness) { this.namespaceAwareness = namespaceAwareness; - this.implementation = implementation; this.initialContext = createInitialContext(implementation); } Modified: branches/openfast-2.x/core/src/test/java/org/openfast/BasicMessageEncodingAcceptanceTest.java =================================================================== --- branches/openfast-2.x/core/src/test/java/org/openfast/BasicMessageEncodingAcceptanceTest.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/test/java/org/openfast/BasicMessageEncodingAcceptanceTest.java 2008-08-05 14:30:01 UTC (rev 185) @@ -15,7 +15,7 @@ FastEncoder encoder = new FastEncoder(loader.getTemplateRegistry()); ByteBuffer buffer = ByteBuffer.allocate(256); - Message message = template.newObject(); + Message message = template.newMessage(); message.set(0, 24); encoder.encode(buffer, message); assertEquals("11100000 10000001 10011000", buffer); Added: branches/openfast-2.x/core/src/test/java/org/openfast/codec/BasicSequenceCodecTest.java =================================================================== --- branches/openfast-2.x/core/src/test/java/org/openfast/codec/BasicSequenceCodecTest.java (rev 0) +++ branches/openfast-2.x/core/src/test/java/org/openfast/codec/BasicSequenceCodecTest.java 2008-08-05 14:30:01 UTC (rev 185) @@ -0,0 +1,53 @@ +package org.openfast.codec; + +import static org.openfast.template.ScalarBuilder.scalar; +import java.nio.ByteBuffer; +import org.lasalletech.entity.EObject; +import org.lasalletech.entity.EObjectList; +import org.lasalletech.entity.QName; +import org.lasalletech.entity.simple.SimpleEObjectList; +import org.openfast.Context; +import org.openfast.Fast; +import org.openfast.dictionary.BasicDictionaryRegistry; +import org.openfast.dictionary.DictionaryRegistry; +import org.openfast.fast.FastTypes; +import org.openfast.fast.impl.FastImplementation; +import org.openfast.template.Field; +import org.openfast.template.Scalar; +import org.openfast.template.Sequence; +import org.openfast.test.OpenFastTestCase; +import org.openfast.util.BitVectorBuilder; +import org.openfast.util.BitVectorReader; + +public class BasicSequenceCodecTest extends OpenFastTestCase { + FastImplementation impl = FastImplementation.getDefaultVersion(); + DictionaryRegistry dictionaryRegistry = new BasicDictionaryRegistry(impl.getDictionaryTypeRegistry()); + Scalar sequenceLengthField = scalar("length", FastTypes.U16).build(); + Sequence sequence = Fast.SIMPLE.createSequence(new QName(""), sequenceLengthField, new Field[] { + scalar("one", FastTypes.U16).build(), + scalar("two", FastTypes.ASCII).build() + }); + BasicSequenceCodec codec = new BasicSequenceCodec(null, Fast.SIMPLE.createField(sequence, false), impl, dictionaryRegistry); + Context context = new Context(); + ByteBuffer buffer = ByteBuffer.allocate(32); + + public void testDecode() { + ByteBuffer buffer = buffer("10000010 10000000 10000010 11000001 10000000 10000011 11000010"); + EObjectList objects = codec.decode(buffer, BitVectorReader.INFINITE_TRUE, context); + assertEquals(2, objects.size()); + } + + public void testEncode() { + EObjectList objects = new SimpleEObjectList(); + EObject object = sequence.newObject(); + object.set(0, 2); + object.set(1, "A"); + objects.add(object); + object = sequence.newObject(); + object.set(0, 3); + object.set(1, "B"); + objects.add(object); + codec.encode(objects, buffer, new BitVectorBuilder(7), context); + assertEquals("10000010 10000000 10000010 11000001 10000000 10000011 11000010", buffer); + } +} Modified: branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastLongOperatorTestHarness.java =================================================================== --- branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastLongOperatorTestHarness.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastLongOperatorTestHarness.java 2008-08-05 14:30:01 UTC (rev 185) @@ -18,7 +18,6 @@ import org.openfast.template.Field; import org.openfast.template.MessageTemplate; import org.openfast.template.Scalar; -import org.openfast.test.OpenFastTestCase; public class FastLongOperatorTestHarness { @@ -33,7 +32,6 @@ private final Scalar defaultScalar; private final DictionaryRegistry dictionaryRegistry; - @SuppressWarnings("unchecked") public FastLongOperatorTestHarness(Scalar defaultScalar, Scalar noDefaultScalar) { CodecFactory factory = FastImplementation.getDefaultVersion().getCodecFactory(); this.noDefaultScalar = noDefaultScalar; @@ -48,7 +46,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); codec.decodeEmpty(message, 0, context); Assert.assertFalse(message.isDefined(0)); } @@ -58,7 +56,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer encodedBytes = ByteBuffer.wrap(ByteUtil.convertBitStringToFastByteArray(encoded)); codec.decode(message, 0, encodedBytes, context); Assert.assertFalse(message.isDefined(0)); @@ -69,7 +67,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); codec.decodeEmpty(message, 0, context); Assert.assertEquals(expectedValue, message.getInt(0)); } @@ -80,7 +78,7 @@ initDictionary(getScalar(initialValue), dictionaryState); Scalar scalar = new Scalar(QName.NULL, FastTypes.U32, null, true); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { scalar }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer encodedBytes = ByteBuffer.wrap(ByteUtil.convertBitStringToFastByteArray(encoded)); codec.decode(message, 0, encodedBytes, context); Assert.assertEquals(expectedValue, message.getInt(0)); @@ -120,7 +118,7 @@ Scalar scalar = getScalar(initialValue); initDictionary(scalar, dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer buffer = ByteBuffer.allocate(32); codec.encode(message, 0, buffer, context); assertEquals(encoded, buffer); @@ -131,7 +129,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); message.set(0, value);ByteBuffer buffer = ByteBuffer.allocate(32);; codec.encode(message, 0, buffer, context); assertEquals(encoded, buffer); Modified: branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastOperatorTestHarness.java =================================================================== --- branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastOperatorTestHarness.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastOperatorTestHarness.java 2008-08-05 14:30:01 UTC (rev 185) @@ -18,8 +18,6 @@ import org.openfast.template.Field; import org.openfast.template.MessageTemplate; import org.openfast.template.Scalar; -import org.openfast.test.OpenFastTestCase; -import org.openfast.util.BitVector; public class FastOperatorTestHarness { @@ -34,7 +32,6 @@ private final Scalar defaultScalar; private final DictionaryRegistry dictionaryRegistry; - @SuppressWarnings("unchecked") public FastOperatorTestHarness(Scalar defaultScalar, Scalar noDefaultScalar) { CodecFactory factory = FastImplementation.getDefaultVersion().getCodecFactory(); this.noDefaultScalar = noDefaultScalar; @@ -49,7 +46,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); codec.decodeEmpty(message, 0, context); Assert.assertFalse(message.isDefined(0)); } @@ -59,7 +56,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer encodedBytes = ByteBuffer.wrap(ByteUtil.convertBitStringToFastByteArray(encoded)); codec.decode(message, 0, encodedBytes, context); Assert.assertFalse(message.isDefined(0)); @@ -70,7 +67,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); codec.decodeEmpty(message, 0, context); Assert.assertEquals(expectedValue, message.getInt(0)); } @@ -81,7 +78,7 @@ initDictionary(getScalar(initialValue), dictionaryState); Scalar scalar = new Scalar(QName.NULL, FastTypes.U32, null, true); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { scalar }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer encodedBytes = ByteBuffer.wrap(ByteUtil.convertBitStringToFastByteArray(encoded)); codec.decode(message, 0, encodedBytes, context); Assert.assertEquals(expectedValue, message.getInt(0)); @@ -120,7 +117,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer buffer = ByteBuffer.allocate(32); codec.encode(message, 0, buffer, context); assertEquals(encoded, buffer); @@ -131,7 +128,7 @@ Context context = new Context(); initDictionary(getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); message.set(0, value); ByteBuffer buffer = ByteBuffer.allocate(32); codec.encode(message, 0, buffer, context); Modified: branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastStringOperatorTestHarness.java =================================================================== --- branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastStringOperatorTestHarness.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastStringOperatorTestHarness.java 2008-08-05 14:30:01 UTC (rev 185) @@ -49,7 +49,7 @@ Context context = new Context(); initDictionary(context, getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); codec.decodeEmpty(message, 0, context); Assert.assertFalse(message.isDefined(0)); } @@ -59,7 +59,7 @@ Context context = new Context(); initDictionary(context, getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer encodedBytes = ByteBuffer.wrap(ByteUtil.convertBitStringToFastByteArray(encoded)); codec.decode(message, 0, encodedBytes, context); Assert.assertFalse(message.isDefined(0)); @@ -70,7 +70,7 @@ Context context = new Context(); initDictionary(context, getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); codec.decodeEmpty(message, 0, context); Assert.assertEquals(expectedValue, message.getString(0)); } @@ -80,7 +80,7 @@ Context context = new Context(); initDictionary(context, getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer encodedBytes = ByteBuffer.wrap(ByteUtil.convertBitStringToFastByteArray(encoded)); codec.decode(message, 0, encodedBytes, context); Assert.assertEquals(expectedValue, message.getString(0)); @@ -119,7 +119,7 @@ Context context = new Context(); initDictionary(context, getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); ByteBuffer buffer = ByteBuffer.allocate(32); codec.encode(message, 0, buffer, context); OpenFastTestCase.assertEquals(encoded, buffer); @@ -130,7 +130,7 @@ Context context = new Context(); initDictionary(context, getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); message.set(0, value); ByteBuffer buffer = ByteBuffer.allocate(32); codec.encode(message, 0, buffer, context); @@ -141,7 +141,7 @@ Context context = new Context(); initDictionary(context, getScalar(initialValue), dictionaryState); MessageTemplate template = Fast.SIMPLE.createMessageTemplate(QName.NULL, new Field[] { new Scalar(QName.NULL, FastTypes.U32, null, true) }); - Message message = template.newObject(); + Message message = template.newMessage(); message.set(0, value); ByteBuffer buffer = ByteBuffer.allocate(32); codec.encode(message, 0, buffer, context); Modified: branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/IncrementLongCodecTest.java =================================================================== --- branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/IncrementLongCodecTest.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/IncrementLongCodecTest.java 2008-08-05 14:30:01 UTC (rev 185) @@ -6,7 +6,6 @@ import static org.openfast.codec.operator.FastOperatorTestHarness.KEY; import static org.openfast.fast.FastTypes.U32; import static org.openfast.template.ScalarBuilder.scalar; -import org.openfast.fast.FastTypes; import org.openfast.template.Scalar; import org.openfast.test.OpenFastTestCase; Modified: branches/openfast-2.x/core/src/test/java/org/openfast/template/loader/XMLMessageTemplateLoaderTest.java =================================================================== --- branches/openfast-2.x/core/src/test/java/org/openfast/template/loader/XMLMessageTemplateLoaderTest.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/core/src/test/java/org/openfast/template/loader/XMLMessageTemplateLoaderTest.java 2008-08-05 14:30:01 UTC (rev 185) @@ -258,14 +258,14 @@ assertOperator(mantissa, mantissaOperator, mantissaKey, "", mantissaDefault, mantissaDictionary); } - private void assertScalarField(Composite<?> messageTemplate, int index, Type type, String name, String namespace) { + private void assertScalarField(Composite messageTemplate, int index, Type type, String name, String namespace) { Scalar scalar = messageTemplate.getScalar(index); assertEquals(new QName(name, namespace), scalar.getQName()); assertEquals(type, scalar.getType()); assertFalse(scalar.isOptional()); } - private void assertOperator(Composite<?> group, int index, String operator, String key, String namespace, String defaultValue, String dictionary) { + private void assertOperator(Composite group, int index, String operator, String key, String namespace, String defaultValue, String dictionary) { Scalar scalar = group.getScalar(index); assertOperator(scalar, operator, key, namespace, defaultValue, dictionary); } @@ -283,7 +283,7 @@ } } - private void assertOptionalScalarField(Composite<?> messageTemplate, int index, Type type, String name, String namespace) { + private void assertOptionalScalarField(Composite messageTemplate, int index, Type type, String name, String namespace) { Scalar scalar = messageTemplate.getScalar(index); assertEquals(new QName(name, namespace), scalar.getQName()); assertEquals(type, scalar.getType()); Modified: branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/simple/SimpleServer.java =================================================================== --- branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/simple/SimpleServer.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/simple/SimpleServer.java 2008-08-05 14:30:01 UTC (rev 185) @@ -58,8 +58,8 @@ final MessageTemplate disconnectTemplate = loader.getTemplateRegistry().get("disconnect"); final MessageTemplate resetTemplate = loader.getTemplateRegistry().get("reset"); final MessageTemplate testFileTemplate = loader.getTemplateRegistry().get("testFile"); - final Message disconnect = disconnectTemplate.newObject(); - final Message reset = resetTemplate.newObject(); + final Message disconnect = disconnectTemplate.newMessage(); + final Message reset = resetTemplate.newMessage(); final CsvParser csvParser = new CsvParser(loader.getTemplateRegistry()); ByteBuffer.setUseDirectBuffers(false); @@ -93,7 +93,7 @@ File[] csvFiles = getFiles("/simple/data"); for (File csvFile : csvFiles) { session.write(reset); - Message fileName = testFileTemplate.newObject(); + Message fileName = testFileTemplate.newMessage(); fileName.set(0, csvFile.getName()); session.write(fileName); List<Message> messages = csvParser.parse(new FileInputStream(csvFile)); Modified: branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/xml/XmlToFastTool.java =================================================================== --- branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/xml/XmlToFastTool.java 2008-08-01 15:03:07 UTC (rev 184) +++ branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/xml/XmlToFastTool.java 2008-08-05 14:30:01 UTC (rev 185) @@ -47,14 +47,13 @@ public void convert(File xmlFile) throws FileNotFoundException { HierarchicalStreamReader reader = new XppDriver().createReader(new FileInputStream(xmlFile)); - Message element = elementTemplate.newObject(); + Message element = elementTemplate.newMessage(); constructElementMessage(reader, element); ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024); encoder.encode(buffer, element); System.out.println(buffer); encoder.reset(); } - @SuppressWarnings("unchecked") private void constructElementMessage(HierarchicalStreamReader reader, EObject element) { element.set(0, reader.getNodeName()); if (reader.getAttributeCount() > 0) { Modified: branches/openfast-2.x/util/src/main/java/com/lasalletech/openfast/util/csv/CsvParser.java... [truncated message content] |
From: <ope...@li...> - 2008-08-01 15:03:05
|
Revision: 184 http://openfast.svn.sourceforge.net/openfast/?rev=184&view=rev Author: jacob_northey Date: 2008-08-01 15:03:07 +0000 (Fri, 01 Aug 2008) Log Message: ----------- Finished moving encoding methods over to use ByteBuffer Modified Paths: -------------- branches/openfast-2.x/core/src/main/java/org/openfast/Context.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastEncoder.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableAsciiStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableByteVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableDecimalCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableSignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableSignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableUnicodeStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableUnsignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableUnsignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/SignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/SignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/UnicodeStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/UnsignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/UnsignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/test/OpenFastTestCase.java branches/openfast-2.x/core/src/test/java/org/openfast/BasicMessageEncodingAcceptanceTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/BasicGroupCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastLongOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastStringOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/AsciiStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/BasicByteVectorCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/BasicDecimalCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/BasicULongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableAsciiStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableByteVectorCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableDecimalCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableSignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableSignedLongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableULongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableUnicodeStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableUnsignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableUnsignedLongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/SignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/SignedLongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/UnicodeStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/UnsignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/UnsignedLongCodecTest.java branches/openfast-2.x/examples/src/main/java/com/lasalletech/openfast/examples/xml/XmlToFastTool.java branches/openfast-2.x/nio/src/main/java/com/lasalletech/openfast/nio/mina/FastMessageEncoder.java branches/openfast-2.x/util/src/main/java/com/lasalletech/openfast/codec/operator/CacheStringCodec.java branches/openfast-2.x/util/src/test/java/com/lasalletech/openfast/codec/operator/CacheStringCodecTest.java Modified: branches/openfast-2.x/core/src/main/java/org/openfast/Context.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/Context.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/Context.java 2008-08-01 15:03:07 UTC (rev 184) @@ -20,6 +20,7 @@ */ package org.openfast; +import java.nio.ByteBuffer; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -47,7 +48,7 @@ private QName currentApplicationType; private List<TemplateRegisteredListener> listeners = Collections.emptyList(); private boolean traceEnabled; - private byte[] tempBuffer = new byte[1024 * 32]; // max 32 kB message size + private ByteBuffer tempBuffer = ByteBuffer.allocate(1024 * 32); // TODO - remove hardcoded max 32 kB message size public Context() { dictionaries.put("global", new BasicFastDictionary()); @@ -105,15 +106,16 @@ public boolean isTraceEnabled() { return traceEnabled; } - public byte[] getTemporaryBuffer() { + public ByteBuffer getTemporaryBuffer() { if (tempBuffer == null) throw new IllegalStateException("The temporary buffer was not checked in."); - byte[] pointer = tempBuffer; + ByteBuffer pointer = tempBuffer; tempBuffer = null; return pointer; } - public void discardTemporaryBuffer(byte[] buffer) { - tempBuffer = buffer; + public void discardTemporaryBuffer(ByteBuffer temp) { + temp.clear(); + tempBuffer = temp; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -53,27 +53,27 @@ return o; } - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { - return encode(object.getEObject(index), buffer, offset, context); + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { + encode(object.getEObject(index), buffer, context); } - public int encode(EObject object, byte[] buffer, int offset, Context context) { - byte[] temp = context.getTemporaryBuffer(); + public void encode(EObject object, ByteBuffer buffer, Context context) { + ByteBuffer temp = context.getTemporaryBuffer(); int index = 0; int pmapLen = 0; try { BitVectorBuilder pmapBuilder = new BitVectorBuilder(7); // TODO - calculate size of pmap builder for (int i=0; i<fieldCodecs.length; i++) { - index = fieldCodecs[i].encode(object, i, temp, index, pmapBuilder, context); + fieldCodecs[i].encode(object, i, temp, pmapBuilder, context); } - pmapLen = bitVectorCodec.encode(buffer, offset, pmapBuilder.getBitVector()); - System.arraycopy(temp, 0, buffer, offset + pmapLen, index); + bitVectorCodec.encode(buffer, pmapBuilder.getBitVector()); + temp.flip(); + buffer.put(temp); } catch (Throwable t) { context.getErrorHandler().error(FastConstants.GENERAL_ERROR, "Error occurred while encoding " + object, t); } finally { context.discardTemporaryBuffer(temp); } - return offset + pmapLen + index; } public int getLength(ByteBuffer buffer, BitVectorReader reader) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -37,30 +37,28 @@ } } - public int encode(byte[] buffer, int offset, Message message, Context context) { - byte[] temp = context.getTemporaryBuffer(); - int index = 0; - int pmapLen = 0; + public void encode(ByteBuffer buffer, Message message, Context context) { + ByteBuffer temp = context.getTemporaryBuffer(); try { BitVectorBuilder pmapBuilder = new BitVectorBuilder(7); // TODO - calculate size of pmap builder if (context.getLastTemplateId() != templateId) { - index = uintCodec.encode(temp, offset, templateId); + uintCodec.encode(temp, templateId); context.setLastTemplateId(templateId); pmapBuilder.set(); } else { pmapBuilder.skip(); } for (int i=0; i<fieldCodecs.length; i++) { - index = fieldCodecs[i].encode(message, i, temp, index, pmapBuilder, context); + fieldCodecs[i].encode(message, i, temp, pmapBuilder, context); } - pmapLen = bitVectorCodec.encode(buffer, offset, pmapBuilder.getBitVector()); - System.arraycopy(temp, 0, buffer, offset + pmapLen, index); + bitVectorCodec.encode(buffer, pmapBuilder.getBitVector()); + temp.flip(); + buffer.put(temp); } catch (Throwable t) { context.getErrorHandler().error(FastConstants.GENERAL_ERROR, "Error occurred while encoding " + message, t); } finally { context.discardTemporaryBuffer(temp); } - return offset + pmapLen + index; } public int getLength(ByteBuffer buffer, BitVectorReader reader, Context context) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -47,17 +47,17 @@ public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader pmapReader, Context context) { } - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { if (!object.isDefined(index)) { - return lengthCodec.encode(EObject.EMPTY, 0, buffer, offset, pmapBuilder, context); + lengthCodec.encode(EObject.EMPTY, 0, buffer, pmapBuilder, context); + return; } EObjectList list = object.getList(index); EObject wrapper = new IntEObjectWrapper(list.size()); - int newOffset = lengthCodec.encode(wrapper, 0, buffer, offset, pmapBuilder, context); + lengthCodec.encode(wrapper, 0, buffer, pmapBuilder, context); for (EObject o : list) { - newOffset = groupCodec.encode(o, buffer, newOffset, context); + groupCodec.encode(o, buffer, context); } - return newOffset; } public int getLength(ByteBuffer buffer, BitVectorReader reader) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -5,5 +5,5 @@ public interface BitVectorCodec extends TypeCodec { BitVector decode(ByteBuffer buffer); - int encode(byte[] buffer, int offset, BitVector vector); + void encode(ByteBuffer buffer, BitVector vector); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -5,5 +5,5 @@ public interface ByteVectorCodec extends TypeCodec { byte[] decode(ByteBuffer buffer); - int encode(byte[] buffer, int offset, byte[] bytes); + void encode(ByteBuffer buffer, byte[] bytes); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -5,5 +5,5 @@ public interface DecimalCodec extends TypeCodec { Decimal decode(ByteBuffer buffer); - int encode(byte[] buffer, int offset, Decimal value); + void encode(ByteBuffer buffer, Decimal value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastEncoder.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastEncoder.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastEncoder.java 2008-08-01 15:03:07 UTC (rev 184) @@ -1,5 +1,6 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.openfast.Context; @@ -30,13 +31,12 @@ codecFactory = implementation.getCodecFactory(); } - public int encode(byte[] buffer, int offset, Message message) { + public void encode(ByteBuffer buffer, Message message) { MessageCodec encoder = getEncoder(message); - int encoded = encoder.encode(buffer, offset, message, context); + encoder.encode(buffer, message, context); if (handlers.containsKey(message.getTemplate())) { handlers.get(message.getTemplate()).handleMessage(message, context, this); } - return encoded; } public void reset() { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -22,13 +22,11 @@ * @param object * @param index * @param buffer - * @param offset - * @param field * @param pmapBuilder * @param context - * @return the new offset in the encoded buffer + * @param field */ @SuppressWarnings("unchecked") - int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context); + void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context); int getLength(ByteBuffer buffer, BitVectorReader reader); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -6,6 +6,6 @@ import org.openfast.util.BitVectorReader; public interface GroupCodec extends FieldCodec { - int encode(EObject object, byte[] buffer, int offset, Context context); + void encode(EObject object, ByteBuffer buffer, Context context); EObject decode(ByteBuffer buffer, BitVectorReader pmapReader, Context context); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -9,9 +9,7 @@ * Encodes the value into the FAST encoded buffer * * @param buffer the destination for fast encoded bytes - * @param offset the index in the buffer to continue encoding * @param value the value to encode - * @return the new offset in the buffer */ - int encode(byte[] buffer, int offset, int value); + void encode(ByteBuffer buffer, int value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -4,5 +4,5 @@ public interface LongCodec extends TypeCodec { long decode(ByteBuffer buffer); - int encode(byte[] buffer, int offset, long value); + void encode(ByteBuffer buffer, long value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -6,7 +6,7 @@ import org.openfast.util.BitVectorReader; public interface MessageCodec { - int encode(byte[] buffer, int offset, Message message, Context context); + void encode(ByteBuffer buffer, Message message, Context context); void decode(Message message, ByteBuffer buffer, BitVectorReader reader, Context context); int getLength(ByteBuffer buffer, BitVectorReader reader, Context context); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -8,13 +8,13 @@ public abstract class SinglePresenceMapEntryFieldCodec implements FieldCodec { - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { - int newOffset = encode(object, index, buffer, offset, context); - if (newOffset == offset) + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { + int position = buffer.position(); + encode(object, index, buffer, context); + if (position == buffer.position()) pmapBuilder.skip(); else pmapBuilder.set(); - return newOffset; }; public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { @@ -29,7 +29,7 @@ return getLength(buffer); return 0; } - public abstract int encode(EObject object, int index, byte[] buffer, int offset, Context context); + public abstract void encode(EObject object, int index, ByteBuffer buffer, Context context); public abstract void decode(EObject object, int index, ByteBuffer buffer, Context context); public abstract void decodeEmpty(EObject object, int index, Context context); public abstract int getLength(ByteBuffer buffer); Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -4,5 +4,5 @@ public interface StringCodec extends TypeCodec { String decode(ByteBuffer buffer); - int encode(byte[] buffer, int offset, String value); + void encode(ByteBuffer buffer, String value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -5,5 +5,5 @@ public interface ULongCodec extends TypeCodec { ULong decode(ByteBuffer buffer); - int encode(byte[] buffer, int offset, ULong value); + void encode(ByteBuffer buffer, ULong value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -13,8 +13,8 @@ decode(object, index, buffer, context); } - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { - return encode(object, index, buffer, offset, context); + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { + encode(object, index, buffer, context); } public int getLength(ByteBuffer buffer, BitVectorReader reader) { @@ -24,5 +24,5 @@ public abstract int getLength(ByteBuffer buffer); public abstract void decode(EObject object, int index, ByteBuffer buffer, Context context); - public abstract int encode(EObject object, int index, byte[] buffer, int offset, Context context); + public abstract void encode(EObject object, int index, ByteBuffer buffer, Context context); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -7,7 +7,6 @@ import org.openfast.codec.FieldCodec; import org.openfast.codec.IntegerCodec; import org.openfast.dictionary.DictionaryEntry; -import org.openfast.template.Scalar; import org.openfast.template.operator.DictionaryOperator; public class CopyIntegerCodec extends DictionaryOperatorIntegerCodec implements FieldCodec { @@ -30,33 +29,31 @@ dictionaryEntry.set(value); } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { boolean dictionaryUndefined = !dictionaryEntry.isDefined(); boolean dictionaryNull = dictionaryEntry.isNull(); if (!object.isDefined(index)) { dictionaryEntry.setNull(); if ((dictionaryUndefined && !operator.hasDefaultValue()) || dictionaryNull) { - return offset; + return; } else { - buffer[offset] = Fast.NULL; - return offset+1; + buffer.put(Fast.NULL); } } int value = object.getInt(index); if (dictionaryUndefined) { if ((operator.hasDefaultValue() && initialValue == value)) { dictionaryEntry.set(value); - return offset; + return; } } else if (!dictionaryNull) { if (dictionaryEntry.getInt() == value) { dictionaryEntry.set(value); - return offset; + return; } } - int newOffset = integerCodec.encode(buffer, offset, value); + integerCodec.encode(buffer, value); dictionaryEntry.set(value); - return newOffset; } public void decodeEmpty(EObject object, int index, Context context) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -27,33 +27,32 @@ dictionaryEntry.set(value); } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { boolean dictionaryUndefined = !dictionaryEntry.isDefined(); boolean dictionaryNull = dictionaryEntry.isNull(); if (!object.isDefined(index)) { dictionaryEntry.setNull(); if ((dictionaryUndefined && !operator.hasDefaultValue()) || dictionaryNull) { - return offset; + return; } else { - buffer[offset] = Fast.NULL; - return offset + 1; + buffer.put(Fast.NULL); + return; } } String value = object.getString(index); if (dictionaryUndefined) { if ((operator.hasDefaultValue() && operator.getDefaultValue().equals(value))) { dictionaryEntry.set(value); - return offset; + return; } } else if (!dictionaryNull) { if (value.equals(dictionaryEntry.getString())) { dictionaryEntry.set(value); - return offset; + return; } } - int newOffset = stringCodec.encode(buffer, offset, value); + stringCodec.encode(buffer, value); dictionaryEntry.set(value); - return newOffset; } public void decodeEmpty(EObject object, int index, Context context) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -35,16 +35,15 @@ object.set(index, defaultValue); } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (object.isDefined(index)) { if (operator.hasDefaultValue() && object.getInt(index) == defaultValue) - return offset; - return integerCodec.encode(buffer, offset, object.getInt(index)); + return; + integerCodec.encode(buffer, object.getInt(index)); } else { if (!operator.hasDefaultValue()) - return offset; - buffer[offset] = Fast.NULL; - return offset + 1; + return; + buffer.put(Fast.NULL); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -33,16 +33,15 @@ object.set(index, operator.getDefaultValue()); } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (object.isDefined(index)) { if (operator.hasDefaultValue() && operator.getDefaultValue().equals(object.getString(index))) - return offset; - return stringCodec.encode(buffer, offset, object.getString(index)); + return; + stringCodec.encode(buffer, object.getString(index)); } else { if (!operator.hasDefaultValue()) - return offset; - buffer[offset] = Fast.NULL; - return offset + 1; + return; + buffer.put(Fast.NULL); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -51,16 +51,16 @@ public void decodeEmpty(EObject object, int index, Context context) {} - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)){ - buffer[offset] = Fast.NULL; - return offset + 1; + buffer.put(Fast.NULL); + return; } String value = object.getString(index); StringDelta diff = StringDelta.diff(value, getPreviousValue(object, context)); int subtractionLength = diff.getSubtractionLength(); - int newOffset = integerCodec.encode(buffer, offset, subtractionLength); + integerCodec.encode(buffer, subtractionLength); dictionaryEntry.set(value); - return stringCodec.encode(buffer, newOffset, diff.getValue()); + stringCodec.encode(buffer, diff.getValue()); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -43,14 +43,14 @@ public void decodeEmpty(EObject object, int index, Context context) {} - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)) { - buffer[offset] = NULL; - return offset + 1; + buffer.put(NULL); + return; } int value = object.getInt(index); int previousValue = getPreviousValue(object, context); dictionaryEntry.set(value); - return integerCodec.encode(buffer, offset, value - previousValue); + integerCodec.encode(buffer, value - previousValue); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -23,10 +23,10 @@ import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; +import org.openfast.Fast; import org.openfast.codec.FieldCodec; import org.openfast.codec.IntegerCodec; import org.openfast.dictionary.DictionaryEntry; -import org.openfast.error.FastConstants; import org.openfast.template.operator.DictionaryOperator; public final class IncrementIntegerCodec extends DictionaryOperatorIntegerCodec implements FieldCodec { @@ -71,43 +71,41 @@ return integerCodec.getLength(buffer); } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)) { - if (dictionaryEntry.isNull()) - return offset; - else { - return encodeNull(buffer, offset, context); - } + if (!dictionaryEntry.isNull()) + encodeNull(buffer); + return; } int value = object.getInt(index); if (dictionaryEntry.isNull()) { dictionaryEntry.set(value); - return integerCodec.encode(buffer, offset, value); + integerCodec.encode(buffer, value); + return; } if (!dictionaryEntry.isDefined()) { if (!operator.hasDefaultValue()) { dictionaryEntry.set(value); - return integerCodec.encode(buffer, offset, value); + integerCodec.encode(buffer, value); } else if (operator.hasDefaultValue() && value == initialValue) { dictionaryEntry.set(value); - return offset; } else { - return integerCodec.encode(buffer, offset, value); + integerCodec.encode(buffer, value); } + return; } int previousValue = dictionaryEntry.getInt(); if (value == previousValue + 1) { dictionaryEntry.set(value); - return offset; + return; } dictionaryEntry.set(value); - return integerCodec.encode(buffer, offset, value); + integerCodec.encode(buffer, value); } - private int encodeNull(byte[] buffer, int offset, Context context) { - buffer[offset] = FastConstants.NULL_BYTE; + private void encodeNull(ByteBuffer buffer) { + buffer.put(Fast.NULL); dictionaryEntry.setNull(); - return offset + 1; } } \ No newline at end of file Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -23,10 +23,10 @@ import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; +import org.openfast.Fast; import org.openfast.codec.FieldCodec; import org.openfast.codec.LongCodec; import org.openfast.dictionary.DictionaryEntry; -import org.openfast.error.FastConstants; import org.openfast.template.operator.DictionaryOperator; public final class IncrementLongCodec extends DictionaryOperatorLongCodec implements FieldCodec { @@ -67,43 +67,41 @@ return longCodec.getLength(buffer); } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)) { - if (dictionaryEntry.isNull()) - return offset; - else { - return encodeNull(buffer, offset, context); - } + if (!dictionaryEntry.isNull()) + encodeNull(buffer); + return; } long value = object.getLong(index); if (dictionaryEntry.isNull()) { dictionaryEntry.set(value); - return longCodec.encode(buffer, offset, value); + longCodec.encode(buffer, value); + return; } if (!dictionaryEntry.isDefined()) { if (!operator.hasDefaultValue()) { dictionaryEntry.set(value); - return longCodec.encode(buffer, offset, value); + longCodec.encode(buffer, value); } else if (operator.hasDefaultValue() && value == initialValue) { dictionaryEntry.set(value); - return offset; } else { - return longCodec.encode(buffer, offset, value); + longCodec.encode(buffer, value); } + return; } long previousValue = dictionaryEntry.getLong(); if (value == previousValue + 1) { dictionaryEntry.set(value); - return offset; + return; } dictionaryEntry.set(value); - return longCodec.encode(buffer, offset, value); + longCodec.encode(buffer, value); } - private int encodeNull(byte[] buffer, int offset, Context context) { - buffer[offset] = FastConstants.NULL_BYTE; + private void encodeNull(ByteBuffer buffer) { + buffer.put(Fast.NULL); dictionaryEntry.setNull(); - return offset + 1; } } \ No newline at end of file Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -23,11 +23,11 @@ import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; +import org.openfast.Fast; import org.openfast.ULong; import org.openfast.codec.FieldCodec; import org.openfast.codec.ULongCodec; import org.openfast.dictionary.DictionaryEntry; -import org.openfast.error.FastConstants; import org.openfast.template.operator.DictionaryOperator; public final class IncrementULongCodec extends DictionaryOperatorULongCodec implements FieldCodec { @@ -68,43 +68,40 @@ return longCodec.getLength(buffer); } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)) { - if (dictionaryEntry.isNull()) - return offset; - else { - return encodeNull(buffer, offset, context); - } + if (!dictionaryEntry.isNull()) + encodeNull(buffer); + return; } long value = object.getLong(index); if (dictionaryEntry.isNull()) { dictionaryEntry.set(value); - return longCodec.encode(buffer, offset, new ULong(value)); + longCodec.encode(buffer, new ULong(value)); } if (!dictionaryEntry.isDefined()) { if (!operator.hasDefaultValue()) { dictionaryEntry.set(value); - return longCodec.encode(buffer, offset, new ULong(value)); + longCodec.encode(buffer, new ULong(value)); } else if (operator.hasDefaultValue() && value == initialValue) { dictionaryEntry.set(value); - return offset; } else { - return longCodec.encode(buffer, offset, new ULong(value)); + longCodec.encode(buffer, new ULong(value)); } + return; } long previousValue = dictionaryEntry.getLong(); if (value == previousValue + 1) { dictionaryEntry.set(value); - return offset; + return; } dictionaryEntry.set(value); - return longCodec.encode(buffer, offset, new ULong(value)); + longCodec.encode(buffer, new ULong(value)); } - private int encodeNull(byte[] buffer, int offset, Context context) { - buffer[offset] = FastConstants.NULL_BYTE; + private void encodeNull(ByteBuffer buffer) { + buffer.put(Fast.NULL); dictionaryEntry.setNull(); - return offset + 1; } } \ No newline at end of file Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -16,8 +16,7 @@ public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { object.set(index, defaultValue); } - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { - return offset; + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { } public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -16,8 +16,7 @@ public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { object.set(index, defaultValue); } - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { - return offset; + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { } public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -24,11 +24,11 @@ } } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)) { - buffer[offset] = Fast.NULL; - return offset + 1; + buffer.put(Fast.NULL); + return; } - return integerCodec.encode(buffer, offset, object.getInt(index)); + integerCodec.encode(buffer, object.getInt(index)); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -23,11 +23,11 @@ } } - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)) { - buffer[offset] = Fast.NULL; - return offset + 1; + buffer.put(Fast.NULL); + return; } - return stringCodec.encode(buffer, offset, object.getString(index)); + stringCodec.encode(buffer, object.getString(index)); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -17,12 +17,11 @@ if (reader.read()) object.set(index, defaultValue); } - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { if (object.isDefined(index)) pmapBuilder.set(); else pmapBuilder.skip(); - return offset; } public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -17,12 +17,11 @@ if (reader.read()) object.set(index, defaultValue); } - public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, BitVectorBuilder pmapBuilder, Context context) { if (object.isDefined(index)) pmapBuilder.set(); else pmapBuilder.skip(); - return offset; } public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -38,11 +38,11 @@ } @Override - public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { + public void encode(EObject object, int index, ByteBuffer buffer, Context context) { if (!object.isDefined(index)) { - buffer[offset] = Fast.NULL; + buffer.put(Fast.NULL); dictionaryEntry.setNull(); - return offset+1; + return; } String value = object.getString(index); String baseValue = getBaseValue(); @@ -51,14 +51,15 @@ + " cannot be encoded by a tail operator with previous value " + baseValue); dictionaryEntry.set(value); if (value.length() > baseValue.length()) { - return stringCodec.encode(buffer, offset, value); + stringCodec.encode(buffer, value); + return; } int i = 0; while (i < value.length() && value.charAt(i) == baseValue.charAt(i)) i++; if (i == value.length()) - return offset; - return stringCodec.encode(buffer, offset, value.substring(i)); + return; + stringCodec.encode(buffer, value.substring(i)); } private String getBaseValue() { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -38,15 +38,15 @@ } } - public int encode(byte[] buffer, int offset, String value) { + public void encode(ByteBuffer buffer, String value) { if (value.length() == 0) { - buffer[offset] = Fast.NULL; - return offset + 1; + buffer.put(Fast.NULL); + return; } if (value.startsWith(Fast.ZERO_TERMINATOR)) { - buffer[offset] = 0; - buffer[offset+1] = Fast.STOP_BIT; - return offset + 2; + buffer.put((byte) 0); + buffer.put(Fast.STOP_BIT); + return; } ByteBuffer encoded; try { @@ -54,9 +54,8 @@ } catch (CharacterCodingException e) { throw new RuntimeException(e); } - encoded.get(buffer, offset, encoded.limit()); - buffer[encoded.limit() - 1 + offset] |= Fast.STOP_BIT; - return encoded.limit() + offset; + buffer.put(encoded); + buffer.array()[buffer.position()-1] |= Fast.STOP_BIT; } public boolean isNull(ByteBuffer buffer) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -14,14 +14,13 @@ return new BitVector(newBuffer); } - public int encode(byte[] buffer, int offset, BitVector vector) { + public void encode(ByteBuffer buffer, BitVector vector) { byte[] bytes = vector.getBytes(); int index = bytes.length - 1; while (index > 0 && (bytes[index] & VALUE_BITS) == 0) index--; - System.arraycopy(bytes, 0, buffer, offset, index + 1); - buffer[index] |= STOP_BIT; - return index+1; + buffer.put(bytes, 0, index + 1); + buffer.array()[buffer.position()-1] |= STOP_BIT; } public boolean isNull(ByteBuffer buffer) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -12,10 +12,9 @@ return bytes; } - public int encode(byte[] buffer, int offset, byte[] value) { - offset = UNSIGNED_INTEGER.encode(buffer, offset, value.length); - System.arraycopy(value, 0, buffer, offset, value.length); - return offset + value.length; + public void encode(ByteBuffer buffer, byte[] value) { + UNSIGNED_INTEGER.encode(buffer, value.length); + buffer.put(value); } public boolean isNull(ByteBuffer buffer) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -18,12 +18,12 @@ return new Decimal(mantissa, exponent); } - public int encode(byte[] buffer, int offset, Decimal value) { + public void encode(ByteBuffer buffer, Decimal value) { if (Math.abs(value.exponent) > 63) { Global.handleError(FastConstants.R1_LARGE_DECIMAL, "Encountered exponent of size " + value.exponent); } - int newOffset = SIGNED_INTEGER.encode(buffer, offset, value.exponent); - return SIGNED_LONG.encode(buffer, newOffset, value.mantissa); + SIGNED_INTEGER.encode(buffer, value.exponent); + SIGNED_LONG.encode(buffer, value.mantissa); } public int getLength(ByteBuffer buffer) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicULongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicULongCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicULongCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -10,8 +10,8 @@ return new ULong(value); } - public int encode(byte[] buffer, int offset, ULong value) { - return FastTypeCodecs.UNSIGNED_LONG.encode(buffer, offset, value.longValue()); + public void encode(ByteBuffer buffer, ULong value) { + FastTypeCodecs.UNSIGNED_LONG.encode(buffer, value.longValue()); } public boolean isNull(ByteBuffer buffer) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableAsciiStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableAsciiStringCodec.java 2008-07-31 19:58:27 UTC (rev 183) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableAsciiStringCodec.java 2008-08-01 15:03:07 UTC (rev 184) @@ -39,31 +39,24 @@ } } - public int encode(byte[] buffer, int offset, String value) { + public void encode(ByteBuffer buffer, String value) { if (value == null) { - buffer[offset] = Fast.NULL; - return offset + 1; + buffer.put(Fast.NULL); + return; } if (value.length() == 0) { - buffer[offset] = 0; - buffer[offset + 1] = Fast.STOP_BIT; - return offset + 2; + buffer.put((byte) 0); + buffer.put(Fast.STOP_BIT); + return; } if (value.startsWith(Fast.ZERO_TERMINATOR)) { - buffer[offset] = 0; - buffer[offset+1] = 0; - buffer[offset+2] = Fast.STOP_BIT; - return offset + 3; + buffer.put((byte) 0); + buffer.put((byte) 0); + buffer.put(Fast.STOP_BIT); + return; } - ByteBuffer encoded; - try { - encoded = encoder.encode(CharBuffer.wrap(value)); - } catch (CharacterCodingException e) { - throw new RuntimeException(e); - } - encoded.get(buffer, offset, encoded.limit()); - buffer[encoded.limit() - 1 + offset] |= Fast.STOP_BIT; - return encoded.limit() + offset; + encoder.encode(CharBuffer.wrap(value), buffer, true); + buffer.array()[buffer.position()-1] |= Fast.STOP_BIT; } public boolean isNull(ByteBuffer buffer) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableByteVectorCodec.java =================================================================== --- branches/... [truncated message content] |
From: <ope...@li...> - 2008-07-31 19:58:18
|
Revision: 183 http://openfast.svn.sourceforge.net/openfast/?rev=183&view=rev Author: jacob_northey Date: 2008-07-31 19:58:27 +0000 (Thu, 31 Jul 2008) Log Message: ----------- made a copy Added Paths: ----------- tags/openfast-2-byte-buffer-refactor/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-07-31 19:54:58
|
Revision: 182 http://openfast.svn.sourceforge.net/openfast/?rev=182&view=rev Author: jacob_northey Date: 2008-07-31 19:54:41 +0000 (Thu, 31 Jul 2008) Log Message: ----------- Replaced byte[] buffer, int offset with java.nio.ByteBuffer buffer Modified Paths: -------------- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/TypeCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/LengthEncodedTypeCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableAsciiStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableByteVectorCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableDecimalCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableSignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableSignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableULongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableUnicodeStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableUnsignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/NullableUnsignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/SignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/SignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/StopBitEncodedTypeCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/UnicodeStringCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/UnsignedIntegerCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/UnsignedLongCodec.java branches/openfast-2.x/core/src/main/java/org/openfast/test/OpenFastTestCase.java branches/openfast-2.x/core/src/test/java/org/openfast/BasicMessageDecodingAcceptanceTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/BasicGroupCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastLongOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/operator/FastStringOperatorTestHarness.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/AsciiStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/BasicByteVectorCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/BasicDecimalCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/BasicULongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableAsciiStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableByteVectorCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableDecimalCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableSignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableSignedLongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableULongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableUnicodeStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableUnsignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/NullableUnsignedLongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/SignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/SignedLongCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/UnicodeStringCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/UnsignedIntegerCodecTest.java branches/openfast-2.x/core/src/test/java/org/openfast/codec/type/UnsignedLongCodecTest.java branches/openfast-2.x/nio/src/main/java/com/lasalletech/openfast/nio/mina/FastMessageDecoder.java branches/openfast-2.x/util/src/main/java/com/lasalletech/openfast/codec/operator/CacheStringCodec.java branches/openfast-2.x/util/src/test/java/com/lasalletech/openfast/codec/operator/CacheStringCodecTest.java Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicGroupCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.FastObject; @@ -38,17 +39,16 @@ } } - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader pmapReader, Context context) { - return 0; + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader pmapReader, Context context) { + object.set(index, decode(buffer, pmapReader, context)); } - public EObject decode(byte[] buffer, int offset, BitVectorReader reader, Context context) { - BitVector vector = bitVectorCodec.decode(buffer, offset); + public EObject decode(ByteBuffer buffer, BitVectorReader reader, Context context) { + BitVector vector = bitVectorCodec.decode(buffer); BitVectorReader pmapReader = new BitVectorReader(vector); - offset += bitVectorCodec.getLength(buffer, offset); FastObject o = composite.newObject(); for (int i=0; i<fieldCodecs.length; i++) { - offset = fieldCodecs[i].decode(o, i, buffer, offset, pmapReader, context); + fieldCodecs[i].decode(o, i, buffer, pmapReader, context); } return o; } @@ -76,7 +76,7 @@ return offset + pmapLen + index; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { + public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicMessageCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.openfast.Context; import org.openfast.Message; import org.openfast.dictionary.DictionaryRegistry; @@ -16,7 +17,6 @@ private final int templateId; private final LongCodec uintCodec; private final BitVectorCodec bitVectorCodec; - @SuppressWarnings("unchecked") private final FieldCodec[] fieldCodecs; public BasicMessageCodec(int id, MessageTemplate template, FastImplementation implementation, DictionaryRegistry dictionaryRegistry, CodecFactory codecFactory) { @@ -37,7 +37,6 @@ } } - @SuppressWarnings("unchecked") public int encode(byte[] buffer, int offset, Message message, Context context) { byte[] temp = context.getTemporaryBuffer(); int index = 0; @@ -64,20 +63,17 @@ return offset + pmapLen + index; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader, Context context) { + public int getLength(ByteBuffer buffer, BitVectorReader reader, Context context) { int length = 0; for (int i=0; i<fieldCodecs.length; i++) { - int fieldLength = fieldCodecs[i].getLength(buffer, offset, reader); - length += fieldLength; - offset += fieldLength; + length += fieldCodecs[i].getLength(buffer, reader); } return length; } - @SuppressWarnings("unchecked") - public void decode(Message message, byte[] buffer, int offset, BitVectorReader reader, Context context) { + public void decode(Message message, ByteBuffer buffer, BitVectorReader reader, Context context) { for (int i=0; i<fieldCodecs.length; i++) { - offset = fieldCodecs[i].decode(message, i, buffer, offset, reader, context); + fieldCodecs[i].decode(message, i, buffer, reader, context); } } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BasicSequenceCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.lasalletech.entity.EObjectList; import org.lasalletech.entity.EmptyEObject; @@ -43,8 +44,7 @@ groupCodec = (BasicGroupCodec) basicCodecFactory.createGroupCodec(template, field, implementation, dictionaryRegistry); } - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader pmapReader, Context context) { - return 0; + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader pmapReader, Context context) { } public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { @@ -60,7 +60,7 @@ return newOffset; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { + public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/BitVectorCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,8 +1,9 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.openfast.util.BitVector; public interface BitVectorCodec extends TypeCodec { - BitVector decode(byte[] buffer, int offset); + BitVector decode(ByteBuffer buffer); int encode(byte[] buffer, int offset, BitVector vector); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/ByteVectorCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,7 +1,9 @@ package org.openfast.codec; +import java.nio.ByteBuffer; + public interface ByteVectorCodec extends TypeCodec { - byte[] decode(byte[] buffer, int offset); + byte[] decode(ByteBuffer buffer); int encode(byte[] buffer, int offset, byte[] bytes); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/DecimalCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,8 +1,9 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.openfast.Decimal; public interface DecimalCodec extends TypeCodec { - Decimal decode(byte[] buffer, int offset); + Decimal decode(ByteBuffer buffer); int encode(byte[] buffer, int offset, Decimal value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/FastDecoder.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.openfast.Context; @@ -35,13 +36,11 @@ uintCodec = implementation.getTypeCodecRegistry().getLongCodec(FastTypes.U32); } - public Message decode(byte[] buffer, int offset) { - BitVectorReader reader = new BitVectorReader(bitVectorCodec.decode(buffer, offset)); - offset += bitVectorCodec.getLength(buffer, offset); + public Message decode(ByteBuffer buffer) { + BitVectorReader reader = new BitVectorReader(bitVectorCodec.decode(buffer)); int templateId = 0; if (reader.read()) { - templateId = (int) uintCodec.decode(buffer, offset); - offset += uintCodec.getLength(buffer, offset); + templateId = (int) uintCodec.decode(buffer); context.setLastTemplateId(templateId); } else { templateId = context.getLastTemplateId(); @@ -49,7 +48,7 @@ MessageTemplate template = context.getTemplate(templateId); MessageCodec codec = getCodec(templateId, template); Message message = template.newObject(); - codec.decode(message, buffer, offset, reader, context); + codec.decode(message, buffer, reader, context); if (messageHandlers.containsKey(message.getTemplate())) messageHandlers.get(message.getTemplate()).handleMessage(message, context, this); return message; @@ -66,20 +65,20 @@ return codecRegistry.get(id); } - public int getNextMessageLength(byte[] buffer, final int offset) { - BitVectorReader reader = new BitVectorReader(bitVectorCodec.decode(buffer, offset)); - int newOffset = offset + bitVectorCodec.getLength(buffer, offset); + public int getNextMessageLength(ByteBuffer buffer) { + BitVectorReader reader = new BitVectorReader(bitVectorCodec.decode(buffer)); + int length = bitVectorCodec.getLength(buffer); int templateId = 0; if (reader.read()) { - templateId = (int) uintCodec.decode(buffer, newOffset); - newOffset += uintCodec.getLength(buffer, newOffset); + templateId = (int) uintCodec.decode(buffer); + length += uintCodec.getLength(buffer); } else { templateId = context.getLastTemplateId(); } MessageTemplate template = context.getTemplate(templateId); MessageCodec codec = getCodec(templateId, template); - newOffset += codec.getLength(buffer, newOffset, reader, context); - return newOffset - offset; + length += codec.getLength(buffer, reader, context); + return length; } public void registerMessageHandler(MessageTemplate template, MessageHandler messageHandler) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/FieldCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.util.BitVectorBuilder; @@ -11,14 +12,12 @@ * @param object the message to decode the field value into * @param index the field index to decode the value into * @param buffer the encoded source buffer - * @param offset the current index in the buffer - * @param field the field definition that this codec was built from * @param pmapReader the presence map reader * @param context the current decoding context - * @return the new offset in the decoded buffer + * @param field the field definition that this codec was built from */ @SuppressWarnings("unchecked") - int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader pmapReader, Context context); + void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader pmapReader, Context context); /** * @param object * @param index @@ -31,5 +30,5 @@ */ @SuppressWarnings("unchecked") int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context); - int getLength(byte[] buffer, int offset, BitVectorReader reader); + int getLength(ByteBuffer buffer, BitVectorReader reader); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/GroupCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,10 +1,11 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.util.BitVectorReader; public interface GroupCodec extends FieldCodec { int encode(EObject object, byte[] buffer, int offset, Context context); - EObject decode(byte[] buffer, int offset, BitVectorReader pmapReader, Context context); + EObject decode(ByteBuffer buffer, BitVectorReader pmapReader, Context context); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/IntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,7 +1,9 @@ package org.openfast.codec; +import java.nio.ByteBuffer; + public interface IntegerCodec extends TypeCodec { - int decode(byte[] buffer, int offset); + int decode(ByteBuffer buffer); /** * Encodes the value into the FAST encoded buffer Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/LongCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,6 +1,8 @@ package org.openfast.codec; +import java.nio.ByteBuffer; + public interface LongCodec extends TypeCodec { - long decode(byte[] buffer, int offset); + long decode(ByteBuffer buffer); int encode(byte[] buffer, int offset, long value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/MessageCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,11 +1,12 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.openfast.Context; import org.openfast.Message; import org.openfast.util.BitVectorReader; public interface MessageCodec { int encode(byte[] buffer, int offset, Message message, Context context); - void decode(Message message, byte[] buffer, int offset, BitVectorReader reader, Context context); - int getLength(byte[] buffer, int offset, BitVectorReader reader, Context context); + void decode(Message message, ByteBuffer buffer, BitVectorReader reader, Context context); + int getLength(ByteBuffer buffer, BitVectorReader reader, Context context); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/SinglePresenceMapEntryFieldCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.util.BitVectorBuilder; @@ -16,21 +17,20 @@ return newOffset; }; - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader reader, Context context) { + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { if (reader.read()) { - decode(object, index, buffer, offset, context); - return offset + getLength(buffer, offset); + decode(object, index, buffer, context); + } else { + decodeEmpty(object, index, context); } - decodeEmpty(object, index, context); - return offset; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { + public int getLength(ByteBuffer buffer, BitVectorReader reader) { if (reader.read()) - return getLength(buffer, offset); + return getLength(buffer); return 0; } public abstract int encode(EObject object, int index, byte[] buffer, int offset, Context context); - public abstract void decode(EObject object, int index, byte[] buffer, int offset, Context context); + public abstract void decode(EObject object, int index, ByteBuffer buffer, Context context); public abstract void decodeEmpty(EObject object, int index, Context context); - public abstract int getLength(byte[] buffer, int offset); + public abstract int getLength(ByteBuffer buffer); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/StringCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,6 +1,8 @@ package org.openfast.codec; +import java.nio.ByteBuffer; + public interface StringCodec extends TypeCodec { - String decode(byte[] buffer, int offset); + String decode(ByteBuffer buffer); int encode(byte[] buffer, int offset, String value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/TypeCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/TypeCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/TypeCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,6 +1,8 @@ package org.openfast.codec; +import java.nio.ByteBuffer; + public interface TypeCodec { - int getLength(byte[] buffer, int offset); - boolean isNull(byte[] buffer, int offset); + int getLength(ByteBuffer buffer); + boolean isNull(ByteBuffer buffer); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/ULongCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,8 +1,9 @@ package org.openfast.codec; +import java.nio.ByteBuffer; import org.openfast.ULong; public interface ULongCodec extends TypeCodec { - ULong decode(byte[] buffer, int offset); + ULong decode(ByteBuffer buffer); int encode(byte[] buffer, int offset, ULong value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/AlwaysPresentCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -8,21 +9,20 @@ public abstract class AlwaysPresentCodec implements FieldCodec { - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader reader, Context context) { - decode(object, index, buffer, offset, context); - return offset + getLength(buffer, offset); + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { + decode(object, index, buffer, context); } public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { return encode(object, index, buffer, offset, context); } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { - return getLength(buffer, offset); + public int getLength(ByteBuffer buffer, BitVectorReader reader) { + return getLength(buffer); } - public abstract int getLength(byte[] buffer, int offset); + public abstract int getLength(ByteBuffer buffer); - public abstract void decode(EObject object, int index, byte[] buffer, int offset, Context context); + public abstract void decode(EObject object, int index, ByteBuffer buffer, Context context); public abstract int encode(EObject object, int index, byte[] buffer, int offset, Context context); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyIntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -15,16 +16,16 @@ super(entry, operator, integerCodec); } - public int getLength(byte[] buffer, int offset) { - return integerCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return integerCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (integerCodec.isNull(buffer, offset)) { + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (integerCodec.isNull(buffer)) { dictionaryEntry.setNull(); return; } - int value = integerCodec.decode(buffer, offset); + int value = integerCodec.decode(buffer); object.set(index, value); dictionaryEntry.set(value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/CopyStringCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -12,16 +13,16 @@ super(dictionaryEntry, operator, stringCodec); } - public int getLength(byte[] buffer, int offset) { - return stringCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return stringCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (stringCodec.isNull(buffer, offset)) { + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (stringCodec.isNull(buffer)) { dictionaryEntry.setNull(); return; } - String value = stringCodec.decode(buffer, offset); + String value = stringCodec.decode(buffer); object.set(index, value); dictionaryEntry.set(value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultIntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -18,14 +19,14 @@ this.integerCodec = integerCodec; this.defaultValue = operator.hasDefaultValue() ? Integer.parseInt(operator.getDefaultValue()) : 0; } - public int getLength(byte[] buffer, int offset) { - return integerCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return integerCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (integerCodec.isNull(buffer, offset)) + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (integerCodec.isNull(buffer)) return; - int value = integerCodec.decode(buffer, offset); + int value = integerCodec.decode(buffer); object.set(index, value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DefaultStringCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -16,14 +17,14 @@ this.operator = operator; this.stringCodec = stringCodec; } - public int getLength(byte[] buffer, int offset) { - return stringCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return stringCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (stringCodec.isNull(buffer, offset)) + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (stringCodec.isNull(buffer)) return; - String value = stringCodec.decode(buffer, offset); + String value = stringCodec.decode(buffer); object.set(index, value); } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaAsciiCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -19,19 +20,18 @@ this.integerCodec = integerCodec; } - public int getLength(byte[] buffer, int offset) { - if (integerCodec.isNull(buffer, offset)) return 1; - int len = integerCodec.getLength(buffer, offset); - return len + stringCodec.getLength(buffer, offset + len); + public int getLength(ByteBuffer buffer) { + if (integerCodec.isNull(buffer)) return 1; + int len = integerCodec.getLength(buffer); + return len + stringCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (integerCodec.isNull(buffer, offset)) { + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (integerCodec.isNull(buffer)) { return; } - int subtractionLength = integerCodec.decode(buffer, offset); - offset += integerCodec.getLength(buffer, offset); - String delta = stringCodec.decode(buffer, offset); + int subtractionLength = integerCodec.decode(buffer); + String delta = stringCodec.decode(buffer); String value = new StringDelta(subtractionLength, delta).applyTo(getPreviousValue(object, context)); dictionaryEntry.set(value); object.set(index, value); Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/DeltaIntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,6 +1,7 @@ package org.openfast.codec.operator; import static org.openfast.Fast.NULL; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -15,15 +16,15 @@ super(entry, operator, integerDeltaCodec); } - public int getLength(byte[] buffer, int offset) { - return integerCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return integerCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (integerCodec.isNull(buffer, offset)) { + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (integerCodec.isNull(buffer)) { return; } - int delta = integerCodec.decode(buffer, offset); + int delta = integerCodec.decode(buffer); int previousValue = getPreviousValue(object, context); int newValue = delta + previousValue; object.set(index, newValue); Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementIntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -20,6 +20,7 @@ */ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -35,10 +36,10 @@ super(dictionaryEntry, operator, integerCodec); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (integerCodec.isNull(buffer, offset)) + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (integerCodec.isNull(buffer)) return; - int value = integerCodec.decode(buffer, offset); + int value = integerCodec.decode(buffer); dictionaryEntry.set(value); object.set(index, value); } @@ -66,8 +67,8 @@ } } - public int getLength(byte[] buffer, int offset) { - return integerCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return integerCodec.getLength(buffer); } public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementLongCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -20,6 +20,7 @@ */ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -36,10 +37,10 @@ } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (longCodec.isNull(buffer, offset)) + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (longCodec.isNull(buffer)) return; - long value = longCodec.decode(buffer, offset); + long value = longCodec.decode(buffer); dictionaryEntry.set(value); object.set(index, value); } @@ -62,8 +63,8 @@ } } - public int getLength(byte[] buffer, int offset) { - return longCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return longCodec.getLength(buffer); } public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/IncrementULongCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -20,6 +20,7 @@ */ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.ULong; @@ -37,10 +38,10 @@ } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (longCodec.isNull(buffer, offset)) + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (longCodec.isNull(buffer)) return; - ULong value = longCodec.decode(buffer, offset); + ULong value = longCodec.decode(buffer); dictionaryEntry.set(value.longValue()); object.set(index, value); } @@ -63,8 +64,8 @@ } } - public int getLength(byte[] buffer, int offset) { - return longCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return longCodec.getLength(buffer); } public int encode(EObject object, int index, byte[] buffer, int offset, Context context) { Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantIntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -12,14 +13,13 @@ public MandatoryConstantIntegerCodec(int defaultValue) { this.defaultValue = defaultValue; } - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader reader, Context context) { + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { object.set(index, defaultValue); - return offset; } public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { return offset; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { + public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/MandatoryConstantStringCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -12,14 +13,13 @@ public MandatoryConstantStringCodec(String defaultValue) { this.defaultValue = defaultValue; } - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader reader, Context context) { + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { object.set(index, defaultValue); - return offset; } public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { return offset; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { + public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneIntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -13,13 +14,13 @@ public NoneIntegerCodec(IntegerCodec integerCodec) { this.integerCodec = integerCodec; } - public int getLength(byte[] buffer, int offset) { - return integerCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return integerCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (!integerCodec.isNull(buffer, offset)) { - object.set(index, integerCodec.decode(buffer, offset)); + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (!integerCodec.isNull(buffer)) { + object.set(index, integerCodec.decode(buffer)); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/NoneStringCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -12,13 +13,13 @@ public NoneStringCodec(StringCodec stringCodec) { this.stringCodec = stringCodec; } - public int getLength(byte[] buffer, int offset) { - return stringCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return stringCodec.getLength(buffer); } - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (!stringCodec.isNull(buffer, offset)) { - object.set(index, stringCodec.decode(buffer, offset)); + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (!stringCodec.isNull(buffer)) { + object.set(index, stringCodec.decode(buffer)); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantIntegerCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -12,10 +13,9 @@ public OptionalConstantIntegerCodec(int defaultValue) { this.defaultValue = defaultValue; } - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader reader, Context context) { + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { if (reader.read()) object.set(index, defaultValue); - return offset; } public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { if (object.isDefined(index)) @@ -24,7 +24,7 @@ pmapBuilder.skip(); return offset; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { + public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/OptionalConstantStringCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.codec.FieldCodec; @@ -12,10 +13,9 @@ public OptionalConstantStringCodec(String defaultValue) { this.defaultValue = defaultValue; } - public int decode(EObject object, int index, byte[] buffer, int offset, BitVectorReader reader, Context context) { + public void decode(EObject object, int index, ByteBuffer buffer, BitVectorReader reader, Context context) { if (reader.read()) object.set(index, defaultValue); - return offset; } public int encode(EObject object, int index, byte[] buffer, int offset, BitVectorBuilder pmapBuilder, Context context) { if (object.isDefined(index)) @@ -24,7 +24,7 @@ pmapBuilder.skip(); return offset; } - public int getLength(byte[] buffer, int offset, BitVectorReader reader) { + public int getLength(ByteBuffer buffer, BitVectorReader reader) { return 0; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/operator/TailAsciiCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,5 +1,6 @@ package org.openfast.codec.operator; +import java.nio.ByteBuffer; import org.lasalletech.entity.EObject; import org.openfast.Context; import org.openfast.Fast; @@ -15,13 +16,13 @@ } @Override - public void decode(EObject object, int index, byte[] buffer, int offset, Context context) { - if (stringCodec.isNull(buffer, offset)) { + public void decode(EObject object, int index, ByteBuffer buffer, Context context) { + if (stringCodec.isNull(buffer)) { dictionaryEntry.setNull(); return; } String baseValue = getBaseValue(); - String encodedValue = stringCodec.decode(buffer, offset); + String encodedValue = stringCodec.decode(buffer); String value; if (encodedValue.length() > baseValue.length()) value = encodedValue; @@ -71,7 +72,7 @@ } @Override - public int getLength(byte[] buffer, int offset) { - return stringCodec.getLength(buffer, offset); + public int getLength(ByteBuffer buffer) { + return stringCodec.getLength(buffer); } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/AsciiStringCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -15,23 +15,23 @@ public class AsciiStringCodec extends StopBitEncodedTypeCodec implements StringCodec { private final CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder(); private final CharsetEncoder encoder = Charset.forName("US-ASCII").newEncoder(); - public String decode(byte[] buffer, int offset) { + public String decode(ByteBuffer bbuf) { CharBuffer decoded; try { - int length = getLength(buffer, offset); - if ((buffer[offset] & Fast.VALUE_BITS) == 0) { - if (!ByteUtil.isEmpty(buffer, offset, length)) { + int length = getLength(bbuf); + byte[] buffer = new byte[length]; + bbuf.get(buffer, 0, length); + if ((buffer[0] & Fast.VALUE_BITS) == 0) { + if (!ByteUtil.isEmpty(buffer, 0, length)) { Global.handleError(FastConstants.R9_STRING_OVERLONG, null); - offset++; } - else if (length > 1 && (buffer[offset+1] & Fast.VALUE_BITS) == 0) + else if (length > 1 && (buffer[1] & Fast.VALUE_BITS) == 0) return Fast.ZERO_TERMINATOR; else return ""; } - buffer[length + offset - 1] &= Fast.VALUE_BITS; // remove stop bit - decoded = decoder.decode(ByteBuffer.wrap(buffer, offset, length)); - buffer[length + offset - 1] |= Fast.STOP_BIT; // replace stop bit to prevent side effects + buffer[length - 1] &= Fast.VALUE_BITS; // remove stop bit + decoded = decoder.decode(ByteBuffer.wrap(buffer)); return decoded.toString(); } catch (CharacterCodingException e) { throw new RuntimeException(e); @@ -59,7 +59,7 @@ return encoded.limit() + offset; } - public boolean isNull(byte[] buffer, int offset) { + public boolean isNull(ByteBuffer buffer) { return false; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicBitVectorCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -2,14 +2,15 @@ import static org.openfast.Fast.STOP_BIT; import static org.openfast.Fast.VALUE_BITS; +import java.nio.ByteBuffer; import org.openfast.codec.BitVectorCodec; import org.openfast.util.BitVector; public class BasicBitVectorCodec extends StopBitEncodedTypeCodec implements BitVectorCodec { - public BitVector decode(byte[] buffer, int offset) { - int len = getLength(buffer, offset); + public BitVector decode(ByteBuffer buffer) { + int len = getLength(buffer); byte[] newBuffer = new byte[len]; - System.arraycopy(buffer, offset, newBuffer, 0, len); + buffer.get(newBuffer); return new BitVector(newBuffer); } @@ -23,7 +24,7 @@ return index+1; } - public boolean isNull(byte[] buffer, int offset) { + public boolean isNull(ByteBuffer buffer) { return false; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicByteVectorCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -1,14 +1,14 @@ package org.openfast.codec.type; import static org.openfast.codec.type.FastTypeCodecs.UNSIGNED_INTEGER; +import java.nio.ByteBuffer; import org.openfast.codec.ByteVectorCodec; public class BasicByteVectorCodec extends LengthEncodedTypeCodec implements ByteVectorCodec { - public byte[] decode(byte[] buffer, int offset) { - int length = UNSIGNED_INTEGER.decode(buffer, offset); - offset = UNSIGNED_INTEGER.getLength(buffer, offset) + offset; + public byte[] decode(ByteBuffer buffer) { + int length = UNSIGNED_INTEGER.decode(buffer); byte[] bytes = new byte[length]; - System.arraycopy(buffer, offset, bytes, 0, length); + buffer.get(bytes); return bytes; } @@ -18,7 +18,7 @@ return offset + value.length; } - public boolean isNull(byte[] buffer, int offset) { + public boolean isNull(ByteBuffer buffer) { return false; } } Modified: branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java =================================================================== --- branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java 2008-07-31 18:04:01 UTC (rev 181) +++ branches/openfast-2.x/core/src/main/java/org/openfast/codec/type/BasicDecimalCodec.java 2008-07-31 19:54:41 UTC (rev 182) @@ -2,19 +2,19 @@ import static org.openfast.codec.type.FastTypeCodecs.SIGNED_INTEGER; import static org.openfast.codec.type.FastTypeCodecs.SIGNED_LONG; +import java.nio.ByteBuffer; import org.openfast.Decimal; import org.openfast.Global; import org.openfast.codec.DecimalCodec; import org.openfast.error.FastConstants; public class BasicDecimalCodec implements DecimalCodec { - public Decimal decode(byte[] buffer, int offset) { - int newOffset = offset + SIGNED_INTEGER.getLength(buffer, offset); - int exponent = SIGNED_INTEGER.decode(buffer, offset); + public Decimal decode(ByteBuffer buffer) { + int exponent = SIGNED_INTEGER.decode(buffer); if (Math.abs(exponent) > 63) { Global.handleError(FastConstants.R1_LARGE_DECIMAL, "Encountered exponent of size " + exponent); } - long mantissa = SIGNED_LONG.decode(buffer, newOffset); + long mantissa = SIGNED_LONG.decode(buffer); return new Decimal(mantissa, exponent); } @@ -26,12 +26,11 @@ r... [truncated message content] |