Modernize mocking in yang-data-api
[yangtools.git] / data / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / schema / DuplicateFinder.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.data.api.schema;
9
10 import java.util.HashMap;
11 import java.util.IdentityHashMap;
12 import java.util.Map;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
14
15 // FIXME: relocate to yang-data-util, where this can have a proper test suite
16 final class DuplicateFinder {
17     private final Map<NormalizedNode, DuplicateEntry> identities = new IdentityHashMap<>();
18     private final Map<NormalizedNode, DuplicateEntry> duplicates = new HashMap<>();
19
20     private DuplicateFinder() {
21         // Hidden on purpose
22     }
23
24     private void findDuplicates(final YangInstanceIdentifier path, final NormalizedNode node) {
25         final var i = identities.get(node);
26         if (i == null) {
27             final var d = duplicates.get(node);
28             if (d == null) {
29                 final var n = new DuplicateEntry(path);
30                 identities.put(node, n);
31                 duplicates.put(node, n);
32             } else {
33                 d.addDuplicate(path);
34             }
35
36             if (node instanceof NormalizedNodeContainer<?> container) {
37                 for (var child : container.body()) {
38                     findDuplicates(path.node(child.name()), child);
39                 }
40             }
41         } else {
42             i.addHardLink(path);
43         }
44     }
45
46     /**
47      * Recursively scan a {@link NormalizedNode} instance and its children and produce a collection of
48      * {@link DuplicateEntry} objects. Each holds the original definition path and a list of hard/softlinks.
49      *
50      * @param node Root node, may not be null.
51      * @return List of entries
52      */
53     static Map<NormalizedNode, DuplicateEntry> findDuplicates(final NormalizedNode node) {
54         final DuplicateFinder finder = new DuplicateFinder();
55         finder.findDuplicates(YangInstanceIdentifier.of(), node);
56         return finder.identities;
57     }
58 }