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=b91f08fbb1234898c80ec6b2d98f7a629801b151;hb=8bd5bd285d4ad7d8621875bf2290f2bebe09cd8c;hp=459ea32cdd4a1ca91ceaf698a1902ca1f1219a8f;hpb=a2a6835fd0618578953744870a7a87bb0b1dbd0e;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 459ea32cdd..b91f08fbb1 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,310 +7,87 @@ */ package org.opendaylight.yangtools.yang.parser.impl; +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.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 javax.annotation.concurrent.Immutable; - -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; -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; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.api.Status; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.util.AbstractSchemaContext; import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort; -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; - @Immutable -final class SchemaContextImpl implements SchemaContext { - private static final Supplier> URI_SET_SUPPLIER = new Supplier>() { - @Override - public HashSet get() { - return new HashSet<>(); - } - }; +final class SchemaContextImpl extends AbstractSchemaContext { - private final ImmutableMap identifiersToSources; - private final ImmutableSetMultimap namespaceToModules; - private final ImmutableSet modules; + private final Map identifiersToSources; + private final SetMultimap namespaceToModules; + private final SetMultimap nameToModules; + private final Set 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. Invest some quality time in - * building that up. + /* + * 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 multimap = Multimaps.newSetMultimap( - new TreeMap>(), URI_SET_SUPPLIER); - for (Module m : modules) { - multimap.put(m.getNamespace(), m); - } - - namespaceToModules = ImmutableSetMultimap.copyOf(multimap); - } - - @Override - public Set getDataDefinitions() { - final Set dataDefs = new HashSet<>(); - for (Module m : modules) { - dataDefs.addAll(m.getChildNodes()); - } - return dataDefs; - } - - @Override - public Set getModules() { - return modules; - } + final SetMultimap nsMap = Multimaps.newSetMultimap( + new TreeMap<>(), MODULE_SET_SUPPLIER); + final SetMultimap nameMap = Multimaps.newSetMultimap( + new TreeMap<>(), MODULE_SET_SUPPLIER); - @Override - public Set getNotifications() { - final Set notifications = new HashSet<>(); - for (Module m : modules) { - notifications.addAll(m.getNotifications()); - } - return notifications; - } - - @Override - public Set getOperations() { - final Set rpcs = new HashSet<>(); for (Module m : modules) { - rpcs.addAll(m.getRpcs()); - } - return rpcs; - } - - @Override - public Set getExtensions() { - final Set extensions = new HashSet<>(); - for (Module m : modules) { - extensions.addAll(m.getExtensionSchemaNodes()); - } - return extensions; - } - - @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; - } - } + nameMap.put(m.getName(), m); + nsMap.put(m.getNamespace(), m); } - return null; - } - @Override - public Set findModuleByNamespace(final URI namespace) { - final Set ret = namespaceToModules.get(namespace); - return ret == null ? Collections.emptySet() : ret; + namespaceToModules = ImmutableSetMultimap.copyOf(nsMap); + nameToModules = ImmutableSetMultimap.copyOf(nameMap); } @Override - public Module findModuleByNamespaceAndRevision(final URI namespace, final Date revision) { - if (namespace == null) { - return null; - } - final Set modules = findModuleByNamespace(namespace); - if (modules.isEmpty()) { - return null; - } + protected Map getIdentifiersToSources(){ - if (revision == null) { - // FIXME: The ordering of modules in Multimap could just guarantee this... - TreeMap map = new TreeMap<>(); - for (Module module : modules) { - map.put(module.getRevision(), module); - } - if (map.isEmpty()) { - return null; - } - return map.lastEntry().getValue(); - } else { - for (Module module : modules) { - if (module.getRevision().equals(revision)) { - return(module); - } - } - } - return null; - } - - @Override - public boolean isAugmenting() { - return false; + return identifiersToSources; } @Override - public boolean isAddedByUses() { - return false; - } + public Set getModules(){ - @Override - public boolean isConfiguration() { - return false; - } - - @Override - public ConstraintDefinition getConstraints() { - return null; - } - - @Override - public QName getQName() { - return SchemaContext.NAME; - } - - @Override - public SchemaPath getPath() { - return null; - } - - @Override - public String getDescription() { - return null; - } - - @Override - public String getReference() { - return null; - } - - @Override - public Status getStatus() { - return Status.CURRENT; - } - - @Override - public List getUnknownSchemaNodes() { - final List result = new ArrayList<>(); - for (Module module : modules) { - result.addAll(module.getUnknownSchemaNodes()); - } - return Collections.unmodifiableList(result); - } - - @Override - public Set> getTypeDefinitions() { - final Set> result = new LinkedHashSet<>(); - for (Module module : modules) { - result.addAll(module.getTypeDefinitions()); - } - return Collections.unmodifiableSet(result); - } - - @Override - public Set getChildNodes() { - final Set result = new LinkedHashSet<>(); - for (Module module : modules) { - result.addAll(module.getChildNodes()); - } - return Collections.unmodifiableSet(result); - } - - @Override - public Set getGroupings() { - final Set result = new LinkedHashSet<>(); - for (Module module : modules) { - result.addAll(module.getGroupings()); - } - return Collections.unmodifiableSet(result); - } - - @Override - public DataSchemaNode getDataChildByName(final QName name) { - DataSchemaNode result = null; - for (Module module : modules) { - result = module.getDataChildByName(name); - if (result != null) { - break; - } - } - return result; - } - - @Override - public DataSchemaNode getDataChildByName(final String name) { - DataSchemaNode result = null; - for (Module module : modules) { - result = module.getDataChildByName(name); - if (result != null) { - break; - } - } - return result; - } - - @Override - public Set getUses() { - return Collections.emptySet(); + return modules; } @Override - public boolean isPresenceContainer() { - return false; - } + protected SetMultimap getNamespaceToModules() { - @Override - public Set getAvailableAugmentations() { - return Collections.emptySet(); + return namespaceToModules; } - //FIXME: should work for submodules too @Override - public Set getAllModuleIdentifiers() { - return identifiersToSources.keySet(); - } + protected SetMultimap getNameToModules() { - @Override - public Optional getModuleSource(final ModuleIdentifier moduleIdentifier) { - String maybeSource = identifiersToSources.get(moduleIdentifier); - return Optional.fromNullable(maybeSource); + return nameToModules; } @Override public String toString() { - return "SchemaContextImpl{" + - "modules=" + modules + - '}'; + + return String.format("SchemaContextImpl{modules=%s}", modules); } }