[ 
https://issues.apache.org/jira/browse/CXF-4899?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alec Bickerton updated CXF-4899:
--------------------------------

    Description: 
When using the Boolean getter plugin to generate a Boolean getter method in the 
generated code, the original isXXX method is replaced. 

In small code bases this would be fine, unfortunately I need those is methods 
as there is a significant amount of legacy code relies on this method.

e.g. Spring MVC


  was:
When using the Boolean getter plugin to generate a Boolean getter method in the 
generated code, the original isXXX method is replaced. 

In small code bases this would be fine, unfortunately I need those is methods 
as there is a signiicant amount of legacy code that relies on them.

JIRA doesn't give me the option to add an attachment, so here's my patch.

===================================================================
--- boolean/src/main/java/org/apache/cxf/xjc/bg/BooleanGetterPlugin.java        
(revision 1430827)
+++ boolean/src/main/java/org/apache/cxf/xjc/bg/BooleanGetterPlugin.java        
(working copy)
@@ -19,16 +19,22 @@
 package org.apache.cxf.xjc.bg;
 
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.logging.Logger;
 
 import org.xml.sax.ErrorHandler;
 
+import com.sun.codemodel.JBlock;
 import com.sun.codemodel.JMethod;
+import com.sun.codemodel.JMod;
+import com.sun.codemodel.JType;
 import com.sun.tools.xjc.Options;
 import com.sun.tools.xjc.outline.ClassOutline;
 import com.sun.tools.xjc.outline.Outline;
 
-
 /**
  * Generate getters named getXXX() for Booleans instead of isXXX(). Useful to 
use generated beans with tools
  * that needs introspections, like dozer.
@@ -36,7 +42,8 @@
 public class BooleanGetterPlugin {
 
     private static final Logger LOG = 
Logger.getLogger(BooleanGetterPlugin.class.getName()); //NOPMD
-
+    private static final String IS_PREFIX = "is";
+    
     public BooleanGetterPlugin() {
     }
 
@@ -49,21 +56,40 @@
     }
 
     public boolean run(Outline outline, Options opt, ErrorHandler 
errorHandler) {
-        LOG.info("Running boolean getter plugin.");
         for (ClassOutline classOutline : outline.getClasses()) {
-            Collection<JMethod> methods = classOutline.implClass.methods();
-            for (JMethod method : methods) {
-                if (method.name().startsWith("is")) {
-                    String newName = "get" + method.name().substring(2);
-                    LOG.info("Changing method name from " + method.name() + " 
to " + newName);
-                    method.javadoc().add(
-                                         "\nThis getter has been renamed from 
" + method.name() + "() to "
-                                             + newName + "() by 
cxf-xjc-boolean plugin.");
-                    method.name(newName);
-                }
+            processClass(classOutline);
+        }
+        return true;
+    }
+
+    private void processClass(ClassOutline clazz) {
+        Collection<JMethod> methods = clazz.implClass.methods();
+        Map<String , JType> methodsToAdd = new HashMap<String , JType>();
+        for (JMethod method : methods) {
+            if (method.name().startsWith(IS_PREFIX) && requiresGetter(methods, 
method)) {
+                methodsToAdd.put(method.name(), method.type());
             }
         }
+        
+        Iterator<Entry<String, JType>> todo = 
methodsToAdd.entrySet().iterator();
+        while (todo.hasNext()) {
+            Entry<String, JType> entry = todo.next();
+            String newName = "get" + entry.getKey().substring(2);
+            //LOG.info("Adding method " + newName);
+            JMethod newMethod = clazz.implClass.method(JMod.PUBLIC, 
entry.getValue(), newName);
+            JBlock body = newMethod.body();
+            body.directStatement("return " + entry.getKey() + "();");
+        }
+    }
+    
+    private boolean requiresGetter(Collection<JMethod> methods, JMethod 
method) {
+        String newName = "get" + method.name().substring(2);
+        // Check if already exists.
+        for (JMethod cursor : methods) {
+            if (newName.equals(cursor.name())) {
+                return false;
+            }
+        }
         return true;
     }
-
 }


    
> Boolean getter plugin does not leave isXXX() method.
> ----------------------------------------------------
>
>                 Key: CXF-4899
>                 URL: https://issues.apache.org/jira/browse/CXF-4899
>             Project: CXF
>          Issue Type: Improvement
>          Components: Tooling
>    Affects Versions: 2.6.5
>            Reporter: Alec Bickerton
>              Labels: patch
>         Attachments: BooleanGetterPlugin.java.patch
>
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> When using the Boolean getter plugin to generate a Boolean getter method in 
> the generated code, the original isXXX method is replaced. 
> In small code bases this would be fine, unfortunately I need those is methods 
> as there is a significant amount of legacy code relies on this method.
> e.g. Spring MVC

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to