|
16 | 16 | */ |
17 | 17 | package uk.co.real_logic.sbe.xml; |
18 | 18 |
|
| 19 | +import org.agrona.collections.ObjectHashSet; |
19 | 20 | import org.w3c.dom.Document; |
20 | 21 | import org.w3c.dom.Node; |
21 | 22 | import org.w3c.dom.NodeList; |
@@ -161,9 +162,10 @@ public static Map<Long, Message> findMessages( |
161 | 162 | final Document document, final XPath xPath, final Map<String, Type> typeByNameMap) throws Exception |
162 | 163 | { |
163 | 164 | final Map<Long, Message> messageByIdMap = new HashMap<>(); |
| 165 | + final ObjectHashSet<String> names = new ObjectHashSet<>(); |
164 | 166 |
|
165 | 167 | 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)); |
167 | 169 |
|
168 | 170 | return messageByIdMap; |
169 | 171 | } |
@@ -335,13 +337,21 @@ private static void addTypeWithNameCheck(final Map<String, Type> typeByNameMap, |
335 | 337 | } |
336 | 338 |
|
337 | 339 | 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) |
339 | 344 | { |
340 | 345 | if (messageByIdMap.get((long)message.id()) != null) |
341 | 346 | { |
342 | 347 | handleError(node, "message template id already exists: " + message.id()); |
343 | 348 | } |
344 | 349 |
|
| 350 | + if (!names.add(message.name())) |
| 351 | + { |
| 352 | + handleError(node, "message name already exists: " + message.name()); |
| 353 | + } |
| 354 | + |
345 | 355 | checkForValidName(node, message.name()); |
346 | 356 |
|
347 | 357 | messageByIdMap.put((long)message.id(), message); |
|
0 commit comments