/*
- * 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
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;
*/
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<Node, Module> TOPOLOGY_FUNCTION = new Function<TopologicalSort.Node, Module>() {
+ @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
@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();
}
/**
* 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.
*/
@Override
public ModuleBuilder apply(final TopologicalSort.Node input) {
+ if (input == null) {
+ return null;
+ }
ModuleOrModuleBuilder moduleOrModuleBuilder = ((ModuleNodeImpl) input).getReference();
if (moduleOrModuleBuilder.isModuleBuilder()) {
return moduleOrModuleBuilder.getModuleBuilder();
/**
* Topological sort of module dependency graph.
*
+ * @param modules YANG modules
* @return Sorted list of Modules. Modules can be further processed in
* returned order.
*/
List<TopologicalSort.Node> sorted = sortInternal(ModuleOrModuleBuilder.fromAll(asList(modules),
Collections.<ModuleBuilder>emptyList()));
// Cast to Module from Node and return
- return Lists.transform(sorted, new Function<TopologicalSort.Node, Module>() {
-
- @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<TopologicalSort.Node> sortInternal(final Iterable<ModuleOrModuleBuilder> modules) {
*/
private static void processDependencies(final Map<String, Map<Date, ModuleNodeImpl>> moduleGraph,
final Iterable<ModuleOrModuleBuilder> mmbs) {
- Map<URI, Object> allNS = new HashMap<>();
+ Map<URI, ModuleOrModuleBuilder> allNS = new HashMap<>();
// Create edges in graph
for (ModuleOrModuleBuilder mmb : mmbs) {
String fromName;
Date fromRevision;
- Set<ModuleImport> imports;
+ Collection<ModuleImport> imports;
URI ns;
if (mmb.isModule()) {
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(
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;
}
private final Optional<Module> maybeModule;
private final Optional<ModuleBuilder> maybeModuleBuilder;
- ModuleOrModuleBuilder(Module module) {
+ ModuleOrModuleBuilder(final Module module) {
maybeModule = Optional.of(module);
maybeModuleBuilder = Optional.absent();
}
- ModuleOrModuleBuilder(ModuleBuilder moduleBuilder) {
+ ModuleOrModuleBuilder(final ModuleBuilder moduleBuilder) {
maybeModule = Optional.absent();
maybeModuleBuilder = Optional.of(moduleBuilder);
}
return maybeModuleBuilder.get();
}
- static List<ModuleOrModuleBuilder> fromAll(Collection<Module> modules, Collection<ModuleBuilder> moduleBuilders) {
+ static List<ModuleOrModuleBuilder> fromAll(final Collection<Module> modules, final Collection<ModuleBuilder> moduleBuilders) {
List<ModuleOrModuleBuilder> result = new ArrayList<>(modules.size() + moduleBuilders.size());
for(Module m: modules){
result.add(new ModuleOrModuleBuilder(m));