Skip to content

Commit a74a123

Browse files
committed
[Java] Validate message and field names are unique in context. Issue #470.
1 parent 5641707 commit a74a123

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package uk.co.real_logic.sbe.xml;
1717

18+
import org.agrona.collections.ObjectHashSet;
1819
import uk.co.real_logic.sbe.ir.Token;
1920

2021
import org.w3c.dom.Node;
@@ -55,6 +56,7 @@ public class Message
5556
private final String semanticType;
5657
private final int computedBlockLength;
5758
private final Map<String, Type> typeByNameMap;
59+
private final ObjectHashSet<String> names = new ObjectHashSet<>();
5860

5961
/**
6062
* Construct a new message from XML Schema.
@@ -204,6 +206,11 @@ private List<Field> parseFieldsAndGroups(final Node node) throws XPathExpression
204206
throw new IllegalStateException("Unknown node name: " + nodeName);
205207
}
206208

209+
if (!names.add(field.name()))
210+
{
211+
handleError(node, "duplicate name found: " + field.name());
212+
}
213+
207214
fieldList.add(field);
208215
}
209216

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package uk.co.real_logic.sbe.xml;
1818

19+
import org.agrona.collections.ObjectHashSet;
1920
import org.w3c.dom.Document;
2021
import org.w3c.dom.Node;
2122
import org.w3c.dom.NodeList;
@@ -161,9 +162,10 @@ public static Map<Long, Message> findMessages(
161162
final Document document, final XPath xPath, final Map<String, Type> typeByNameMap) throws Exception
162163
{
163164
final Map<Long, Message> messageByIdMap = new HashMap<>();
165+
final ObjectHashSet<String> names = new ObjectHashSet<>();
164166

165167
forEach((NodeList)xPath.compile(MESSAGE_XPATH_EXPR).evaluate(document, XPathConstants.NODESET),
166-
(node) -> addMessageWithIdCheck(messageByIdMap, new Message(node, typeByNameMap), node));
168+
(node) -> addMessageWithIdCheck(names, messageByIdMap, new Message(node, typeByNameMap), node));
167169

168170
return messageByIdMap;
169171
}
@@ -335,13 +337,21 @@ private static void addTypeWithNameCheck(final Map<String, Type> typeByNameMap,
335337
}
336338

337339
private static void addMessageWithIdCheck(
338-
final Map<Long, Message> messageByIdMap, final Message message, final Node node)
340+
final ObjectHashSet<String> names,
341+
final Map<Long, Message> messageByIdMap,
342+
final Message message,
343+
final Node node)
339344
{
340345
if (messageByIdMap.get((long)message.id()) != null)
341346
{
342347
handleError(node, "message template id already exists: " + message.id());
343348
}
344349

350+
if (!names.add(message.name()))
351+
{
352+
handleError(node, "message name already exists: " + message.name());
353+
}
354+
345355
checkForValidName(node, message.name());
346356

347357
messageByIdMap.put((long)message.id(), message);

0 commit comments

Comments
 (0)