- @SuppressWarnings({ "rawtypes", "unchecked" })
- @Override
- public final NormalizedNode<?, ?> normalize(final Node<?> legacyData) {
- checkArgument(legacyData != null);
- if (!isMixin() && getIdentifier().getNodeType() != null) {
- checkArgument(getIdentifier().getNodeType().equals(legacyData.getNodeType()),
- "Node QName must be %s was %s", getIdentifier().getNodeType(), legacyData.getNodeType());
- }
- checkArgument(legacyData instanceof CompositeNode, "Node %s should be composite", legacyData);
- CompositeNode compositeNode = (CompositeNode) legacyData;
- NormalizedNodeContainerBuilder builder = createBuilder(compositeNode);
-
- Set<DataNormalizationOperation<?>> usedMixins = new HashSet<>();
- for (Node<?> childLegacy : compositeNode.getValue()) {
- final DataNormalizationOperation childOp;
-
- try {
- childOp = getChild(childLegacy.getNodeType());
- } catch (DataNormalizationException e) {
- throw new IllegalArgumentException(String.format("Failed to normalize data %s", compositeNode.getValue()), e);
- }
-
- // We skip unknown nodes if this node is mixin since
- // it's nodes and parent nodes are interleaved
- if (childOp == null && isMixin()) {
- continue;
- }
-
- checkArgument(childOp != null, "Node %s is not allowed inside %s", childLegacy.getNodeType(),
- getIdentifier());
- if (childOp.isMixin()) {
- if (usedMixins.contains(childOp)) {
- // We already run / processed that mixin, so to avoid
- // duplicity we are skipping next nodes.
- continue;
- }
- builder.addChild(childOp.normalize(compositeNode));
- usedMixins.add(childOp);
- } else {
- builder.addChild(childOp.normalize(childLegacy));
- }
- }
- return builder.build();
- }
-