Added serialVersionUID field to classes generated from list key. 63/2663/1
authorMartin Vitez <mvitez@cisco.com>
Tue, 12 Nov 2013 13:00:20 +0000 (14:00 +0100)
committerMartin Vitez <mvitez@cisco.com>
Tue, 12 Nov 2013 13:00:20 +0000 (14:00 +0100)
Signed-off-by: Martin Vitez <mvitez@cisco.com>
19 files changed:
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMemberBuilder.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyBuilderImpl.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedPropertyImpl.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/MethodSignatureBuilderImpl.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/MethodSignatureImpl.java
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTestUtils.java
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedProperty.java
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedTransferObject.java
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/TypeMember.java
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedPropertyBuilder.java
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedTOBuilder.java
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/TypeMemberBuilder.java

index 0952b83178b99f826037d3e02e0e60c90f3cf122..ab532f48425984b988b4260da39931ad1ecb16e5 100644 (file)
@@ -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\r
-\r
+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<Module, ModuleContext> genCtx = new HashMap()
@@ -264,9 +265,12 @@ public class BindingGeneratorImpl implements BindingGenerator {
         processUsesAugments(node, module)
 
         val List<String> listKeys = listKeys(node);
-        val genTOBuilder = resolveListKeyTOBuilder(packageName, node);
+        val genTOBuilder = resolveListKeyTOBuilder(packageName, node);\r
 
-        if (genTOBuilder !== null) {
+        if (genTOBuilder !== null) {\r
+            val GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("serialVersionUID");\r
+            prop.setValue(Long.toString(computeDefaultSUID(genTOBuilder as GeneratedTOBuilderImpl)));\r
+            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;
     }
index f0b7b808f788f9f196112efc238545a1ad260ea0..57e319f5904aacbf7146988bbd99136d40b52742 100644 (file)
@@ -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<Type> impl = to.getImplementsTypes();
+            Collections.sort(impl, new Comparator<Type>() {
+                @Override
+                public int compare(Type o1, Type o2) {
+                    return o1.getFullyQualifiedName().compareTo(o2.getFullyQualifiedName());
+                }
+            });
+            for (Type ifc : impl) {
+                dout.writeUTF(ifc.getFullyQualifiedName());
+            }
+
+            Comparator<TypeMemberBuilder<?>> comparator = new Comparator<TypeMemberBuilder<?>>() {
+                @Override
+                public int compare(TypeMemberBuilder<?> o1, TypeMemberBuilder<?> o2) {
+                    return o1.getName().compareTo(o2.getName());
+                }
+            };
+
+            List<GeneratedPropertyBuilder> props = to.getProperties();
+            Collections.sort(props, comparator);
+            for (GeneratedPropertyBuilder gp : props) {
+                dout.writeUTF(gp.getName());
+            }
+
+            List<MethodSignatureBuilder> 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<LengthConstraint> length = new ArrayList<>();
         final List<PatternConstraint> pattern = new ArrayList<>();
index 3b6d2f3d0fb8dea7c08ad8904437595c5db14937..b3bb7425754fb996bc774980c25af7fb157f8965 100644 (file)
@@ -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<T extends GeneratedTypeBuilderBase<T>> extends AbstractBaseType implements
         GeneratedTypeBuilderBase<T> {
@@ -43,11 +49,11 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return annotationBuilders;
     }
 
-    protected boolean isAbstract() {
+    public boolean isAbstract() {
         return isAbstract;
     }
 
-    protected List<Type> getImplementsTypes() {
+    public List<Type> getImplementsTypes() {
         return implementsTypes;
     }
 
@@ -59,7 +65,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return constants;
     }
 
-    protected List<MethodSignatureBuilder> getMethodDefinitions() {
+    public List<MethodSignatureBuilder> getMethodDefinitions() {
         return methodDefinitions;
     }
 
@@ -239,7 +245,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return null;
     }
 
-    protected List<GeneratedPropertyBuilder> getProperties() {
+    public List<GeneratedPropertyBuilder> getProperties() {
         return properties;
     }
 }
index 787dda84d92f5ee0d3f6033c33db09765c7f68aa..2b2e0b3f738205730fc61bbd6b1e6f52f81edee0 100644 (file)
@@ -8,14 +8,14 @@
 package org.opendaylight.yangtools.binding.generator.util.generated.type.builder;\r
 \r
 \r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
 import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier;\r
 import org.opendaylight.yangtools.sal.binding.model.api.AnnotationType;\r
 import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
 import org.opendaylight.yangtools.sal.binding.model.api.TypeMember;\r
 \r
-import java.util.Collections;\r
-import java.util.List;\r
-\r
 abstract class AbstractTypeMember implements TypeMember {\r
 \r
     private final String name;\r
@@ -24,11 +24,12 @@ abstract class AbstractTypeMember implements TypeMember {
     private final Type returnType;\r
     private final List<AnnotationType> annotations;\r
     private final boolean isFinal;\r
+    private final boolean isStatic;\r
     private final AccessModifier accessModifier;\r
 \r
     public AbstractTypeMember(final Type definingType, final String name,  final List<AnnotationType> annotations,\r
                               final String comment, final AccessModifier accessModifier, final Type returnType,\r
-                              boolean isFinal) {\r
+                              boolean isFinal, boolean isStatic) {\r
         super();\r
         this.definingType = definingType;\r
         this.name = name;\r
@@ -37,6 +38,7 @@ abstract class AbstractTypeMember implements TypeMember {
         this.accessModifier = accessModifier;\r
         this.returnType = returnType;\r
         this.isFinal = isFinal;\r
+        this.isStatic = isStatic;\r
     }\r
 \r
     @Override\r
@@ -74,6 +76,11 @@ abstract class AbstractTypeMember implements TypeMember {
         return isFinal;\r
     }\r
 \r
+    @Override\r
+    public boolean isStatic() {\r
+        return isStatic;\r
+    }\r
+\r
     @Override\r
     public int hashCode() {\r
         final int prime = 31;\r
index 02f6820824393928bb308d1fe67197b0310b122d..7b809ebb0182d7feea4aaddd74786ed36c3a970a 100644 (file)
@@ -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<T extends TypeMemberBuilder<T>> implements TypeMemberBuilder<T> {
     private final String name;
     private Type returnType;
     private final List<AnnotationTypeBuilder> 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<T extends TypeMemberBuilder<T>> impleme
         return isFinal;
     }
 
-    protected AccessModifier getAccessModifier() {
+    protected boolean isStatic() {
+        return isStatic;
+    }
+
+    @Override
+    public AccessModifier getAccessModifier() {
         return accessModifier;
     }
 
@@ -69,7 +75,7 @@ abstract class AbstractTypeMemberBuilder<T extends TypeMemberBuilder<T>> impleme
     }
 
     protected abstract T thisInstance();
-    
+
     @Override
     public T setReturnType(Type returnType) {
         if (returnType == null) {
@@ -103,6 +109,12 @@ abstract class AbstractTypeMemberBuilder<T extends TypeMemberBuilder<T>> impleme
         return thisInstance();
     }
 
+    @Override
+    public T setStatic(boolean isStatic) {
+        this.isStatic = isStatic;
+        return thisInstance();
+    }
+
     protected List<AnnotationType> toAnnotationTypes() {
         final List<AnnotationType> annotations = new ArrayList<>();
         for (final AnnotationTypeBuilder annotBuilder : getAnnotationBuilders()) {
index 3089961a2b7e70bd71a62696af122e4cdd0c78c3..e4c80190078e0c1d0a7d25ad2079207f95cecfa0 100644 (file)
@@ -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<GeneratedPropertyBuilder> implements GeneratedPropertyBuilder {
-
+public final class GeneratedPropertyBuilderImpl extends AbstractTypeMemberBuilder<GeneratedPropertyBuilder> implements GeneratedPropertyBuilder {
+    private String value;
     private boolean isReadOnly;
 
     public GeneratedPropertyBuilderImpl(String name) {
@@ -23,6 +23,12 @@ final class GeneratedPropertyBuilderImpl extends AbstractTypeMemberBuilder<Gener
         this.isReadOnly = true;
     }
 
+    @Override
+    public GeneratedPropertyBuilderImpl setValue(String value) {
+        this.value = value;
+        return this;
+    }
+
     @Override
     public GeneratedPropertyBuilderImpl setReadOnly(boolean isReadOnly) {
         this.isReadOnly = isReadOnly;
@@ -33,12 +39,12 @@ final class GeneratedPropertyBuilderImpl extends AbstractTypeMemberBuilder<Gener
     protected GeneratedPropertyBuilderImpl thisInstance() {
         return this;
     }
-    
+
     @Override
     public GeneratedProperty toInstance(Type definingType) {
         final List<AnnotationType> annotations = toAnnotationTypes();
         return new GeneratedPropertyImpl(definingType, getName(), annotations, getComment(), getAccessModifier(),
-                getReturnType(), isFinal(), isReadOnly);
+                getReturnType(), isFinal(), isStatic(), isReadOnly, value);
     }
 
     @Override
index 38902cf0a814e0a99e7626a49a0a124f8939b33b..2abe75c7d1d29f27ca340466c570947438addbd9 100644 (file)
@@ -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<AnnotationType> 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;
index 3b45b342a689424682c0e07115c85a6a35f3cbaa..9a78eabf820ea235dc4844b9c4499fe2d85603e6 100644 (file)
@@ -27,6 +27,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
     private final List<GeneratedPropertyBuilder> toStringProperties = new ArrayList<>();\r
     private boolean isUnionType = false;\r
     private Restrictions restrictions;\r
+    private GeneratedPropertyBuilder SUID;\r
 \r
     public GeneratedTOBuilderImpl(String packageName, String name) {\r
         super(packageName, name);\r
@@ -91,6 +92,11 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
         this.restrictions = restrictions;\r
     }\r
 \r
+    @Override\r
+    public void setSUID(GeneratedPropertyBuilder suid) {\r
+        this.SUID = suid;\r
+    }\r
+\r
     @Override\r
     public GeneratedTransferObject toInstance() {\r
         return new GeneratedTransferObjectImpl(this);\r
@@ -139,6 +145,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
         private final GeneratedTransferObject extendsType;\r
         private final boolean isUnionType;\r
         private final Restrictions restrictions;\r
+        private final GeneratedProperty SUID;\r
 \r
         public GeneratedTransferObjectImpl(GeneratedTOBuilderImpl builder) {\r
             super(builder);\r
@@ -148,6 +155,11 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
             this.stringProperties = toUnmodifiableProperties(builder.toStringProperties);\r
             this.isUnionType = builder.isUnionType;\r
             this.restrictions = builder.restrictions;\r
+            if (builder.SUID == null) {\r
+                this.SUID = null;\r
+            } else {\r
+                this.SUID = builder.SUID.toInstance(GeneratedTransferObjectImpl.this);\r
+            }\r
         }\r
 \r
         @Override\r
@@ -180,6 +192,11 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
             return restrictions;\r
         }\r
 \r
+        @Override\r
+        public GeneratedProperty getSUID() {\r
+            return SUID;\r
+        }\r
+\r
         @Override\r
         public String toString() {\r
             StringBuilder builder = new StringBuilder();\r
index 8552804bcf069e72ee52b9f0702e90af904d8871..a5acd30407bdcfba5dd198aa106b350ecc01b090 100644 (file)
@@ -41,12 +41,12 @@ final class MethodSignatureBuilderImpl extends AbstractTypeMemberBuilder<MethodS
     protected MethodSignatureBuilder thisInstance() {
         return this;
     }
-    
+
     @Override
     public MethodSignature toInstance(Type definingType) {
         final List<AnnotationType> annotations = toAnnotationTypes();
         return new MethodSignatureImpl(definingType, getName(), annotations, getComment(), getAccessModifier(),
-                getReturnType(), parameters, isFinal(), isAbstract);
+                getReturnType(), parameters, isFinal(), isAbstract, isStatic());
     }
 
     @Override
index 1351df3ad43e1f84544dc696165c11fa5aeee30f..9672b4d2219bb86f1abf22ca76aad4c187394e99 100644 (file)
@@ -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<Parameter> params;
@@ -24,8 +24,8 @@ class MethodSignatureImpl extends AbstractTypeMember implements MethodSignature
                                final List<AnnotationType> annotations,
                                final String comment, final AccessModifier accessModifier,
                                final Type returnType, final List<Parameter> 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;
     }
index d3931f93259dc2801b0cedb61028c5e60c554aaa..458b8114e0cba8a59eb790fd8129f1a2147a21a8 100644 (file)
@@ -64,11 +64,8 @@ class ClassTemplate extends BaseTemplate {
         this.consts = genType.constantDefinitions\r
         this.enclosedGeneratedTypes = genType.enclosedTypes\r
     }\r
-    \r
 \r
-    \r
-    \r
-    \r
+\r
     /**\r
      * Generates JAVA class source code (class body only).\r
      * \r
@@ -77,9 +74,8 @@ class ClassTemplate extends BaseTemplate {
     def CharSequence generateAsInnerClass() {\r
         return generateBody(true)\r
     }\r
-    \r
 \r
-    \r
+\r
     override protected body() {\r
         generateBody(false);\r
     }\r
@@ -93,7 +89,8 @@ class ClassTemplate extends BaseTemplate {
     def protected generateBody(boolean isInnerClass) '''\r
         «type.comment.asJavadoc»\r
         «generateClassDeclaration(isInnerClass)» {\r
-               «innerClassesDeclarations»\r
+            «suidDeclaration»\r
+            «innerClassesDeclarations»\r
             «enumDeclarations»\r
             «constantsDeclarations»\r
             «generateFields»\r
@@ -115,8 +112,8 @@ class ClassTemplate extends BaseTemplate {
 \r
         }\r
     '''\r
-    \r
-    \r
+\r
+\r
     /**\r
      * Template method which generates inner classes inside this interface.\r
      * \r
@@ -253,7 +250,13 @@ class ClassTemplate extends BaseTemplate {
             «ENDFOR»\r
         «ENDIF»\r
     '''\r
-    \r
+\r
+    def protected suidDeclaration() '''\r
+        «IF genTO.SUID != null»\r
+            private static final long serialVersionUID = «genTO.SUID.value»L; \r
+        «ENDIF»\r
+    '''\r
+\r
     /**\r
      * Template method wich generates JAVA constants.\r
      * \r
index 78040bdef0c2a8e319aef35738adfdeb2de5fccc..4a85e05127c961b05a375b4b9e1b685e6af02b9a 100644 (file)
@@ -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);
     }
index 1358921fb52516da6aa0639ce975855218905647..c20a52dbb033d4e62766b435d4cb89492651d72b 100644 (file)
@@ -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());
         }
index 1034261b76f4f2af5032d6ac368c8b76c8e4d845..0464db43bf17b35c921d83014c10f3321f553d89 100644 (file)
@@ -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 <code>true</code> if the property si declared as read-only. <br>
      * If the property has flag <code>isReadOnly == true</code> the property
      * SHOULD be generated as getter only.
-     * 
+     *
      * @return <code>true</code> if the property si declared as read-only.
      */
     boolean isReadOnly();
index f26b4cab27b389ec5c68c5e8f383cf49f4dc7bdd..39fd61db5eddd1a001faf5d212e9e22541308f69 100644 (file)
@@ -24,6 +24,8 @@ import java.util.List;
  */
 public interface GeneratedTransferObject extends GeneratedType {
 
+    GeneratedProperty getSUID();
+
     /**
      * Returns the extending Generated Transfer Object or <code>null</code> if
      * there is no extending Generated Transfer Object.
index 74c74990cc7c028caeb97172d933c1fe85a25662..2447e21fee4737205b07c56ca1b92603a55778b4 100644 (file)
@@ -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<AnnotationType> 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 <code>true</code> if member is declared as static.
+     *
+     * @return <code>true</code> if member is declared as static.
      */
-    String getComment();
+    boolean isStatic();
 
     /**
-     * Returns the Type that declares method.
-     * 
-     * @return the Type that declares method.
+     * Returns <code>true</code> if member is declared as final.
+     *
+     * @return <code>true</code> 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 <code>true</code> if method is declared as final.
-     * 
-     * @return <code>true</code> if method is declared as final.
+     * Returns the Type that declares member.
+     *
+     * @return the Type that declares member.
      */
-    boolean isFinal();
+    Type getDefiningType();
+
 }
index 6cadfdd3911db762763f6c6285a98bd46171c50f..cd4b9b45757a25e99454e1f5e4a9f5ba9cbbc687 100644 (file)
@@ -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> {
 
+    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 TypeMemberBuilder<GeneratedPro
      * <code>class</code> definition. In case that defining Type will be passed
      * as <code>null</code> reference the method SHOULD thrown
      * {@link IllegalArgumentException}.
-     * 
+     *
      * @param definingType
      *            Defining Type of Generated Property
      * @return <code>new</code> <i>immutable</i> instance of Generated Property.
index 0f12f780089556788d04c197ee1b9dcb09d94b9f..805b1b64aee2c1a30c611354d9960d96f069bff7 100644 (file)
@@ -81,4 +81,6 @@ public interface GeneratedTOBuilder extends GeneratedTypeBuilderBase<GeneratedTO
      * @param isUnion
      */
     void setIsUnion(boolean isUnion);
+
+    void setSUID(GeneratedPropertyBuilder suid);
 }
index 34e0c2d5cfad9636382ebaba36e39e4156c7bc11..de49e243ea14dcf94ff2e341f3547c779ae9e829 100644 (file)
@@ -14,7 +14,7 @@ public interface TypeMemberBuilder<T extends TypeMemberBuilder<T>> {
      * Neither the package name or annotation name can contain <code>null</code>
      * references. In case that any of parameters contains <code>null</code> the
      * method SHOULD thrown {@link IllegalArgumentException}
-     * 
+     *
      * @param packageName
      *            Package Name of Annotation Type
      * @param name
@@ -25,7 +25,7 @@ public interface TypeMemberBuilder<T extends TypeMemberBuilder<T>> {
 
     /**
      * Returns the name of property.
-     * 
+     *
      * @return the name of property.
      */
     String getName();
@@ -34,15 +34,17 @@ public interface TypeMemberBuilder<T extends TypeMemberBuilder<T>> {
      * Adds return Type into Builder definition for Generated Property. <br>
      * The return Type MUST NOT be <code>null</code>, 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<T extends TypeMemberBuilder<T>> {
      * Adds String definition of comment into Method Signature definition. <br>
      * 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<T extends TypeMemberBuilder<T>> {
      * be prohibited from overriding. <br>
      * 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);
 }