X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Futil%2FModuleDependencySort.java;h=c34a8f421824dc494aa3b08e330fcc134618960a;hb=42abb28b99a02f9580f4676ce5c315628e5bcd24;hp=d962c3cfa96caa216e33796a182cce91a0d6a4ef;hpb=a8240131f5b1216d0345a6264a5bde51a21b2b59;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ModuleDependencySort.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ModuleDependencySort.java index d962c3cfa9..c34a8f4218 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ModuleDependencySort.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ModuleDependencySort.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013 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 @@ -7,27 +8,26 @@ package org.opendaylight.yangtools.yang.parser.util; import static java.util.Arrays.asList; - import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; -import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.net.URI; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleImport; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder; +import org.opendaylight.yangtools.yang.parser.util.TopologicalSort.Node; import org.opendaylight.yangtools.yang.parser.util.TopologicalSort.NodeImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,8 +40,18 @@ import org.slf4j.LoggerFactory; */ public final class ModuleDependencySort { - private static final Date DEFAULT_REVISION = new Date(0); + private static final Date DEFAULT_REVISION = SimpleDateFormatUtil.DEFAULT_DATE_REV; private static final Logger LOGGER = LoggerFactory.getLogger(ModuleDependencySort.class); + private static final Function TOPOLOGY_FUNCTION = new Function() { + @Override + public Module apply(final TopologicalSort.Node input) { + if (input == null) { + return null; + } + ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference(); + return moduleOrModuleBuilder.getModule(); + } + }; /** * It is not desirable to instance this class @@ -57,6 +67,9 @@ public final class ModuleDependencySort { @Override public ModuleBuilder apply(final TopologicalSort.Node input) { // Cast to ModuleBuilder from Node and return + if (input == null) { + return null; + } ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference(); return moduleOrModuleBuilder.getModuleBuilder(); } @@ -65,13 +78,20 @@ public final class ModuleDependencySort { /** * Topological sort of module builder dependency graph. * + * @param builders builders of Module object * @return Sorted list of Module builders. Modules can be further processed * in returned order. + * @deprecated Pre-Beryllium implementation, scheduled for removal. */ + @Deprecated public static List sort(final ModuleBuilder... builders) { return sort(asList(builders)); } + /** + * @deprecated Pre-Beryllium implementation, scheduled for removal. + */ + @Deprecated public static List sort(final Collection builders) { List sorted = sortInternal(ModuleOrModuleBuilder.fromAll( Collections.emptySet(),builders)); @@ -87,6 +107,9 @@ public final class ModuleDependencySort { @Override public ModuleBuilder apply(final TopologicalSort.Node input) { + if (input == null) { + return null; + } ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference(); if (moduleOrModuleBuilder.isModuleBuilder()) { return moduleOrModuleBuilder.getModuleBuilder(); @@ -100,6 +123,7 @@ public final class ModuleDependencySort { /** * Topological sort of module dependency graph. * + * @param modules YANG modules * @return Sorted list of Modules. Modules can be further processed in * returned order. */ @@ -107,14 +131,7 @@ public final class ModuleDependencySort { List sorted = sortInternal(ModuleOrModuleBuilder.fromAll(asList(modules), Collections.emptyList())); // Cast to Module from Node and return - return Lists.transform(sorted, new Function() { - - @Override - public Module apply(final TopologicalSort.Node input) { - ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference(); - return moduleOrModuleBuilder.getModule(); - } - }); + return Lists.transform(sorted, TOPOLOGY_FUNCTION); } private static List sortInternal(final Iterable modules) { @@ -145,7 +162,7 @@ public final class ModuleDependencySort { */ private static void processDependencies(final Map> moduleGraph, final Iterable mmbs) { - Map allNS = new HashMap<>(); + Map allNS = new HashMap<>(); // Create edges in graph for (ModuleOrModuleBuilder mmb : mmbs) { @@ -153,7 +170,7 @@ public final class ModuleDependencySort { String fromName; Date fromRevision; - Set imports; + Collection imports; URI ns; if (mmb.isModule()) { @@ -166,21 +183,21 @@ public final class ModuleDependencySort { ModuleBuilder moduleBuilder = mmb.getModuleBuilder(); fromName = moduleBuilder.getName(); fromRevision = moduleBuilder.getRevision(); - imports = moduleBuilder.getModuleImports(); + imports = moduleBuilder.getImports().values(); ns = moduleBuilder.getNamespace(); } // check for existence of module with same namespace if (allNS.containsKey(ns)) { - Object mod = allNS.get(ns); + ModuleOrModuleBuilder mod = allNS.get(ns); String name = null; Date revision = null; - if (mod instanceof Module) { - name = ((Module) mod).getName(); - revision = ((Module) mod).getRevision(); - } else if (mod instanceof ModuleBuilder) { - name = ((ModuleBuilder) mod).getName(); - revision = ((ModuleBuilder) mod).getRevision(); + if (mod.isModule()) { + name = mod.getModule().getName(); + revision = mod.getModule().getRevision(); + } else if (mod.isModuleBuilder()) { + name = mod.getModuleBuilder().getName(); + revision = mod.getModuleBuilder().getRevision(); } if (!(fromName.equals(name))) { LOGGER.warn( @@ -322,8 +339,8 @@ public final class ModuleDependencySort { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((revision == null) ? 0 : revision.hashCode()); + result = prime * result + Objects.hashCode(name); + result = prime * result + Objects.hashCode(revision); return result; } @@ -368,40 +385,3 @@ public final class ModuleDependencySort { } } -class ModuleOrModuleBuilder { - private final Optional maybeModule; - private final Optional maybeModuleBuilder; - - ModuleOrModuleBuilder(Module module) { - maybeModule = Optional.of(module); - maybeModuleBuilder = Optional.absent(); - } - - ModuleOrModuleBuilder(ModuleBuilder moduleBuilder) { - maybeModule = Optional.absent(); - maybeModuleBuilder = Optional.of(moduleBuilder); - } - boolean isModule(){ - return maybeModule.isPresent(); - } - boolean isModuleBuilder(){ - return maybeModuleBuilder.isPresent(); - } - Module getModule(){ - return maybeModule.get(); - } - ModuleBuilder getModuleBuilder(){ - return maybeModuleBuilder.get(); - } - - static List fromAll(Collection modules, Collection moduleBuilders) { - List result = new ArrayList<>(modules.size() + moduleBuilders.size()); - for(Module m: modules){ - result.add(new ModuleOrModuleBuilder(m)); - } - for (ModuleBuilder mb : moduleBuilders) { - result.add(new ModuleOrModuleBuilder(mb)); - } - return result; - } -}