From: Martin Vitez Date: Tue, 12 Nov 2013 13:00:20 +0000 (+0100) Subject: Added serialVersionUID field to classes generated from list key. X-Git-Tag: release/beryllium~726 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=d283fc6ab7b5a847f40c1123024561f39ef08647;p=mdsal.git Added serialVersionUID field to classes generated from list key. Signed-off-by: Martin Vitez --- diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend index 0952b83178..ab532f4842 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend @@ -73,8 +73,9 @@ import org.opendaylight.yangtools.yang.model.api.YangNode import org.opendaylight.yangtools.yang.model.api.NotificationDefinition import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil import org.opendaylight.yangtools.sal.binding.model.api.Restrictions -import org.opendaylight.yangtools.yang.common.QName - +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder +import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.GeneratedPropertyBuilderImpl + public class BindingGeneratorImpl implements BindingGenerator { private final Map genCtx = new HashMap() @@ -264,9 +265,12 @@ public class BindingGeneratorImpl implements BindingGenerator { processUsesAugments(node, module) val List listKeys = listKeys(node); - val genTOBuilder = resolveListKeyTOBuilder(packageName, node); + val genTOBuilder = resolveListKeyTOBuilder(packageName, node); - if (genTOBuilder !== null) { + if (genTOBuilder !== null) { + val GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("serialVersionUID"); + prop.setValue(Long.toString(computeDefaultSUID(genTOBuilder as GeneratedTOBuilderImpl))); + genTOBuilder.setSUID(prop); val identifierMarker = IDENTIFIER.parameterizedTypeFor(genType); val identifiableMarker = IDENTIFIABLE.parameterizedTypeFor(genTOBuilder); genTOBuilder.addImplementsType(identifierMarker); @@ -1745,11 +1749,9 @@ public class BindingGeneratorImpl implements BindingGenerator { private def GeneratedTOBuilder resolveListKeyTOBuilder(String packageName, ListSchemaNode list) { var GeneratedTOBuilder genTOBuilder = null; if ((list.keyDefinition !== null) && (!list.keyDefinition.isEmpty())) { - if (list !== null) { - val listName = list.QName.localName + "Key"; - val String genTOName = parseToClassName(listName); - genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName); - } + val listName = list.QName.localName + "Key"; + val String genTOName = parseToClassName(listName); + genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName); } return genTOBuilder; } diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java index f0b7b808f7..57e319f590 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java @@ -1,14 +1,27 @@ package org.opendaylight.yangtools.binding.generator.util; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl; +import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier; import org.opendaylight.yangtools.sal.binding.model.api.Restrictions; +import org.opendaylight.yangtools.sal.binding.model.api.Type; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.MethodSignatureBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.TypeMemberBuilder; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -327,6 +340,63 @@ public final class BindingGeneratorUtil { return sb.toString(); } + public static long computeDefaultSUID(GeneratedTOBuilderImpl to) { + try { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + DataOutputStream dout = new DataOutputStream(bout); + + dout.writeUTF(to.getName()); + dout.writeInt(to.isAbstract() ? 3 : 7); + + List impl = to.getImplementsTypes(); + Collections.sort(impl, new Comparator() { + @Override + public int compare(Type o1, Type o2) { + return o1.getFullyQualifiedName().compareTo(o2.getFullyQualifiedName()); + } + }); + for (Type ifc : impl) { + dout.writeUTF(ifc.getFullyQualifiedName()); + } + + Comparator> comparator = new Comparator>() { + @Override + public int compare(TypeMemberBuilder o1, TypeMemberBuilder o2) { + return o1.getName().compareTo(o2.getName()); + } + }; + + List props = to.getProperties(); + Collections.sort(props, comparator); + for (GeneratedPropertyBuilder gp : props) { + dout.writeUTF(gp.getName()); + } + + List methods = to.getMethodDefinitions(); + Collections.sort(methods, comparator); + for (MethodSignatureBuilder m : methods) { + if (!(m.getAccessModifier().equals(AccessModifier.PRIVATE))) { + dout.writeUTF(m.getName()); + dout.write(m.getAccessModifier().ordinal()); + } + } + + dout.flush(); + + MessageDigest md = MessageDigest.getInstance("SHA"); + byte[] hashBytes = md.digest(bout.toByteArray()); + long hash = 0; + for (int i = Math.min(hashBytes.length, 8) - 1; i >= 0; i--) { + hash = (hash << 8) | (hashBytes[i] & 0xFF); + } + return hash; + } catch (IOException ex) { + throw new InternalError(); + } catch (NoSuchAlgorithmException ex) { + throw new SecurityException(ex.getMessage()); + } + } + public static Restrictions getRestrictions(TypeDefinition type) { final List length = new ArrayList<>(); final List pattern = new ArrayList<>(); diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java index 3b6d2f3d0f..b3bb742575 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java @@ -7,14 +7,20 @@ */ package org.opendaylight.yangtools.binding.generator.util.generated.type.builder; +import java.util.ArrayList; +import java.util.List; + import org.opendaylight.yangtools.binding.generator.util.AbstractBaseType; import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier; import org.opendaylight.yangtools.sal.binding.model.api.Constant; import org.opendaylight.yangtools.sal.binding.model.api.Type; -import org.opendaylight.yangtools.sal.binding.model.api.type.builder.*; - -import java.util.ArrayList; -import java.util.List; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.EnumBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTOBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilderBase; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.MethodSignatureBuilder; abstract class AbstractGeneratedTypeBuilder> extends AbstractBaseType implements GeneratedTypeBuilderBase { @@ -43,11 +49,11 @@ abstract class AbstractGeneratedTypeBuilder getImplementsTypes() { + public List getImplementsTypes() { return implementsTypes; } @@ -59,7 +65,7 @@ abstract class AbstractGeneratedTypeBuilder getMethodDefinitions() { + public List getMethodDefinitions() { return methodDefinitions; } @@ -239,7 +245,7 @@ abstract class AbstractGeneratedTypeBuilder getProperties() { + public List getProperties() { return properties; } } diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java index 787dda84d9..2b2e0b3f73 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java @@ -8,14 +8,14 @@ package org.opendaylight.yangtools.binding.generator.util.generated.type.builder; +import java.util.Collections; +import java.util.List; + import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier; import org.opendaylight.yangtools.sal.binding.model.api.AnnotationType; import org.opendaylight.yangtools.sal.binding.model.api.Type; import org.opendaylight.yangtools.sal.binding.model.api.TypeMember; -import java.util.Collections; -import java.util.List; - abstract class AbstractTypeMember implements TypeMember { private final String name; @@ -24,11 +24,12 @@ abstract class AbstractTypeMember implements TypeMember { private final Type returnType; private final List annotations; private final boolean isFinal; + private final boolean isStatic; private final AccessModifier accessModifier; public AbstractTypeMember(final Type definingType, final String name, final List annotations, final String comment, final AccessModifier accessModifier, final Type returnType, - boolean isFinal) { + boolean isFinal, boolean isStatic) { super(); this.definingType = definingType; this.name = name; @@ -37,6 +38,7 @@ abstract class AbstractTypeMember implements TypeMember { this.accessModifier = accessModifier; this.returnType = returnType; this.isFinal = isFinal; + this.isStatic = isStatic; } @Override @@ -74,6 +76,11 @@ abstract class AbstractTypeMember implements TypeMember { return isFinal; } + @Override + public boolean isStatic() { + return isStatic; + } + @Override public int hashCode() { final int prime = 31; diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMemberBuilder.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMemberBuilder.java index 02f6820824..7b809ebb01 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMemberBuilder.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMemberBuilder.java @@ -7,21 +7,22 @@ */ package org.opendaylight.yangtools.binding.generator.util.generated.type.builder; +import java.util.ArrayList; +import java.util.List; + import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier; import org.opendaylight.yangtools.sal.binding.model.api.AnnotationType; import org.opendaylight.yangtools.sal.binding.model.api.Type; import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder; import org.opendaylight.yangtools.sal.binding.model.api.type.builder.TypeMemberBuilder; -import java.util.ArrayList; -import java.util.List; - abstract class AbstractTypeMemberBuilder> implements TypeMemberBuilder { private final String name; private Type returnType; private final List annotationBuilders; private String comment = ""; private boolean isFinal; + private boolean isStatic; private AccessModifier accessModifier; public AbstractTypeMemberBuilder(final String name) { @@ -59,7 +60,12 @@ abstract class AbstractTypeMemberBuilder> impleme return isFinal; } - protected AccessModifier getAccessModifier() { + protected boolean isStatic() { + return isStatic; + } + + @Override + public AccessModifier getAccessModifier() { return accessModifier; } @@ -69,7 +75,7 @@ abstract class AbstractTypeMemberBuilder> impleme } protected abstract T thisInstance(); - + @Override public T setReturnType(Type returnType) { if (returnType == null) { @@ -103,6 +109,12 @@ abstract class AbstractTypeMemberBuilder> impleme return thisInstance(); } + @Override + public T setStatic(boolean isStatic) { + this.isStatic = isStatic; + return thisInstance(); + } + protected List toAnnotationTypes() { final List annotations = new ArrayList<>(); for (final AnnotationTypeBuilder annotBuilder : getAnnotationBuilders()) { diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyBuilderImpl.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyBuilderImpl.java index 3089961a2b..e4c8019007 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyBuilderImpl.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyBuilderImpl.java @@ -7,15 +7,15 @@ */ package org.opendaylight.yangtools.binding.generator.util.generated.type.builder; +import java.util.List; + import org.opendaylight.yangtools.sal.binding.model.api.AnnotationType; import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty; import org.opendaylight.yangtools.sal.binding.model.api.Type; import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder; -import java.util.List; - -final class GeneratedPropertyBuilderImpl extends AbstractTypeMemberBuilder implements GeneratedPropertyBuilder { - +public final class GeneratedPropertyBuilderImpl extends AbstractTypeMemberBuilder implements GeneratedPropertyBuilder { + private String value; private boolean isReadOnly; public GeneratedPropertyBuilderImpl(String name) { @@ -23,6 +23,12 @@ final class GeneratedPropertyBuilderImpl extends AbstractTypeMemberBuilder annotations = toAnnotationTypes(); return new GeneratedPropertyImpl(definingType, getName(), annotations, getComment(), getAccessModifier(), - getReturnType(), isFinal(), isReadOnly); + getReturnType(), isFinal(), isStatic(), isReadOnly, value); } @Override diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyImpl.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyImpl.java index 38902cf0a8..2abe75c7d1 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyImpl.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyImpl.java @@ -7,23 +7,29 @@ */ package org.opendaylight.yangtools.binding.generator.util.generated.type.builder; +import java.util.List; + import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier; import org.opendaylight.yangtools.sal.binding.model.api.AnnotationType; import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty; import org.opendaylight.yangtools.sal.binding.model.api.Type; -import java.util.List; - final class GeneratedPropertyImpl extends AbstractTypeMember implements GeneratedProperty { - + private String value; private boolean isReadOnly; public GeneratedPropertyImpl(Type definingType, String name, List annotations, String comment, - AccessModifier accessModifier, Type returnType, boolean isFinal, boolean isReadOnly) { - super(definingType, name, annotations, comment, accessModifier, returnType, isFinal); + AccessModifier accessModifier, Type returnType, boolean isFinal, boolean isStatic, boolean isReadOnly, String value) { + super(definingType, name, annotations, comment, accessModifier, returnType, isFinal, isStatic); + this.value = value; this.isReadOnly = isReadOnly; } + @Override + public String getValue() { + return value; + } + @Override public boolean isReadOnly() { return isReadOnly; diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java index 3b45b342a6..9a78eabf82 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java @@ -27,6 +27,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder toStringProperties = new ArrayList<>(); private boolean isUnionType = false; private Restrictions restrictions; + private GeneratedPropertyBuilder SUID; public GeneratedTOBuilderImpl(String packageName, String name) { super(packageName, name); @@ -91,6 +92,11 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder annotations = toAnnotationTypes(); return new MethodSignatureImpl(definingType, getName(), annotations, getComment(), getAccessModifier(), - getReturnType(), parameters, isFinal(), isAbstract); + getReturnType(), parameters, isFinal(), isAbstract, isStatic()); } @Override diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/MethodSignatureImpl.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/MethodSignatureImpl.java index 1351df3ad4..9672b4d221 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/MethodSignatureImpl.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/MethodSignatureImpl.java @@ -7,14 +7,14 @@ */ package org.opendaylight.yangtools.binding.generator.util.generated.type.builder; +import java.util.Collections; +import java.util.List; + import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier; import org.opendaylight.yangtools.sal.binding.model.api.AnnotationType; import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature; import org.opendaylight.yangtools.sal.binding.model.api.Type; -import java.util.Collections; -import java.util.List; - class MethodSignatureImpl extends AbstractTypeMember implements MethodSignature { private final List params; @@ -24,8 +24,8 @@ class MethodSignatureImpl extends AbstractTypeMember implements MethodSignature final List annotations, final String comment, final AccessModifier accessModifier, final Type returnType, final List params, boolean isFinal, - boolean isAbstract) { - super(definingType, name, annotations, comment, accessModifier, returnType, isFinal); + boolean isAbstract, boolean isStatic) { + super(definingType, name, annotations, comment, accessModifier, returnType, isFinal, isStatic); this.params = Collections.unmodifiableList(params); this.isAbstract = isAbstract; } diff --git a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend index d3931f9325..458b8114e0 100644 --- a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend +++ b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend @@ -64,11 +64,8 @@ class ClassTemplate extends BaseTemplate { this.consts = genType.constantDefinitions this.enclosedGeneratedTypes = genType.enclosedTypes } - - - - + /** * Generates JAVA class source code (class body only). * @@ -77,9 +74,8 @@ class ClassTemplate extends BaseTemplate { def CharSequence generateAsInnerClass() { return generateBody(true) } - - + override protected body() { generateBody(false); } @@ -93,7 +89,8 @@ class ClassTemplate extends BaseTemplate { def protected generateBody(boolean isInnerClass) ''' «type.comment.asJavadoc» «generateClassDeclaration(isInnerClass)» { - «innerClassesDeclarations» + «suidDeclaration» + «innerClassesDeclarations» «enumDeclarations» «constantsDeclarations» «generateFields» @@ -115,8 +112,8 @@ class ClassTemplate extends BaseTemplate { } ''' - - + + /** * Template method which generates inner classes inside this interface. * @@ -253,7 +250,13 @@ class ClassTemplate extends BaseTemplate { «ENDFOR» «ENDIF» ''' - + + def protected suidDeclaration() ''' + «IF genTO.SUID != null» + private static final long serialVersionUID = «genTO.SUID.value»L; + «ENDIF» + ''' + /** * Template method wich generates JAVA constants. * diff --git a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java index 78040bdef0..4a85e05127 100644 --- a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java +++ b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java @@ -13,6 +13,7 @@ import static org.opendaylight.yangtools.sal.java.api.generator.test.Compilation import java.io.File; import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.WildcardType; @@ -99,12 +100,16 @@ public class CompilationTest extends BaseCompilationTest { // test generated 'list links' assertTrue(linksClass.isInterface()); - // FIXME: anyxml + // TODO: anyxml assertEquals(5, linksClass.getDeclaredMethods().length); testImplementsIfc(linksClass, keyArgsClass); // Test list key constructor arguments ordering assertContainsConstructor(linksKeyClass, Byte.class, String.class, Integer.class); + // Test serialVersionUID generation + Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE); + suid.setAccessible(true); + assertEquals(9028898643007565383L, suid.getLong(null)); cleanUp(sourcesOutputDir, compiledOutputDir); } diff --git a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTestUtils.java b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTestUtils.java index 1358921fb5..c20a52dbb0 100644 --- a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTestUtils.java +++ b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTestUtils.java @@ -54,10 +54,11 @@ public class CompilationTestUtils { } } - static void assertContainsField(Class clazz, String name, Class type) { + static Field assertContainsField(Class clazz, String name, Class type) { try { Field f = clazz.getDeclaredField(name); assertEquals(type, f.getType()); + return f; } catch (NoSuchFieldException e) { throw new AssertionError("Field " + name + " does not exists in class " + clazz.getSimpleName()); } diff --git a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedProperty.java b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedProperty.java index 1034261b76..0464db43bf 100644 --- a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedProperty.java +++ b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedProperty.java @@ -12,16 +12,18 @@ package org.opendaylight.yangtools.sal.binding.model.api; * The Generated Property interface is designed to store information of fields * (or members) declared in Java Transfer Objects (or any java classes) and * their access counterparts (getters and setters). - * + * * @see MethodSignature */ public interface GeneratedProperty extends TypeMember { + String getValue(); + /** * Returns true if the property si declared as read-only.
* If the property has flag isReadOnly == true the property * SHOULD be generated as getter only. - * + * * @return true if the property si declared as read-only. */ boolean isReadOnly(); diff --git a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedTransferObject.java b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedTransferObject.java index f26b4cab27..39fd61db5e 100644 --- a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedTransferObject.java +++ b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedTransferObject.java @@ -24,6 +24,8 @@ import java.util.List; */ public interface GeneratedTransferObject extends GeneratedType { + GeneratedProperty getSUID(); + /** * Returns the extending Generated Transfer Object or null if * there is no extending Generated Transfer Object. diff --git a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/TypeMember.java b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/TypeMember.java index 74c74990cc..2447e21fee 100644 --- a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/TypeMember.java +++ b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/TypeMember.java @@ -9,54 +9,65 @@ package org.opendaylight.yangtools.sal.binding.model.api; import java.util.List; +/** + * Common interface for variables and methods in class. + */ public interface TypeMember { + /** + * Returns comment string associated with member. + * + * @return comment string associated with member. + */ + String getComment(); + /** * Returns List of annotation definitions associated with generated type. - * + * * @return List of annotation definitions associated with generated type. */ List getAnnotations(); /** - * Returns the name of method. - * - * @return the name of method. + * Returns the access modifier of member. + * + * @return the access modifier of member. */ - String getName(); + AccessModifier getAccessModifier(); /** - * Returns comment string associated with method. - * - * @return comment string associated with method. + * Returns true if member is declared as static. + * + * @return true if member is declared as static. */ - String getComment(); + boolean isStatic(); /** - * Returns the Type that declares method. - * - * @return the Type that declares method. + * Returns true if member is declared as final. + * + * @return true if member is declared as final. */ - Type getDefiningType(); + boolean isFinal(); /** - * Returns the access modifier of method. - * - * @return the access modifier of method. + * Get the returning Type of member. + * + * @return the returning Type of member. */ - AccessModifier getAccessModifier(); + Type getReturnType(); /** - * Returns the returning Type that methods returns. - * - * @return the returning Type that methods returns. + * Returns the name of member. + * + * @return the name of member. */ - Type getReturnType(); + String getName(); /** - * Returns true if method is declared as final. - * - * @return true if method is declared as final. + * Returns the Type that declares member. + * + * @return the Type that declares member. */ - boolean isFinal(); + Type getDefiningType(); + } diff --git a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedPropertyBuilder.java b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedPropertyBuilder.java index 6cadfdd391..cd4b9b4575 100644 --- a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedPropertyBuilder.java +++ b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedPropertyBuilder.java @@ -13,15 +13,17 @@ import org.opendaylight.yangtools.sal.binding.model.api.Type; /** * Generated Property Builder is interface that contains methods to build and * instantiate Generated Property definition. - * + * * @see GeneratedProperty */ public interface GeneratedPropertyBuilder extends TypeMemberBuilder { + GeneratedPropertyBuilder setValue(String value); + /** * Sets isReadOnly flag for property. If property is marked as read only it * is the same as set property in java as final. - * + * * @param isReadOnly * Read Only property flag. */ @@ -34,7 +36,7 @@ public interface GeneratedPropertyBuilder extends TypeMemberBuilderclass definition. In case that defining Type will be passed * as null reference the method SHOULD thrown * {@link IllegalArgumentException}. - * + * * @param definingType * Defining Type of Generated Property * @return new immutable instance of Generated Property. diff --git a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedTOBuilder.java b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedTOBuilder.java index 0f12f78008..805b1b64ae 100644 --- a/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedTOBuilder.java +++ b/code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedTOBuilder.java @@ -81,4 +81,6 @@ public interface GeneratedTOBuilder extends GeneratedTypeBuilderBase> { * Neither the package name or annotation name can contain null * references. In case that any of parameters contains null the * method SHOULD thrown {@link IllegalArgumentException} - * + * * @param packageName * Package Name of Annotation Type * @param name @@ -25,7 +25,7 @@ public interface TypeMemberBuilder> { /** * Returns the name of property. - * + * * @return the name of property. */ String getName(); @@ -34,15 +34,17 @@ public interface TypeMemberBuilder> { * Adds return Type into Builder definition for Generated Property.
* The return Type MUST NOT be null, otherwise the method * SHOULD throw {@link IllegalArgumentException} - * + * * @param returnType * Return Type of property. */ T setReturnType(final Type returnType); + AccessModifier getAccessModifier(); + /** * Sets the access modifier of property. - * + * * @param modifier * Access Modifier value. */ @@ -52,7 +54,7 @@ public interface TypeMemberBuilder> { * Adds String definition of comment into Method Signature definition.
* The comment String MUST NOT contain anny comment specific chars (i.e. * "/**" or "//") just plain String text description. - * + * * @param comment * Comment String. */ @@ -63,9 +65,11 @@ public interface TypeMemberBuilder> { * be prohibited from overriding.
* This setting is irrelevant for methods designated to be defined in * interface definitions because interface can't have final method. - * + * * @param isFinal * Is Final */ T setFinal(final boolean isFinal); + + T setStatic(final boolean isStatic); }