Skip to content

Commit ef68083

Browse files
committed
Major rework if IR persistence and schema to reflect new meta attributes.
1 parent 01c6c0f commit ef68083

File tree

17 files changed

+1121
-615
lines changed

17 files changed

+1121
-615
lines changed

build.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,17 @@
259259
</java>
260260
</target>
261261

262+
<target name="examples:java:ir-gen"
263+
description="Generate codec stubs for SBE IR"
264+
depends="dist">
265+
<java classname="uk.co.real_logic.sbe.SbeTool">
266+
<classpath refid="examples.classpath"/>
267+
<sysproperty key="sbe.output.dir" value="${dir.main.src}"/>
268+
<sysproperty key="sbe.target.language" value="Java"/>
269+
<arg value="${dir.main.resources}/sbe-ir.xml"/>
270+
</java>
271+
</target>
272+
262273
<target name="cpp:examples:gen" depends="dist" description="Generate and run C++ generated code example">
263274
<mkdir dir="${dir.gen.cpp98}"/>
264275
<java classname="uk.co.real_logic.sbe.SbeTool">

main/java/uk/co/real_logic/sbe/ir/Decoder.java

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717

1818
import uk.co.real_logic.sbe.PrimitiveType;
1919
import uk.co.real_logic.sbe.codec.java.DirectBuffer;
20-
import uk.co.real_logic.sbe.ir.generated.SerializedFrame;
21-
import uk.co.real_logic.sbe.ir.generated.SerializedToken;
20+
import uk.co.real_logic.sbe.ir.generated.FrameCodec;
21+
22+
import uk.co.real_logic.sbe.ir.generated.TokenCodec;
2223

2324
import java.io.*;
2425
import java.nio.ByteBuffer;
@@ -27,14 +28,16 @@
2728
import java.util.ArrayList;
2829
import java.util.List;
2930

31+
import static uk.co.real_logic.sbe.ir.IrUtil.*;
32+
3033
public class Decoder implements Closeable
3134
{
3235
private static final int CAPACITY = 4096;
3336

3437
private final FileChannel channel;
3538
private final DirectBuffer directBuffer;
36-
private final SerializedFrame serializedFrame = new SerializedFrame();
37-
private final SerializedToken serializedToken = new SerializedToken();
39+
private final FrameCodec frameCodec = new FrameCodec();
40+
private final TokenCodec tokenCodec = new TokenCodec();
3841
private int offset;
3942
private final long size;
4043
private String irPackageName = null;
@@ -139,20 +142,19 @@ private int captureMessage(final List<Token> tokens, int index, final Intermedia
139142

140143
private void decodeFrame()
141144
{
142-
serializedFrame.wrapForDecode(directBuffer, offset, serializedFrame.blockLength(), 0);
145+
frameCodec.wrapForDecode(directBuffer, offset, frameCodec.blockLength(), 0);
143146

144-
if (serializedFrame.sbeIrVersion() != 0)
147+
if (frameCodec.sbeIrVersion() != 0)
145148
{
146-
throw new IllegalStateException("Unknown SBE version: " + serializedFrame.sbeIrVersion());
149+
throw new IllegalStateException("Unknown SBE version: " + frameCodec.sbeIrVersion());
147150
}
148151

149-
final byte[] byteArray = new byte[1024];
150-
151-
irVersion = serializedFrame.schemaVersion();
152+
final byte[] buffer = new byte[1024];
152153

153-
irPackageName = new String(byteArray, 0, serializedFrame.getPackageVal(byteArray, 0, byteArray.length));
154+
irVersion = frameCodec.schemaVersion();
155+
irPackageName = new String(buffer, 0, frameCodec.getPackageVal(buffer, 0, buffer.length));
154156

155-
offset += serializedFrame.size();
157+
offset += frameCodec.size();
156158
}
157159

158160
private Token decodeToken()
@@ -161,32 +163,46 @@ private Token decodeToken()
161163
final Token.Builder tokenBuilder = new Token.Builder();
162164
final Encoding.Builder encBuilder = new Encoding.Builder();
163165

164-
final byte[] byteArray = new byte[1024];
166+
final byte[] buffer = new byte[1024];
167+
168+
tokenCodec.wrapForDecode(directBuffer, offset, tokenCodec.blockLength(), 0);
169+
170+
tokenBuilder.offset(tokenCodec.tokenOffset())
171+
.size(tokenCodec.tokenSize())
172+
.schemaId(tokenCodec.schemaId())
173+
.version(tokenCodec.tokenVersion())
174+
.signal(mapSignal(tokenCodec.signal()));
175+
176+
final PrimitiveType type = mapPrimitiveType(tokenCodec.primitiveType());
165177

166-
serializedToken.wrapForDecode(directBuffer, offset, serializedToken.blockLength(), 0);
178+
encBuilder.primitiveType(mapPrimitiveType(tokenCodec.primitiveType()))
179+
.byteOrder(mapByteOrder(tokenCodec.byteOrder()))
180+
.presence(mapPresence(tokenCodec.presence()));
167181

168-
tokenBuilder.offset(serializedToken.tokenOffset())
169-
.size(serializedToken.tokenSize())
170-
.schemaId(serializedToken.schemaID())
171-
.version(serializedToken.tokenVersion())
172-
.signal(IrUtil.signal(serializedToken.signal()));
182+
tokenBuilder.name(new String(buffer, 0, tokenCodec.getName(buffer, 0, buffer.length), TokenCodec.nameCharacterEncoding()));
173183

174-
final PrimitiveType type = IrUtil.primitiveType(serializedToken.primitiveType());
184+
encBuilder.constVal(get(valBuffer, type, tokenCodec.getConstVal(valArray, 0, valArray.length)));
185+
encBuilder.minVal(get(valBuffer, type, tokenCodec.getMinVal(valArray, 0, valArray.length)));
186+
encBuilder.maxVal(get(valBuffer, type, tokenCodec.getMaxVal(valArray, 0, valArray.length)));
187+
encBuilder.nullVal(get(valBuffer, type, tokenCodec.getNullVal(valArray, 0, valArray.length)));
175188

176-
encBuilder.primitiveType(type)
177-
.byteOrder(IrUtil.byteOrder(serializedToken.byteOrder()));
189+
final String characterEncoding = new String(buffer, 0, tokenCodec.getCharacterEncoding(buffer, 0, buffer.length),
190+
TokenCodec.characterEncodingCharacterEncoding());
191+
encBuilder.characterEncoding(characterEncoding.isEmpty() ? null : characterEncoding);
178192

179-
tokenBuilder.name(new String(byteArray, 0, serializedToken.getName(byteArray, 0, byteArray.length), SerializedToken.nameCharacterEncoding()));
193+
final String epoch = new String(buffer, 0, tokenCodec.getEpoch(buffer, 0, buffer.length),
194+
TokenCodec.epochCharacterEncoding());
195+
encBuilder.epoch(epoch.isEmpty() ? null : epoch);
180196

181-
encBuilder.constVal(IrUtil.getVal(valBuffer, type, serializedToken.getConstVal(valArray, 0, valArray.length)));
182-
encBuilder.minVal(IrUtil.getVal(valBuffer, type, serializedToken.getMinVal(valArray, 0, valArray.length)));
183-
encBuilder.maxVal(IrUtil.getVal(valBuffer, type, serializedToken.getMaxVal(valArray, 0, valArray.length)));
184-
encBuilder.nullVal(IrUtil.getVal(valBuffer, type, serializedToken.getNullVal(valArray, 0, valArray.length)));
197+
final String timeUnit = new String(buffer, 0, tokenCodec.getTimeUnit(buffer, 0, buffer.length),
198+
TokenCodec.timeUnitCharacterEncoding());
199+
encBuilder.timeUnit(timeUnit.isEmpty() ? null : timeUnit);
185200

186-
final int charEncodingSize = serializedToken.getCharacterEncoding(byteArray, 0, byteArray.length);
187-
encBuilder.characterEncoding(new String(byteArray, 0, charEncodingSize, SerializedToken.characterEncodingCharacterEncoding()));
201+
final String semanticType = new String(buffer, 0, tokenCodec.getSemanticType(buffer, 0, buffer.length),
202+
TokenCodec.semanticTypeCharacterEncoding());
203+
encBuilder.semanticType(semanticType.isEmpty() ? null : semanticType);
188204

189-
offset += serializedToken.size();
205+
offset += tokenCodec.size();
190206

191207
return tokenBuilder.encoding(encBuilder.build()).build();
192208
}

main/java/uk/co/real_logic/sbe/ir/Encoder.java

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@
1717

1818
import uk.co.real_logic.sbe.PrimitiveType;
1919
import uk.co.real_logic.sbe.codec.java.DirectBuffer;
20-
import uk.co.real_logic.sbe.ir.generated.SerializedFrame;
21-
import uk.co.real_logic.sbe.ir.generated.SerializedToken;
20+
import uk.co.real_logic.sbe.ir.generated.FrameCodec;
21+
import uk.co.real_logic.sbe.ir.generated.TokenCodec;
2222
import uk.co.real_logic.sbe.util.Verify;
2323

2424
import java.io.*;
2525
import java.nio.ByteBuffer;
2626
import java.nio.channels.FileChannel;
2727
import java.util.List;
2828

29+
import static uk.co.real_logic.sbe.ir.IrUtil.*;
30+
2931
public class Encoder implements Closeable
3032
{
3133
private static final int CAPACITY = 4096;
@@ -35,8 +37,8 @@ public class Encoder implements Closeable
3537
private final ByteBuffer buffer;
3638
private final DirectBuffer directBuffer;
3739
private final IntermediateRepresentation ir;
38-
private final SerializedFrame serializedFrame = new SerializedFrame();
39-
private final SerializedToken serializedToken = new SerializedToken();
40+
private final FrameCodec frameCodec = new FrameCodec();
41+
private final TokenCodec tokenCodec = new TokenCodec();
4042
private final byte[] valArray = new byte[CAPACITY];
4143
private final DirectBuffer valBuffer = new DirectBuffer(valArray);
4244
private int totalSize = 0;
@@ -115,40 +117,51 @@ else if (resultBuffer != null)
115117

116118
private int encodeFrame()
117119
{
118-
serializedFrame.wrapForEncode(directBuffer, 0)
119-
.sbeIrVersion(0)
120-
.schemaVersion(ir.version());
120+
frameCodec.wrapForEncode(directBuffer, 0)
121+
.sbeIrVersion(0)
122+
.schemaVersion(ir.version());
121123

122-
serializedFrame.putPackageVal(ir.packageName().getBytes(), 0, ir.packageName().getBytes().length);
124+
frameCodec.putPackageVal(ir.packageName().getBytes(), 0, ir.packageName().getBytes().length);
123125

124-
return serializedFrame.size();
126+
return frameCodec.size();
125127
}
126128

127129
private int encodeToken(final Token token)
128130
throws UnsupportedEncodingException
129131
{
130-
final PrimitiveType type = token.encoding().primitiveType();
132+
final Encoding encoding = token.encoding();
133+
final PrimitiveType type = encoding.primitiveType();
134+
135+
tokenCodec.wrapForEncode(directBuffer, 0)
136+
.tokenOffset(token.offset())
137+
.tokenSize(token.size())
138+
.schemaId(token.schemaId())
139+
.tokenVersion(token.version())
140+
.signal(mapSignal(token.signal()))
141+
.primitiveType(mapPrimitiveType(type))
142+
.byteOrder(mapByteOrder(encoding.byteOrder()))
143+
.presence(mapPresence(encoding.presence()));
144+
145+
final byte[] nameBytes = token.name().getBytes(TokenCodec.nameCharacterEncoding());
146+
tokenCodec.putName(nameBytes, 0, nameBytes.length);
147+
148+
tokenCodec.putConstVal(valArray, 0, put(valBuffer, encoding.constVal(), type));
149+
tokenCodec.putMinVal(valArray, 0, put(valBuffer, encoding.minVal(), type));
150+
tokenCodec.putMaxVal(valArray, 0, put(valBuffer, encoding.maxVal(), type));
151+
tokenCodec.putNullVal(valArray, 0, put(valBuffer, encoding.nullVal(), type));
131152

132-
serializedToken.wrapForEncode(directBuffer, 0)
133-
.tokenOffset(token.offset())
134-
.tokenSize(token.size())
135-
.schemaID(token.schemaId())
136-
.tokenVersion(token.version())
137-
.signal(IrUtil.signal(token.signal()))
138-
.primitiveType(IrUtil.primitiveType(type))
139-
.byteOrder(IrUtil.byteOrder(token.encoding().byteOrder()));
153+
final byte[] charEncodingBytes = getBytes(encoding.characterEncoding(), TokenCodec.characterEncodingCharacterEncoding());
154+
tokenCodec.putCharacterEncoding(charEncodingBytes, 0, charEncodingBytes.length);
140155

141-
final byte[] nameBytes = token.name().getBytes(SerializedToken.nameCharacterEncoding());
142-
serializedToken.putName(nameBytes, 0, nameBytes.length);
156+
final byte[] epochBytes = getBytes(encoding.epoch(), TokenCodec.epochCharacterEncoding());
157+
tokenCodec.putEpoch(epochBytes, 0, epochBytes.length);
143158

144-
serializedToken.putConstVal(valArray, 0, IrUtil.putVal(valBuffer, token.encoding().constVal(), type));
145-
serializedToken.putMinVal(valArray, 0, IrUtil.putVal(valBuffer, token.encoding().minVal(), type));
146-
serializedToken.putMaxVal(valArray, 0, IrUtil.putVal(valBuffer, token.encoding().maxVal(), type));
147-
serializedToken.putNullVal(valArray, 0, IrUtil.putVal(valBuffer, token.encoding().nullVal(), type));
159+
final byte[] timeUnitBytes = getBytes(encoding.timeUnit(), TokenCodec.timeUnitCharacterEncoding());
160+
tokenCodec.putTimeUnit(timeUnitBytes, 0, timeUnitBytes.length);
148161

149-
final byte[] charBytes = token.encoding().characterEncoding().getBytes(SerializedToken.characterEncodingCharacterEncoding());
150-
serializedToken.putCharacterEncoding(charBytes, 0, charBytes.length);
162+
final byte[] semanticTypeBytes = getBytes(encoding.semanticType(), TokenCodec.semanticTypeCharacterEncoding());
163+
tokenCodec.putSemanticType(semanticTypeBytes, 0, semanticTypeBytes.length);
151164

152-
return serializedToken.size();
165+
return tokenCodec.size();
153166
}
154167
}

main/java/uk/co/real_logic/sbe/ir/Encoding.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public Encoding()
6262
maxVal = null;
6363
nullVal = null;
6464
constVal = null;
65-
characterEncoding = "";
65+
characterEncoding = null;
6666
epoch = null;
6767
timeUnit = null;
6868
semanticType = null;
@@ -281,7 +281,7 @@ public static class Builder
281281
private PrimitiveValue maxVal = null;
282282
private PrimitiveValue nullVal = null;
283283
private PrimitiveValue constVal = null;
284-
private String characterEncoding = "";
284+
private String characterEncoding = null;
285285
private String epoch = null;
286286
private String timeUnit = null;
287287
private String semanticType = null;

0 commit comments

Comments
 (0)