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=051dd4f72729a94bb9d76f3e3c117d5797f4c282;hb=fa0be1f641cd46486c99007a8d6c8279e683185f;hp=3db3065d55e1adc2c3e0392cb72892ff09f3883b;hpb=91b09c4c9004c51c2a221b4c3af2a34d8b76da20;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 3db3065d55..051dd4f727 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,20 +1,22 @@ /* - * 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 */ 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.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -43,6 +45,13 @@ public final class ModuleDependencySort { private static final Date DEFAULT_REVISION = new Date(0); 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) { + ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference(); + return moduleOrModuleBuilder.getModule(); + } + }; /** * It is not desirable to instance this class @@ -50,14 +59,16 @@ public final class ModuleDependencySort { private ModuleDependencySort() { } + /** * Extracts {@link ModuleBuilder} from a {@link ModuleNodeImpl}. */ - private static final Function NODE_TO_MODULEBUILDER = new Function() { + private static final Function NODE_TO_MODULEBUILDER = new Function() { @Override - public ModuleBuilder apply(final Node input) { + public ModuleBuilder apply(final TopologicalSort.Node input) { // Cast to ModuleBuilder from Node and return - return (ModuleBuilder) ((ModuleNodeImpl) input).getReference(); + ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference(); + return moduleOrModuleBuilder.getModuleBuilder(); } }; @@ -68,29 +79,27 @@ public final class ModuleDependencySort { * in returned order. */ public static List sort(final ModuleBuilder... builders) { - List sorted = sortInternal(Arrays.asList(builders)); - return Lists.transform(sorted, NODE_TO_MODULEBUILDER); + return sort(asList(builders)); } public static List sort(final Collection builders) { - ModuleBuilder[] array = new ModuleBuilder[builders.size()]; - builders.toArray(array); - return sort(array); + List sorted = sortInternal(ModuleOrModuleBuilder.fromAll( + Collections.emptySet(),builders)); + return Lists.transform(sorted, NODE_TO_MODULEBUILDER); } public static List sortWithContext(final SchemaContext context, final ModuleBuilder... builders) { - List modules = new ArrayList(); - Collections.addAll(modules, builders); - modules.addAll(context.getModules()); + List all = ModuleOrModuleBuilder.fromAll(context.getModules(), asList(builders)); - List sorted = sortInternal(modules); + List sorted = sortInternal(all); // Cast to ModuleBuilder from Node if possible and return - return Lists.transform(sorted, new Function() { + return Lists.transform(sorted, new Function() { @Override - public ModuleBuilder apply(final Node input) { - if (((ModuleNodeImpl) input).getReference() instanceof ModuleBuilder) { - return (ModuleBuilder) ((ModuleNodeImpl) input).getReference(); + public ModuleBuilder apply(final TopologicalSort.Node input) { + ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference(); + if (moduleOrModuleBuilder.isModuleBuilder()) { + return moduleOrModuleBuilder.getModuleBuilder(); } else { return null; } @@ -105,21 +114,16 @@ public final class ModuleDependencySort { * returned order. */ public static List sort(final Module... modules) { - List sorted = sortInternal(Arrays.asList(modules)); + 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 Node input) { - return (Module) ((ModuleNodeImpl) input).getReference(); - } - }); + return Lists.transform(sorted, TOPOLOGY_FUNCTION); } - private static List sortInternal(final List modules) { + private static List sortInternal(final Iterable modules) { Map> moduleGraph = createModuleGraph(modules); - Set nodes = Sets.newHashSet(); + Set nodes = Sets.newHashSet(); for (Map map : moduleGraph.values()) { for (ModuleNodeImpl node : map.values()) { nodes.add(node); @@ -130,7 +134,7 @@ public final class ModuleDependencySort { } @VisibleForTesting - static Map> createModuleGraph(final List builders) { + static Map> createModuleGraph(final Iterable builders) { Map> moduleGraph = Maps.newHashMap(); processModules(moduleGraph, builders); @@ -142,28 +146,31 @@ public final class ModuleDependencySort { /** * Extract module:revision from module builders */ - private static void processDependencies(final Map> moduleGraph, final List builders) { + private static void processDependencies(final Map> moduleGraph, + final Iterable mmbs) { Map allNS = new HashMap<>(); // Create edges in graph - for (Object mb : builders) { + for (ModuleOrModuleBuilder mmb : mmbs) { Map imported = Maps.newHashMap(); - String fromName = null; - Date fromRevision = null; - Set imports = null; - URI ns = null; - - if (mb instanceof Module) { - fromName = ((Module) mb).getName(); - fromRevision = ((Module) mb).getRevision(); - imports = ((Module) mb).getImports(); - ns = ((Module)mb).getNamespace(); - } else if (mb instanceof ModuleBuilder) { - fromName = ((ModuleBuilder) mb).getName(); - fromRevision = ((ModuleBuilder) mb).getRevision(); - imports = ((ModuleBuilder) mb).getModuleImports(); - ns = ((ModuleBuilder)mb).getNamespace(); + String fromName; + Date fromRevision; + Collection imports; + URI ns; + + if (mmb.isModule()) { + Module module = mmb.getModule(); + fromName = module.getName(); + fromRevision = module.getRevision(); + imports = module.getImports(); + ns = module.getNamespace(); + } else { + ModuleBuilder moduleBuilder = mmb.getModuleBuilder(); + fromName = moduleBuilder.getName(); + fromRevision = moduleBuilder.getRevision(); + imports = moduleBuilder.getImports().values(); + ns = moduleBuilder.getNamespace(); } // check for existence of module with same namespace @@ -171,12 +178,25 @@ public final class ModuleDependencySort { Object mod = allNS.get(ns); String name = null; Date revision = null; + + if(mod instanceof ModuleOrModuleBuilder) { + ModuleOrModuleBuilder modOrmodBuilder = ((ModuleOrModuleBuilder) mod); + if(modOrmodBuilder.isModule()) { + mod = ((ModuleOrModuleBuilder) mod).getModule(); + } else if (modOrmodBuilder.isModuleBuilder()) { + mod = ((ModuleOrModuleBuilder) mod).getModuleBuilder(); + } else { + LOGGER.warn("ModuleOrModuleBuilder is neither Module or ModuleBuilder"); + } + } 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(); + } else { + LOGGER.warn("Module has no name: {}", mod); } if (!(fromName.equals(name))) { LOGGER.warn( @@ -184,7 +204,7 @@ public final class ModuleDependencySort { fromName, fromRevision, ns, name, revision); } } else { - allNS.put(ns, mb); + allNS.put(ns, mmb); } // no need to check if other Type of object, check is performed in @@ -257,24 +277,21 @@ public final class ModuleDependencySort { * Extract dependencies from module builders or modules to fill dependency * graph */ - private static void processModules(final Map> moduleGraph, final List builders) { + private static void processModules(final Map> moduleGraph, + final Iterable builders) { // Process nodes - for (Object mb : builders) { + for (ModuleOrModuleBuilder momb : builders) { - String name = null; - Date rev = null; + String name; + Date rev; - if (mb instanceof Module) { - name = ((Module) mb).getName(); - rev = ((Module) mb).getRevision(); - } else if (mb instanceof ModuleBuilder) { - name = ((ModuleBuilder) mb).getName(); - rev = ((ModuleBuilder) mb).getRevision(); + if (momb.isModule()) { + name = momb.getModule().getName(); + rev = momb.getModule().getRevision(); } else { - throw new IllegalStateException(String.format( - "Unexpected type of node for sort, expected only:%s, %s, got:%s", Module.class, - ModuleBuilder.class, mb.getClass())); + name = momb.getModuleBuilder().getName(); + rev = momb.getModuleBuilder().getRevision(); } if (rev == null) { @@ -289,7 +306,7 @@ public final class ModuleDependencySort { ex(String.format("Module:%s with revision:%s declared twice", name, formatRevDate(rev))); } - moduleGraph.get(name).put(rev, new ModuleNodeImpl(name, rev, mb)); + moduleGraph.get(name).put(rev, new ModuleNodeImpl(name, rev, momb)); } } @@ -301,9 +318,9 @@ public final class ModuleDependencySort { static class ModuleNodeImpl extends NodeImpl { private final String name; private final Date revision; - private final Object originalObject; + private final ModuleOrModuleBuilder originalObject; - public ModuleNodeImpl(final String name, final Date revision, final Object builder) { + public ModuleNodeImpl(final String name, final Date revision, final ModuleOrModuleBuilder builder) { this.name = name; this.revision = revision; this.originalObject = builder; @@ -360,10 +377,47 @@ public final class ModuleDependencySort { return "Module [name=" + name + ", revision=" + formatRevDate(revision) + "]"; } - public Object getReference() { + public ModuleOrModuleBuilder getReference() { return originalObject; } } } +class ModuleOrModuleBuilder { + private final Optional maybeModule; + private final Optional maybeModuleBuilder; + + ModuleOrModuleBuilder(final Module module) { + maybeModule = Optional.of(module); + maybeModuleBuilder = Optional.absent(); + } + + ModuleOrModuleBuilder(final 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(final Collection modules, final 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; + } +}