47e7d447cbe2fe48ed6ce89455c68cb6d8aa9612
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-generator-impl / src / main / java / org / opendaylight / controller / sal / binding / yang / types / GroupingDefinitionDependencySort.java
1 /*
2  * Copyright (c) 2013 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.controller.sal.binding.yang.types;
9
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.Set;
14
15 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
16 import org.opendaylight.controller.yang.model.api.SchemaPath;
17 import org.opendaylight.controller.yang.model.api.UsesNode;
18 import org.opendaylight.controller.yang.parser.util.TopologicalSort;
19 import org.opendaylight.controller.yang.parser.util.TopologicalSort.Node;
20 import org.opendaylight.controller.yang.parser.util.TopologicalSort.NodeImpl;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 import com.google.common.collect.Maps;
25 import com.google.common.collect.Sets;
26
27 //import org.opendaylight.controller.yang.model.util.GroupingDefinition;
28
29 public class GroupingDefinitionDependencySort {
30     private static final Logger logger = LoggerFactory.getLogger(GroupingDefinitionDependencySort.class);
31
32     public static List<GroupingDefinition> sort(final Set<GroupingDefinition> groupingDefinitions) {
33         if (groupingDefinitions == null) {
34             logger.error("Set of grouping definitions cannot be NULL!");
35             throw new IllegalArgumentException("Set of Type Definitions " + "cannot be NULL!");
36         }
37
38         final List<GroupingDefinition> resultGroupingDefinitions = new ArrayList<GroupingDefinition>();
39         final Set<Node> unsorted = groupingDefinitionsToGroupingNodes(groupingDefinitions);
40         final List<Node> sortedNodes = TopologicalSort.sort(unsorted);
41         for (Node node : sortedNodes) {
42             resultGroupingDefinitions.add(((GroupingNode) node).getGroupingDefinition());
43         }
44         return resultGroupingDefinitions;
45
46     }
47
48     private static Set<Node> groupingDefinitionsToGroupingNodes(final Set<GroupingDefinition> groupingDefinitions) {
49         final Map<SchemaPath, Node> nodeMap = Maps.newHashMap();
50         final Set<Node> resultNodes = Sets.newHashSet();
51
52         for (final GroupingDefinition groupingDefinition : groupingDefinitions) {
53             final Node node = new GroupingNode(groupingDefinition);
54             nodeMap.put(groupingDefinition.getPath(), node);
55             resultNodes.add(node);
56         }
57
58         for (final Node node : resultNodes) {
59             final GroupingNode groupingNode = (GroupingNode) node;
60             final GroupingDefinition groupingDefinition = groupingNode.getGroupingDefinition();
61
62             Set<UsesNode> usesNodes = groupingDefinition.getUses();
63             for (UsesNode usesNode : usesNodes) {
64                 SchemaPath schemaPath = usesNode.getGroupingPath();
65                 if (schemaPath != null) {
66                     Node nodeTo = nodeMap.get(schemaPath);
67                     groupingNode.addEdge(nodeTo);
68                 }
69             }
70         }
71
72         return resultNodes;
73     }
74
75     private static final class GroupingNode extends NodeImpl {
76         private final GroupingDefinition groupingDefinition;
77
78         GroupingNode(GroupingDefinition groupingDefinition) {
79             this.groupingDefinition = groupingDefinition;
80         }
81
82         GroupingDefinition getGroupingDefinition() {
83             return groupingDefinition;
84         }
85
86         @Override
87         public boolean equals(Object o) {
88             if (this == o) {
89                 return true;
90             }
91             if (!(o instanceof GroupingNode)) {
92                 return false;
93             }
94             GroupingNode groupingNode = (GroupingNode) o;
95             if (!groupingDefinition.equals(groupingNode.groupingDefinition)) {
96                 return false;
97             }
98             return true;
99         }
100
101         @Override
102         public int hashCode() {
103             return groupingDefinition.hashCode();
104         }
105
106         @Override
107         public String toString() {
108             return "GroupingNode{" + "groupingType=" + groupingDefinition + '}';
109         }
110     }
111 }