Bug 2784: status deprecated is not interpreted as annotation 76/32776/1
authorMartin Ciglan <mciglan@cisco.com>
Fri, 8 Jan 2016 16:03:44 +0000 (17:03 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Fri, 15 Jan 2016 10:23:00 +0000 (10:23 +0000)
Issues mentioned below have been fixed in this patch:
1. status deprecated is ignored for YANG elements in Javadocs
2. Annotation @deprecated is not provided in Javadocs
3. Annotation @Deprecated for compiler/developer purpose is not provided in generated Java structures

Change-Id: I5f3984d6810cd88a383a33f32b3b5d6a5072fd57
Signed-off-by: Martin Ciglan <mciglan@cisco.com>
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/YangTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/InterfaceTemplate.xtend

index b9824f031e0bacc25c59fd0b765ce232f6c1bda7..f093709e2b93ee51d665e22b6ad5747a8c404216 100644 (file)
@@ -94,6 +94,7 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
@@ -313,6 +314,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         final String packageName = packageNameForGeneratedType(basePackageName, node.getPath());
         final GeneratedTypeBuilder genType = addDefaultInterfaceDefinition(packageName, node, childOf, module);
         genType.addComment(node.getDescription());
+        annotateDeprecatedIfNecessary(node.getStatus(), genType);
         genType.setDescription(createDescription(node, genType.getFullyQualifiedName()));
         genType.setModuleName(module.getName());
         genType.setReference(node.getReference());
@@ -495,6 +497,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                     addImplementedInterfaceFromUses(input, inType);
                     inType.addImplementsType(DATA_OBJECT);
                     inType.addImplementsType(augmentable(inType));
+                    annotateDeprecatedIfNecessary(rpc.getStatus(), inType);
                     resolveDataSchemaNodes(module, basePackageName, inType, inType, input.getChildNodes());
                     genCtx.get(module).addChildNodeType(input, inType);
                     final GeneratedType inTypeInstance = inType.toInstance();
@@ -507,6 +510,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                     addImplementedInterfaceFromUses(output, outType);
                     outType.addImplementsType(DATA_OBJECT);
                     outType.addImplementsType(augmentable(outType));
+                    annotateDeprecatedIfNecessary(rpc.getStatus(), outType);
                     resolveDataSchemaNodes(module, basePackageName, outType, outType, output.getChildNodes());
                     genCtx.get(module).addChildNodeType(output, outType);
                     outTypeInstance = outType.toInstance();
@@ -558,6 +562,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
                 final GeneratedTypeBuilder notificationInterface = addDefaultInterfaceDefinition(basePackageName,
                         notification, null, module);
+                annotateDeprecatedIfNecessary(notification.getStatus(), notificationInterface);
                 notificationInterface.addImplementsType(NOTIFICATION);
                 genCtx.get(module).addChildNodeType(notification, notificationInterface);
 
@@ -696,6 +701,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
     private void groupingToGenType(final String basePackageName, final GroupingDefinition grouping, final Module module) {
         final String packageName = packageNameForGeneratedType(basePackageName, grouping.getPath());
         final GeneratedTypeBuilder genType = addDefaultInterfaceDefinition(packageName, grouping, module);
+        annotateDeprecatedIfNecessary(grouping.getStatus(), genType);
         genCtx.get(module).addGroupingType(grouping.getPath(), genType);
         resolveDataSchemaNodes(module, basePackageName, genType, genType, grouping.getChildNodes());
         groupingsToGenTypes(module, grouping.getGroupings());
@@ -967,6 +973,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
         augTypeBuilder.addImplementsType(DATA_OBJECT);
         augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef));
+        annotateDeprecatedIfNecessary(augSchema.getStatus(), augTypeBuilder);
         addImplementedInterfaceFromUses(augSchema, augTypeBuilder);
 
         augSchemaNodeToMethods(module, basePackageName, augTypeBuilder, augTypeBuilder, augSchema.getChildNodes());
@@ -1163,6 +1170,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             constructGetter(parent, choiceNode.getQName().getLocalName(), choiceNode.getDescription(),
                     choiceTypeBuilder);
             choiceTypeBuilder.addImplementsType(typeForClass(DataContainer.class));
+            annotateDeprecatedIfNecessary(choiceNode.getStatus(), choiceTypeBuilder);
             genCtx.get(module).addChildNodeType(choiceNode, choiceTypeBuilder);
             generateTypesFromChoiceCases(module, basePackageName, choiceTypeBuilder.toInstance(), choiceNode);
         }
@@ -1211,6 +1219,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                 final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath());
                 final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode, module);
                 caseTypeBuilder.addImplementsType(refChoiceType);
+                annotateDeprecatedIfNecessary(caseNode.getStatus(), caseTypeBuilder);
                 genCtx.get(module).addCaseType(caseNode.getPath(), caseTypeBuilder);
                 genCtx.get(module).addChoiceToCaseMapping(refChoiceType, caseTypeBuilder, caseNode);
                 final Iterable<DataSchemaNode> caseChildNodes = caseNode.getChildNodes();
@@ -2245,4 +2254,10 @@ public class BindingGeneratorImpl implements BindingGenerator {
         final String ret = UNICODE_CHAR_PATTERN.matcher(stringBuilder).replaceAll("\\\\\\\\u");
         return ret.isEmpty() ? "" : ret;
     }
+
+    private void annotateDeprecatedIfNecessary(Status status, GeneratedTypeBuilder builder) {
+        if (status == Status.DEPRECATED) {
+            builder.addAnnotation("", "Deprecated");
+        }
+    }
 }
index 26d72d831fcd3ff5d649666951f6ba5a0d351a40..a5b82e9c1a4444c12806a87be154c8ab1af34cf8 100644 (file)
@@ -34,6 +34,7 @@ import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition
 import org.opendaylight.yangtools.yang.model.api.SchemaNode
 import org.opendaylight.yangtools.yang.model.api.SchemaPath
+import org.opendaylight.yangtools.yang.model.api.Status
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode
 import org.opendaylight.yangtools.yang.model.api.UsesNode
@@ -208,7 +209,11 @@ class YangTemplate {
     }
 
     def static writeRPC(RpcDefinition rpc) {
+        var boolean isStatusDeprecated = rpc.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             rpc «rpc.QName.localName» {
                 «IF !rpc.description.nullOrEmpty»
                     "«rpc.description»";
@@ -226,7 +231,7 @@ class YangTemplate {
                 reference
                     "«rpc.reference»";
                 «ENDIF»
-                «IF rpc.status != null»
+                «IF isStatusDeprecated»
                 status «rpc.status»;
                 «ENDIF»
             }
@@ -271,7 +276,11 @@ class YangTemplate {
     }
 
     def static writeNotification(NotificationDefinition notification) {
+        var boolean isStatusDeprecated = notification.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             notification «notification.QName.localName» {
                 «IF !notification.description.nullOrEmpty»
                 description
@@ -293,7 +302,7 @@ class YangTemplate {
                 reference
                     "«notification.reference»";
                 «ENDIF»
-                «IF notification.status != null»
+                «IF isStatusDeprecated»
                 status «notification.status»;
                 «ENDIF»
             }
@@ -371,8 +380,15 @@ class YangTemplate {
     }
 
     def static writeTypeDefinition(TypeDefinition<?> typeDefinition) {
+        var boolean isStatusDeprecated = typeDefinition.status == Status::DEPRECATED
         '''
-            type «typeDefinition.QName.localName»;
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
+            type «typeDefinition.QName.localName»«IF !isStatusDeprecated»;«ELSE» {
+                status «typeDefinition.status»;
+            }
+            «ENDIF»
         '''
     }
 
@@ -459,7 +475,12 @@ class YangTemplate {
     }
 
     def static writeExtension(ExtensionDefinition extensionDef) {
+        var boolean isStatusDeprecated = extensionDef.status == Status::DEPRECATED
+
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             extension «extensionDef.QName.localName» {
                 «IF !extensionDef.description.nullOrEmpty»
                 description
@@ -559,7 +580,11 @@ class YangTemplate {
     }
 
     def static writeGroupingDef(GroupingDefinition groupingDef) {
+        var boolean isStatusDeprecated = groupingDef.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             grouping «groupingDef.QName.localName» {
                 «IF !groupingDef.groupings.nullOrEmpty»
                     «writeGroupingDefs(groupingDef.groupings)»
@@ -567,6 +592,9 @@ class YangTemplate {
                 «IF !groupingDef.childNodes.nullOrEmpty»
                     «writeDataSchemaNodes(groupingDef.childNodes)»
                 «ENDIF»
+                «IF isStatusDeprecated»
+                    status «groupingDef.status»;
+                «ENDIF»
                 «IF !groupingDef.unknownSchemaNodes.nullOrEmpty»
                     «writeUnknownSchemaNodes(groupingDef.unknownSchemaNodes)»
                 «ENDIF»
@@ -575,7 +603,11 @@ class YangTemplate {
     }
 
     def static writeContSchemaNode(ContainerSchemaNode contSchemaNode) {
+        var boolean isStatusDeprecated = contSchemaNode.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             container «contSchemaNode.getQName.localName» {
                 «IF !contSchemaNode.childNodes.nullOrEmpty»
                 «writeDataSchemaNodes(contSchemaNode.childNodes)»
@@ -589,6 +621,9 @@ class YangTemplate {
                 «IF !contSchemaNode.uses.nullOrEmpty»
                 «writeUsesNodes(contSchemaNode.uses)»
                 «ENDIF»
+                «IF isStatusDeprecated»
+                status «contSchemaNode.status»;
+                «ENDIF»
                 «IF !contSchemaNode.unknownSchemaNodes.nullOrEmpty»
                 «writeUnknownSchemaNodes(contSchemaNode.unknownSchemaNodes)»
                 «ENDIF»
@@ -597,49 +632,89 @@ class YangTemplate {
     }
 
     def static writeAnyXmlSchemaNode(AnyXmlSchemaNode anyXmlSchemaNode) {
+        var boolean isStatusDeprecated = anyXmlSchemaNode.status == Status::DEPRECATED
         '''
-            anyxml «anyXmlSchemaNode.getQName.localName»;
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
+            anyxml «anyXmlSchemaNode.getQName.localName»«IF !isStatusDeprecated»;«ELSE» {
+                status «anyXmlSchemaNode.status»;
+            }
+            «ENDIF»
         '''
     }
 
     def static writeLeafSchemaNode(LeafSchemaNode leafSchemaNode) {
+        var boolean isStatusDeprecated = leafSchemaNode.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             leaf «leafSchemaNode.getQName.localName» {
                 type «leafSchemaNode.type.getQName.localName»;
+                «IF isStatusDeprecated»
+                    status «leafSchemaNode.status»;
+                «ENDIF»
             }
         '''
     }
 
     def static writeLeafListSchemaNode(LeafListSchemaNode leafListSchemaNode) {
+        var boolean isStatusDeprecated = leafListSchemaNode.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             leaf-list «leafListSchemaNode.getQName.localName» {
                 type «leafListSchemaNode.type.getQName.localName»;
+                «IF isStatusDeprecated»
+                    status «leafListSchemaNode.status»;
+                «ENDIF»
             }
         '''
     }
 
     def static writeChoiceCaseNode(ChoiceCaseNode choiceCaseNode) {
+        var boolean isStatusDeprecated = choiceCaseNode.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             case «choiceCaseNode.getQName.localName» {
                 «FOR childNode : choiceCaseNode.childNodes»
                     «writeDataSchemaNode(childNode)»
                 «ENDFOR»
+                «IF isStatusDeprecated»
+                    status «choiceCaseNode.status»;
+                «ENDIF»
             }
         '''
     }
 
     def static writeChoiceNode(ChoiceSchemaNode choiceNode) {
+        var boolean isStatusDeprecated = choiceNode.status == Status::DEPRECATED
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             choice «choiceNode.getQName.localName» {
                 «FOR child : choiceNode.cases»
                     «writeDataSchemaNode(child)»
                 «ENDFOR»
+                «IF isStatusDeprecated»
+                    status «choiceNode.status»;
+                «ENDIF»
             }
         '''
     }
 
     def static writeListSchemaNode(ListSchemaNode listSchemaNode) {
+        var boolean isStatusDeprecated = listSchemaNode.status == Status::DEPRECATED
+
         '''
+            «IF isStatusDeprecated»
+            @deprecated - status DEPRECATED
+            «ENDIF»
             list «listSchemaNode.getQName.localName» {
                 key «FOR listKey : listSchemaNode.keyDefinition SEPARATOR " "»"«listKey.localName»"
                 «ENDFOR»
@@ -655,6 +730,9 @@ class YangTemplate {
                 «IF !listSchemaNode.uses.nullOrEmpty»
                     «writeUsesNodes(listSchemaNode.uses)»
                 «ENDIF»
+                «IF isStatusDeprecated»
+                    status «listSchemaNode.status»;
+                «ENDIF»
                 «IF !listSchemaNode.unknownSchemaNodes.nullOrEmpty»
                     «writeUnknownSchemaNodes(listSchemaNode.unknownSchemaNodes)»
                 «ENDIF»
index 4212f2fe56540948632842c233eb38e55eaeefcc..e8ce4c0e2e2e7c2b83990ddd68a06ac61e741aaa 100644 (file)
@@ -13,7 +13,8 @@ import org.opendaylight.yangtools.sal.binding.model.api.Constant
 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType
-import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature\rimport 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.AnnotationType
 
 /**
  * Template for generating JAVA interfaces.
@@ -65,6 +66,7 @@ class InterfaceTemplate extends BaseTemplate {
      */
     override body() '''
         «wrapToDocumentation(formatDataForJavaDoc(type))»
+        «type.annotations.generateAnnotations»
         public interface «type.name»
             «superInterfaces»
         {