--- /dev/null
+/*
+ * Copyright (c) 2017 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.binding.javav2.model.api;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Java interface for builders to get package name and so on.
+ */
+@Beta
+public interface GeneratedTypeForBuilder {
+ /**
+ * Returns name of the package that builder class belongs to.
+ *
+ * @return name of the package that builder class belongs to
+ */
+ String getPackageNameForBuilder();
+
+}
*/
void setModuleName(String moduleName);
+ /**
+ * Set the base package name of the module, used to generate package name for
+ * builders by reusing the original package name.
+ *
+ * @param basePackageName
+ * the base package name of the module
+ */
+ void setBasePackageName(String basePackageName);
+
/**
* Set a list of QNames which represent schema path in schema tree from
* actual concrete type to the root.
moduleBuilder.setDescription(createDescription(module, verboseClassComments));
moduleBuilder.setReference(module.getReference());
moduleBuilder.setModuleName(moduleName);
-
+ moduleBuilder.setBasePackageName(packageName);
return moduleBuilder;
}
augTypeBuilder.addImplementsType(BindingTypes.TREE_NODE);
augTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, augTypeBuilder));
augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef));
+ augTypeBuilder.setBasePackageName(BindingMapping.getRootPackageName(module));
annotateDeprecatedIfNecessary(augSchema.getStatus(), augTypeBuilder);
//produces getters for augTypeBuilder eventually
newType.setReference(schemaNode.getReference());
newType.setSchemaPath((List<QName>) schemaNode.getPath().getPathFromRoot());
newType.setModuleName(module.getName());
+ newType.setBasePackageName(BindingMapping.getRootPackageName(module));
if (!genTypeBuilders.containsKey(packageName)) {
final Map<String, GeneratedTypeBuilder> builders = new HashMap<>();
import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
import org.opendaylight.mdsal.binding.javav2.model.api.Type;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable;
import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentation;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
when(module.getNamespace()).thenReturn(qnamePath.getNamespace());
final String pckgName = "test.augment.choice.cases";
final Type targetType = mock(Type.class);
+ when(targetType.getFullyQualifiedName()).thenReturn(Augmentable.class.getName());
final Set<DataSchemaNode> augmentNodes = new HashSet<>();
final ChoiceCaseNode caseNode = mock(ChoiceCaseNode.class);
when(caseNode.getPath()).thenReturn(path);
when(module.getNamespace()).thenReturn(qnamePath.getNamespace());
final String pckgName = "test.augment.choice.cases";
final Type targetType = mock(Type.class);
+ when(targetType.getFullyQualifiedName()).thenReturn(Augmentable.class.getName());
final Set<DataSchemaNode> augmentNodes = new HashSet<>();
final ChoiceCaseNode caseNode = mock(ChoiceCaseNode.class);
when(caseNode.getPath()).thenReturn(path);
--- /dev/null
+module namespace-test-dto {
+ namespace "org.test.namespace.dto";
+ prefix "dto";
+ revision 2017-05-19;
+
+ container a {
+ container b {
+ leaf leaf-b {
+ type string;
+ }
+ }
+ }
+
+ grouping c {
+ container d {
+ leaf leaf-d {
+ type string;
+ }
+ }
+ }
+}
\ No newline at end of file
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilderBase;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
+import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable;
+import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentation;
import org.opendaylight.yangtools.util.LazyCollections;
@Beta
private String comment = "";
private boolean isAbstract;
private Type parentTypeForBuilder;
+ private boolean isDataObjectType = false;
+ private String basePackageName = null;
protected AbstractGeneratedTypeBuilder(final String packageName, final String name) {
super(packageName, name);
return enclosedTransferObjects;
}
+ protected boolean isDataObjectType() {
+ return isDataObjectType;
+ }
+
+ protected String getBasePackageName() {
+ return basePackageName;
+ }
+
protected abstract T thisInstance();
@Override
return thisInstance();
}
+ @Override
+ public void setBasePackageName(String basePackageName) {
+ this.basePackageName = basePackageName;
+ }
+
@Override
public T addImplementsType(final Type genType) {
Preconditions.checkArgument(genType != null, "Type cannot be null");
Preconditions.checkArgument(!implementsTypes.contains(genType), "This generated type already contains equal implements type.");
implementsTypes = LazyCollections.lazyAdd(implementsTypes, genType);
+
+ if (genType.getFullyQualifiedName().equals(Augmentable.class.getName())
+ || genType.getFullyQualifiedName().equals(Augmentation.class.getName())) {
+ this.isDataObjectType = true;
+ }
return thisInstance();
}
import com.google.common.annotations.Beta;
import java.util.List;
import java.util.Optional;
+import com.google.common.base.Preconditions;
+import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
import org.opendaylight.yangtools.yang.common.QName;
@Beta
@Override
public GeneratedType toInstance() {
- return new GeneratedTypeImpl(this);
+ if (this.isDataObjectType()) {
+ return new GeneratedTypeWithBuilderImpl(this);
+ } else {
+ return new GeneratedTypeImpl(this);
+ }
}
@Override
return this;
}
- private static final class GeneratedTypeImpl extends AbstractGeneratedType {
+ private static class GeneratedTypeImpl extends AbstractGeneratedType {
private final String description;
private final String reference;
return moduleName;
}
}
+
+ private static final class GeneratedTypeWithBuilderImpl extends GeneratedTypeImpl
+ implements GeneratedTypeForBuilder {
+
+ private final String basePackageName;
+ private final String builderPackageName;
+
+ public GeneratedTypeWithBuilderImpl(GeneratedTypeBuilderImpl builder) {
+ super(builder);
+ this.basePackageName = builder.getBasePackageName();
+ this.builderPackageName = generatePackageNameForBuilder();
+ }
+
+ private String generatePackageNameForBuilder() {
+ Preconditions.checkArgument(this.basePackageName != null);
+ String normalizeBasePackageName = JavaIdentifierNormalizer.normalizeFullPackageName(this.basePackageName);
+
+ if (!normalizeBasePackageName.equals(this.getPackageName())) {
+ final String baseName = new StringBuilder(normalizeBasePackageName)
+ .append(".").append(BindingNamespaceType.Data.getPackagePrefix()).toString();
+
+ Preconditions.checkState(this.getPackageName().contains(baseName),
+ "Package name does not contain base name!");
+
+ return new StringBuilder(normalizeBasePackageName)
+ .append(".")
+ .append(BindingNamespaceType.Builder.getPackagePrefix())
+ .append(this.getPackageName().substring(baseName.length()))
+ .toString();
+ } else {
+ return new StringBuilder(normalizeBasePackageName)
+ .append(".").append(BindingNamespaceType.Builder.getPackagePrefix()).toString();
+ }
+ }
+
+ @Override
+ public String getPackageNameForBuilder() {
+ return this.builderPackageName;
+ }
+ }
}
import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
import org.opendaylight.mdsal.binding.javav2.model.api.Type;
import org.opendaylight.mdsal.binding.javav2.model.api.UnitName;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonatype.plexus.build.incremental.BuildContext;
LOG.error("Cannot generate Type into Java File because " + "Code Generator instance is NULL!");
throw new IllegalArgumentException("Code Generator Cannot be NULL!");
}
- final File packageDir = packageToDirectory(parentDir, type.getPackageName());
-
- if (!packageDir.exists()) {
- packageDir.mkdirs();
- }
if (generator.isAcceptable(type)) {
+ File packageDir;
+ if (generator instanceof BuilderGenerator) {
+ Preconditions.checkState(type instanceof GeneratedTypeForBuilder);
+ packageDir = packageToDirectory(parentDir, ((GeneratedTypeForBuilder)type).getPackageNameForBuilder());
+ } else {
+ packageDir = packageToDirectory(parentDir, type.getPackageName());
+ }
+
+ if (!packageDir.exists()) {
+ packageDir.mkdirs();
+ }
+
final String generatedCode = JavaCodePrettyPrint.perform(generator.generate(type));
Preconditions.checkState(!generatedCode.isEmpty(), "Generated code should not be empty!");
final File file = new File(packageDir, ((UnitName) generator.getUnitName(type)).getValue() + ".java");