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%2Fimpl%2FSchemaContextImpl.java;h=319f189043f4743daedc326834caeea4c2e12d1d;hb=1c6811475b33129127a9e1e32bdccb199ea92afd;hp=b7face08fcf30f07d4e06ebfb7094438dd321f1f;hpb=e64e0fa0c3265814d48640e432336ff5a17ad151;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java index b7face08fc..319f189043 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java @@ -7,14 +7,29 @@ */ package org.opendaylight.yangtools.yang.parser.impl; +import com.google.common.base.Optional; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.SetMultimap; + import java.net.URI; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +import javax.annotation.concurrent.Immutable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; @@ -23,6 +38,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -33,16 +49,64 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort; +@Immutable final class SchemaContextImpl implements SchemaContext { + private static final Comparator REVISION_COMPARATOR = new Comparator() { + @Override + public int compare(final Module o1, final Module o2) { + if (o2.getRevision() == null) { + return -1; + } + + return o2.getRevision().compareTo(o1.getRevision()); + } + }; + + private static final Supplier> MODULE_SET_SUPPLIER = new Supplier>() { + @Override + public TreeSet get() { + return new TreeSet<>(REVISION_COMPARATOR); + } + }; + + private final Map identifiersToSources; + private final SetMultimap namespaceToModules; + private final SetMultimap nameToModules; private final Set modules; - SchemaContextImpl(final Set modules) { - this.modules = modules; + SchemaContextImpl(final Set modules, final Map identifiersToSources) { + this.identifiersToSources = ImmutableMap.copyOf(identifiersToSources); + + /* + * Instead of doing this on each invocation of getModules(), pre-compute + * it once and keep it around -- better than the set we got in. + */ + this.modules = ImmutableSet.copyOf(ModuleDependencySort.sort(modules.toArray(new Module[modules.size()]))); + + /* + * The most common lookup is from Namespace->Module. + * + * RESTCONF performs lookups based on module name only, where it wants + * to receive the latest revision + * + * Invest some quality time in building up lookup tables for both. + */ + final SetMultimap nsMap = Multimaps.newSetMultimap( + new TreeMap>(), MODULE_SET_SUPPLIER); + final SetMultimap nameMap = Multimaps.newSetMultimap( + new TreeMap>(), MODULE_SET_SUPPLIER); + for (Module m : modules) { + nameMap.put(m.getName(), m); + nsMap.put(m.getNamespace(), m); + } + + namespaceToModules = ImmutableSetMultimap.copyOf(nsMap); + nameToModules = ImmutableSetMultimap.copyOf(nameMap); } @Override public Set getDataDefinitions() { - final Set dataDefs = new HashSet(); + final Set dataDefs = new HashSet<>(); for (Module m : modules) { dataDefs.addAll(m.getChildNodes()); } @@ -51,13 +115,12 @@ final class SchemaContextImpl implements SchemaContext { @Override public Set getModules() { - List sorted = ModuleDependencySort.sort(modules.toArray(new Module[modules.size()])); - return new LinkedHashSet(sorted); + return modules; } @Override public Set getNotifications() { - final Set notifications = new HashSet(); + final Set notifications = new HashSet<>(); for (Module m : modules) { notifications.addAll(m.getNotifications()); } @@ -66,7 +129,7 @@ final class SchemaContextImpl implements SchemaContext { @Override public Set getOperations() { - final Set rpcs = new HashSet(); + final Set rpcs = new HashSet<>(); for (Module m : modules) { rpcs.addAll(m.getRpcs()); } @@ -75,7 +138,7 @@ final class SchemaContextImpl implements SchemaContext { @Override public Set getExtensions() { - final Set extensions = new HashSet(); + final Set extensions = new HashSet<>(); for (Module m : modules) { extensions.addAll(m.getExtensionSchemaNodes()); } @@ -84,40 +147,29 @@ final class SchemaContextImpl implements SchemaContext { @Override public Module findModuleByName(final String name, final Date revision) { - if (name != null) { - for (final Module module : modules) { - if (revision == null) { - if (module.getName().equals(name)) { - return module; - } - } else if (module.getName().equals(name) && module.getRevision().equals(revision)) { - return module; - } + for (final Module module : nameToModules.get(name)) { + if (revision == null || revision.equals(module.getRevision())) { + return module; } } + return null; } @Override public Set findModuleByNamespace(final URI namespace) { - final Set ret = new HashSet(); - if (namespace != null) { - for (final Module module : modules) { - if (module.getNamespace().equals(namespace)) { - ret.add(module); - } - } - } - return ret; + final Set ret = namespaceToModules.get(namespace); + return ret == null ? Collections.emptySet() : ret; } @Override - public Module findModuleByNamespaceAndRevision(URI namespace, Date revision) { - if (namespace != null) { - for (final Module module : modules) { - if (module.getNamespace().equals(namespace) && module.getRevision().equals(revision)) { - return(module); - } + public Module findModuleByNamespaceAndRevision(final URI namespace, final Date revision) { + if (namespace == null) { + return null; + } + for (Module module : findModuleByNamespace(namespace)) { + if (revision == null || revision.equals(module.getRevision())) { + return module; } } return null; @@ -205,27 +257,25 @@ final class SchemaContextImpl implements SchemaContext { } @Override - public DataSchemaNode getDataChildByName(QName name) { - DataSchemaNode result = null; + public DataSchemaNode getDataChildByName(final QName name) { for (Module module : modules) { - result = module.getDataChildByName(name); + final DataSchemaNode result = module.getDataChildByName(name); if (result != null) { - break; + return result; } } - return result; + return null; } @Override - public DataSchemaNode getDataChildByName(String name) { - DataSchemaNode result = null; + public DataSchemaNode getDataChildByName(final String name) { for (Module module : modules) { - result = module.getDataChildByName(name); + final DataSchemaNode result = module.getDataChildByName(name); if (result != null) { - break; + return result; } } - return result; + return null; } @Override @@ -243,4 +293,22 @@ final class SchemaContextImpl implements SchemaContext { return Collections.emptySet(); } + //FIXME: should work for submodules too + @Override + public Set getAllModuleIdentifiers() { + return identifiersToSources.keySet(); + } + + @Override + public Optional getModuleSource(final ModuleIdentifier moduleIdentifier) { + String maybeSource = identifiersToSources.get(moduleIdentifier); + return Optional.fromNullable(maybeSource); + } + + @Override + public String toString() { + return "SchemaContextImpl{" + + "modules=" + modules + + '}'; + } }