BUG-2976 Generate hash/equals for config generated DTOs 99/20499/2
authorMaros Marsalek <mmarsale@cisco.com>
Fri, 15 May 2015 09:28:27 +0000 (11:28 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 26 May 2015 10:23:42 +0000 (10:23 +0000)
The DTOs generated by config subsystem did not have hashCode and equals methods
This caused the canReuse instance to return false even if the old module could
be reused.

Change-Id: I11392c2947f570a05d1a5b84fdaaee9e6b89a717
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryPluginTest.java

index 00454d8..1eaa35f 100644 (file)
@@ -424,6 +424,43 @@ public class TemplateFactory {
                     methods.add(setter);
                 }
 
+                // Add hashCode
+                final MethodDefinition hashCode = getHash(attrs);
+                methods.add(hashCode);
+
+                // Add equals
+                final MethodDefinition equals = getEquals(attrs);
+                methods.add(equals);
+            }
+
+            private MethodDefinition getEquals(final Map<String, AttributeIfc> attrs) {
+                final StringBuilder equalsBodyBuilder = new StringBuilder(
+                        "        if (this == o) return true;\n" +
+                        "        if (o == null || getClass() != o.getClass()) return false;\n");
+                equalsBodyBuilder.append(String.format(
+                        "        final %s that = (%s) o;\n", name, name));
+                for (AttributeIfc s : attrs.values()) {
+                    equalsBodyBuilder.append(String.format(
+                            "        if(java.util.Objects.equals(%1$s, that.%1$s) == false) {\n" +
+                            "            return false;\n" +
+                            "        }\n\n", s.getLowerCaseCammelCase()));
+                }
+                equalsBodyBuilder.append(
+                        "       return true;\n");
+                return new MethodDefinition("boolean", "equals", Collections.singletonList(new Field("Object", "o")),
+                        Collections.singletonList(new Annotation("Override", Collections.<Parameter>emptyList())), equalsBodyBuilder.toString());
+            }
+
+            private MethodDefinition getHash(final Map<String, AttributeIfc> attrs) {
+                final StringBuilder hashBodyBuilder = new StringBuilder(
+                        "        return java.util.Objects.hash(");
+                for (AttributeIfc s : attrs.values()) {
+                    hashBodyBuilder.append(s.getLowerCaseCammelCase());
+                    hashBodyBuilder.append(", ");
+                }
+                hashBodyBuilder.replace(hashBodyBuilder.length() - 2, hashBodyBuilder.length(), ");\n");
+                return new MethodDefinition("int", "hashCode", Collections.<Field>emptyList(),
+                        Collections.singletonList(new Annotation("Override", Collections.<Parameter>emptyList())), hashBodyBuilder.toString());
             }
 
             String getType() {
index d9f8864..ee81f1c 100644 (file)
@@ -129,9 +129,9 @@ public class ModuleMXBeanEntryPluginTest extends ModuleMXBeanEntryTest {
                         is(true));
                 assertThat(peerTO.getFullyQualifiedName(), is(PACKAGE_NAME
                         + ".Peer"));
-                assertThat(peerTO.getMethods().size(), is(5));
-                Method getPort = findFirstMethodByName(peerTO.getMethods(),
-                        "getPort");
+                assertThat(peerTO.getMethods().size(), is(5 + 2/*hashCode Equals*/));
+
+                Method getPort = findFirstMethodByName(peerTO.getMethods(), "getPort");
                 assertNotNull(getPort);
                 Method setPort = findFirstMethodByName(peerTO.getMethods(),
                         "setPort");

©2013 OpenDaylight, A Linux Foundation Collaborative Project. All Rights Reserved.
OpenDaylight is a registered trademark of The OpenDaylight Project, Inc.
Linux Foundation and OpenDaylight are registered trademarks of the Linux Foundation.
Linux is a registered trademark of Linus Torvalds.