*/
package org.opendaylight.mdsal.binding.generator.impl;
+import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
import com.google.common.collect.BiMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import javax.annotation.concurrent.NotThreadSafe;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.model.api.GeneratedType;
import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.Type;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.yangtools.concepts.Mutable;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@NotThreadSafe
-public final class ModuleContext {
+/**
+ * Utility class for building up Binding mapping information. This class is NOT thread-safe.
+ */
+public final class ModuleContext implements Mutable {
private static final Logger LOG = LoggerFactory.getLogger(ModuleContext.class);
private final BiMap<Type, AugmentationSchemaNode> typeToAugmentation = HashBiMap.create();
private final List<GeneratedTypeBuilder> augmentations = new ArrayList<>();
private final Multimap<Type, Type> choiceToCases = HashMultimap.create();
private final Set<GeneratedTypeBuilder> topLevelNodes = new HashSet<>();
+ private final Map<SchemaPath, JavaTypeName> aliases = new HashMap<>();
private final Map<Type, WithStatus> typeToSchema = new HashMap<>();
private final List<GeneratedTOBuilder> genTOs = new ArrayList<>();
private final Map<SchemaPath, Type> innerTypes = new HashMap<>();
private final Map<JavaTypeName, SchemaNode> nameMapping = new HashMap<>();
private GeneratedTypeBuilder moduleNode;
+ private JavaTypeName moduleInfoType;
private String modulePackageName;
ModuleContext(final Module module) {
return module;
}
- String modulePackageName() {
+ @NonNull String modulePackageName() {
String ret = modulePackageName;
if (ret == null) {
modulePackageName = ret = BindingMapping.getRootPackageName(module.getQNameModule());
return ret;
}
+ @NonNull JavaTypeName moduleInfoType() {
+ JavaTypeName ret = moduleInfoType;
+ if (ret == null) {
+ moduleInfoType = ret = JavaTypeName.create(modulePackageName(), BindingMapping.MODULE_INFO_CLASS_NAME);
+ }
+ return ret;
+ }
+
List<Type> getGeneratedTypes() {
List<Type> result = new ArrayList<>();
genTOs.add(builder);
}
+ @NonNull GeneratedType addAliasType(final ModuleContext sourceContext, final ContainerSchemaNode source,
+ final ContainerSchemaNode alias) {
+ final GeneratedTypeBuilder builder = sourceContext.getChildNode(source.getPath());
+ checkState(builder != null, "Could not find builder for %s", source);
+
+ final JavaTypeName id = builder.getIdentifier();
+ final SchemaPath path = alias.getPath();
+ final JavaTypeName prev = aliases.putIfAbsent(path, id);
+ checkState(prev == null, "Type aliasing conflict on %s: %s vs %s", path, prev, id);
+
+ return builder.build();
+ }
+
+ @Nullable JavaTypeName getAlias(final SchemaPath path) {
+ return aliases.get(path);
+ }
+
public void addChildNodeType(final SchemaNode def, final GeneratedTypeBuilder builder) {
checkNamingConflict(def, builder.getIdentifier());
childNodes.put(def.getPath(), builder);