/* * 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.mdsal.binding2.generator.impl; import com.google.common.annotations.Beta; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.opendaylight.mdsal.binding2.model.api.Type; import org.opendaylight.mdsal.binding2.model.api.type.builder.EnumBuilder; import org.opendaylight.mdsal.binding2.model.api.type.builder.GeneratedTOBuilder; import org.opendaylight.mdsal.binding2.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; /** * This class holds information about generated entities in context of YANG module */ @Beta final class ModuleContext { private GeneratedTypeBuilder moduleNode; private final List genTOs = new ArrayList<>(); private final Map typedefs = new HashMap<>(); private final Map childNodes = new HashMap<>(); private final Map groupings = new HashMap<>(); private final Map cases = new HashMap<>(); private final Map identities = new HashMap<>(); private final Set topLevelNodes = new HashSet<>(); private final List augmentations = new ArrayList<>(); private final BiMap typeToAugmentation = HashBiMap.create(); private final Map typeToSchema = new HashMap<>(); private final Multimap choiceToCases = HashMultimap.create(); private final BiMap caseTypeToSchema = HashBiMap.create(); private final Map innerTypes = new HashMap<>(); List getGeneratedTypes() { List result = new ArrayList<>(); if (moduleNode != null) { result.add(moduleNode.toInstance()); } result.addAll(genTOs.stream().map(GeneratedTOBuilder::toInstance).collect(Collectors.toList())); result.addAll(typedefs.values().stream().filter(b -> b != null).collect(Collectors.toList())); result.addAll(childNodes.values().stream().map(GeneratedTypeBuilder::toInstance).collect(Collectors.toList())); result.addAll(groupings.values().stream().map(GeneratedTypeBuilder::toInstance).collect(Collectors.toList())); result.addAll(cases.values().stream().map(GeneratedTypeBuilder::toInstance).collect(Collectors.toList())); result.addAll(identities.values().stream().map(GeneratedTOBuilder::toInstance).collect(Collectors.toList())); result.addAll(topLevelNodes.stream().map(GeneratedTypeBuilder::toInstance).collect(Collectors.toList())); result.addAll(augmentations.stream().map(GeneratedTypeBuilder::toInstance).collect(Collectors.toList())); return ImmutableList.copyOf(result); } public Multimap getChoiceToCases() { return Multimaps.unmodifiableMultimap(choiceToCases); } public GeneratedTypeBuilder getModuleNode() { return moduleNode; } public GeneratedTypeBuilder getChildNode(final SchemaPath p) { return childNodes.get(p); } public GeneratedTypeBuilder getGrouping(final SchemaPath p) { return groupings.get(p); } public GeneratedTypeBuilder getCase(final SchemaPath p) { return cases.get(p); } public void addModuleNode(final GeneratedTypeBuilder moduleNode) { this.moduleNode = moduleNode; } public void addGeneratedTOBuilder(final GeneratedTOBuilder b) { genTOs.add(b); } public void addChildNodeType(final SchemaNode p, final GeneratedTypeBuilder b) { childNodes.put(p.getPath(), b); typeToSchema.put(b,p); } public void addGroupingType(final SchemaPath p, final GeneratedTypeBuilder b) { groupings.put(p, b); } public void addTypedefType(final SchemaPath p, final Type t) { typedefs.put(p, t); } public void addCaseType(final SchemaPath p, final GeneratedTypeBuilder b) { cases.put(p, b); } public void addIdentityType(final QName name,final GeneratedTOBuilder b) { identities.put(name,b); } public void addTopLevelNodeType(final GeneratedTypeBuilder b) { topLevelNodes.add(b); } public void addAugmentType(final GeneratedTypeBuilder b) { augmentations.add(b); } public Map getTypedefs() { return typedefs; } public Map getChildNodes() { return Collections.unmodifiableMap(childNodes); } public Map getGroupings() { return Collections.unmodifiableMap(groupings); } public Map getCases() { return Collections.unmodifiableMap(cases); } public Map getIdentities() { return Collections.unmodifiableMap(identities); } public Set getTopLevelNodes() { return Collections.unmodifiableSet(topLevelNodes); } public List getAugmentations() { return Collections.unmodifiableList(augmentations); } public BiMap getTypeToAugmentation() { return Maps.unmodifiableBiMap(typeToAugmentation); } public void addTypeToAugmentation(final GeneratedTypeBuilder builder, final AugmentationSchema schema) { typeToAugmentation.put(builder, schema); typeToSchema.put(builder, schema); } public void addChoiceToCaseMapping(final Type choiceType, final Type caseType, final ChoiceCaseNode schema) { choiceToCases.put(choiceType, caseType); caseTypeToSchema.put(caseType, schema); typeToSchema.put(caseType, schema); } public BiMap getCaseTypeToSchemas() { return Maps.unmodifiableBiMap(caseTypeToSchema); } /** * * Returns mapping of type to its schema. * * Valid values are only instances of {@link DataSchemaNode} or {@link AugmentationSchema} * * @return Mapping from type to corresponding schema */ public Map getTypeToSchema() { return Collections.unmodifiableMap(typeToSchema); } protected void addTypeToSchema(Type type, TypeDefinition typedef) { typeToSchema.put(type, typedef); } /** * Adds mapping between schema path and inner enum. * * @param path * @param enumBuilder */ void addInnerTypedefType(SchemaPath path, EnumBuilder enumBuilder) { innerTypes.put(path, enumBuilder); } public Type getInnerType(SchemaPath path) { return innerTypes.get(path); } }