Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e0a8159

Browse files
committed
[Java] Added valueRef support for enums to the IR.
1 parent 66cc7f2 commit e0a8159

File tree

4 files changed

+95
-6
lines changed

4 files changed

+95
-6
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/Ir.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,43 @@ public void addMessage(final long messageId, final List<Token> messageTokens)
8585
Verify.notNull(messageTokens, "messageTokens");
8686

8787
captureTypes(messageTokens);
88+
compressConstantEnums(messageTokens);
8889

8990
messagesByIdMap.put(messageId, Collections.unmodifiableList(new ArrayList<>(messageTokens)));
9091
}
9192

93+
private void compressConstantEnums(final List<Token> tokens)
94+
{
95+
final Iterator<Token> iter = tokens.iterator();
96+
while (iter.hasNext())
97+
{
98+
final Token token = iter.next();
99+
if (Signal.BEGIN_FIELD == token.signal() && token.isConstantEncoding())
100+
{
101+
Token nextToken = iter.next();
102+
if (Signal.BEGIN_ENUM == nextToken.signal())
103+
{
104+
final String valueRef = token.encoding().constValue().toString();
105+
nextToken.encodedLength(0);
106+
107+
while (true)
108+
{
109+
nextToken = iter.next();
110+
if (Signal.END_ENUM == nextToken.signal())
111+
{
112+
break;
113+
}
114+
115+
if (!valueRef.endsWith(nextToken.name()))
116+
{
117+
iter.remove();
118+
}
119+
}
120+
}
121+
}
122+
}
123+
}
124+
92125
/**
93126
* Get the getMessage for a given identifier.
94127
*

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/Token.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public enum VersionContext
100100
private final String name;
101101
private final int id;
102102
private final int version;
103-
private final int encodedLength;
103+
private int encodedLength;
104104
private final int offset;
105105
private final Encoding encoding;
106106

@@ -206,6 +206,16 @@ public int encodedLength()
206206
return encodedLength;
207207
}
208208

209+
/**
210+
* Set the encoded length for this node. See {@link #encodedLength()}.
211+
*
212+
* @param encodedLength that is overriding existing value.
213+
*/
214+
public void encodedLength(final int encodedLength)
215+
{
216+
this.encodedLength = encodedLength;
217+
}
218+
209219
/**
210220
* The number of encoded primitives in this type.
211221
*

sbe-tool/src/main/java/uk/co/real_logic/sbe/xml/IrGenerator.java

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
package uk.co.real_logic.sbe.xml;
1616

1717
import uk.co.real_logic.sbe.PrimitiveType;
18+
import uk.co.real_logic.sbe.PrimitiveValue;
1819
import uk.co.real_logic.sbe.ir.Encoding;
1920
import uk.co.real_logic.sbe.ir.Ir;
2021
import uk.co.real_logic.sbe.ir.Signal;
2122
import uk.co.real_logic.sbe.ir.Token;
2223

24+
import java.io.UnsupportedEncodingException;
2325
import java.nio.ByteOrder;
2426
import java.util.ArrayList;
2527
import java.util.List;
@@ -108,18 +110,37 @@ private void addMessageSignal(final Message msg, final Signal signal)
108110

109111
private void addFieldSignal(final Field field, final Signal signal)
110112
{
113+
final Encoding.Builder encodingBuilder = new Encoding.Builder()
114+
.epoch(field.epoch())
115+
.timeUnit(field.timeUnit())
116+
.presence(convertPresence(field.presence()))
117+
.semanticType(semanticTypeOf(null, field));
118+
119+
if (field.presence() == Presence.CONSTANT && null != field.valueRef())
120+
{
121+
final String valueRef = field.valueRef();
122+
final byte[] bytes;
123+
try
124+
{
125+
bytes = valueRef.getBytes("UTF-8");
126+
}
127+
catch (final UnsupportedEncodingException ex)
128+
{
129+
throw new RuntimeException(ex);
130+
}
131+
132+
encodingBuilder.constValue(new PrimitiveValue(bytes, "UTF-8", valueRef.length()));
133+
encodingBuilder.primitiveType(PrimitiveType.CHAR);
134+
}
135+
111136
final Token token = new Token.Builder()
112137
.signal(signal)
113138
.size(field.computedBlockLength())
114139
.name(field.name())
115140
.id(field.id())
116141
.offset(field.computedOffset())
117142
.version(field.sinceVersion())
118-
.encoding(new Encoding.Builder()
119-
.epoch(field.epoch())
120-
.timeUnit(field.timeUnit())
121-
.semanticType(semanticTypeOf(null, field))
122-
.build())
143+
.encoding(encodingBuilder.build())
123144
.build();
124145

125146
tokenList.add(token);
@@ -377,4 +398,25 @@ private String semanticTypeOf(final Type type, final Field field)
377398

378399
return null != field ? field.semanticType() : null;
379400
}
401+
402+
private Encoding.Presence convertPresence(final Presence presence)
403+
{
404+
Encoding.Presence encodingPresence = Encoding.Presence.REQUIRED;
405+
406+
if (null != presence)
407+
{
408+
switch (presence)
409+
{
410+
case OPTIONAL:
411+
encodingPresence = Encoding.Presence.OPTIONAL;
412+
break;
413+
414+
case CONSTANT:
415+
encodingPresence = Encoding.Presence.CONSTANT;
416+
break;
417+
}
418+
}
419+
420+
return encodingPresence;
421+
}
380422
}

sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,10 @@ private Class<?> compile(final String fqClassName) throws Exception
459459
System.out.println(sources);
460460
}
461461

462+
if (fqClassName.contains("Model"))
463+
{
464+
System.out.println("sources = " + sources.get(fqClassName));
465+
}
462466
return aClass;
463467
}
464468

0 commit comments

Comments
 (0)