public boolean run()

in property-listener/src/main/java/org/apache/cxf/xjc/property_listener/PropertyListenerPlugin.java [66:149]


    public boolean run(Outline outline, Options opt, ErrorHandler errorHandler) {
        LOG.fine("Running property-listener plugin.");
        for (ClassOutline co : outline.getClasses()) {
            if (co.getDeclaredFields().length == 0) {
                continue;
            }            
            
            //add listener support
            JType listenerType = co.parent().getCodeModel()._ref(PropertyChangeSupport.class);
            JFieldVar newVar = co.implClass.field(Modifier.PRIVATE, 
                                                  listenerType, 
                                                  "propertyListener", 
                                                  JExpr._new(listenerType).arg(JExpr._this()));
            newVar.annotate(XmlTransient.class);
            
            JMethod method = co.implClass.method(Modifier.PUBLIC, Void.TYPE, "addPropertyChangeListener");
            JVar listener = method.param(PropertyChangeListener.class, "listener");
            method.body().invoke(newVar, "addPropertyChangeListener").arg(listener);
            
            method = co.implClass.method(Modifier.PUBLIC, Void.TYPE, "removePropertyChangeListener");
            listener = method.param(PropertyChangeListener.class, "listener");
            method.body().invoke(newVar, "removePropertyChangeListener").arg(listener);
            
            //add firePropertyChange to set methods
            List<JMethod> methods = (List<JMethod>)co.implClass.methods();
            for (int x = 0; x < methods.size(); x++) {
                JMethod m = methods.get(x);
                if (m.name().startsWith("set")) {
                    m.body().pos(0);
                    List<Object> contents = m.body().getContents();
                    JFieldRef target = null;
                    JExpression value = null;
                    for (Object o : contents) {
                        if (o instanceof JAssignment) {
                            JAssignment jass = (JAssignment)o;
                            try {
                                Field f = jass.getClass().getDeclaredField("lhs");
                                f.setAccessible(true);
                                Object t = f.get(jass);
                                if (t instanceof JFieldRef) {
                                    f = jass.getClass().getDeclaredField("rhs");
                                    f.setAccessible(true);
                                    value = (JExpression)f.get(jass);
                                    target = (JFieldRef)t;
                                }
                            } catch (Throwable t) {
                                //ignore
                            }
                        }
                    }
                    if (target != null) {
                        try {
                            String targetName = getName(target);
                            
                            JFieldVar field = co.implClass.fields().get(targetName);
                            
                            if (value instanceof JVar) {
                                JVar var = (JVar)value;
                                JType t = var.type();
                                if ("int".equals(t.fullName())
                                    && !"int".equals(field.type().fullName())) {
                                    value = JExpr.cast(co.parent().getCodeModel()._ref(Integer.class),
                                                       value);
                                } else if ("boolean".equals(t.fullName())
                                    && !"boolean".equals(field.type().fullName())) {
                                    value = JExpr.cast(co.parent().getCodeModel()._ref(Boolean.class),
                                                       value);
                                } 
                            }
                            
                            m.body().invoke(newVar, "firePropertyChange").arg(targetName)
                                .arg(target).arg(value);
                        } catch (Throwable t) {
                            //ignore
                            t.printStackTrace();
                        }
                    }
                }
                
            }
                    
        }
        return true;
    }