/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.yangtools.yang.data.api.schema; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; final class DuplicateFinder { private final Map<NormalizedNode<?, ?>, DuplicateEntry> identities = new IdentityHashMap<>(); private final Map<NormalizedNode<?, ?>, DuplicateEntry> duplicates = new HashMap<>(); private DuplicateFinder() { // Hidden on purpose } private void findDuplicates(final YangInstanceIdentifier path, final NormalizedNode<?, ?> node) { final DuplicateEntry i = identities.get(node); if (i == null) { final DuplicateEntry d = duplicates.get(node); if (d == null) { final DuplicateEntry n = new DuplicateEntry(path); identities.put(node, n); duplicates.put(node, n); } else { d.addDuplicate(path); } if (node instanceof NormalizedNodeContainer<?, ?, ?>) { final NormalizedNodeContainer<?, ?, ?> container = (NormalizedNodeContainer<?, ?, ?>) node; for (NormalizedNode<?, ?> c : container.getValue()) { findDuplicates(path.node(c.getIdentifier()), c); } } } else { i.addHardLink(path); } } /** * Recursively scan a {@link NormalizedNode} instance and its children and * produce a collection of {@link DuplicateEntry} objects. Each holds the * original definition path and a list of hard/softlinks. * * @param node Root node, may not be null. * @return List of entries */ static Map<NormalizedNode<?, ?>, DuplicateEntry> findDuplicates(final NormalizedNode<?, ?> node) { final DuplicateFinder finder = new DuplicateFinder(); finder.findDuplicates(YangInstanceIdentifier.EMPTY, node); return finder.identities; } }