How do I listen for bean’s property change event?

In this example we’ll listen to bean’s property change event. We create a small bean named MyBean, adds attributes and getter/setter. We want to know or to get notified when the bean property name is changed.

First we need the add a PropertyChangeSupport field to the bean, with this object we will fire the property change event. When we need to listen for the change we have to create an implementation of a PropertyChangeListener. In this example we’ll just use the MyBean class as the listener.

The PropertyChangeListener has a method called propertyChange and inside this method we’ll implementing the code to get the event fired by the PropertyChangeSupport.

package org.kodejava.example.bean;

import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.io.Serializable;

public class MyBean implements PropertyChangeListener, Serializable {
    private Long id;
    private String name;

    private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public MyBean() {
        pcs.addPropertyChangeListener(this);
    }

    /**
     * This method gets called when a bound property is changed.
     *
     * @param evt A PropertyChangeEvent object describing the event source
     *            and the property that has changed.
     */
    public void propertyChange(PropertyChangeEvent evt) {
        System.out.println("Name      = " + evt.getPropertyName());
        System.out.println("Old Value = " + evt.getOldValue());
        System.out.println("New Value = " + evt.getNewValue());
    }

    public static void main(String[] args) {
        MyBean bean = new MyBean();
        bean.setName("My Initial Value");
        bean.setName("My New Value");
        bean.setName("My Yet Another Value");
    }


    //~ --------------------------------------------- Bean's Getters and Setters

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        String oldValue = this.name;
        this.name = name;

        //
        // Fires a property change event
        //
        pcs.firePropertyChange("name", oldValue, name);
    }
}

How do I prevent bean’s property being serialized to XML?

package org.kodejava.example.bean;

import java.beans.*;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;

public class BeanToXmlTransient {
    private Long id;
    private String itemName;
    private String itemColour;
    private Integer itemQuantities;

    static {
        try {
            //
            // In this block will change the attribute type of the itemQuantities
            // to transient so it will be not serialized to xml when we use
            // XMLEncode to convert the bean to xml persistence.
            //
            BeanInfo bi = Introspector.getBeanInfo(BeanToXmlTransient.class);
            PropertyDescriptor[] pds = bi.getPropertyDescriptors();
            for (int i = 0; i < pds.length; i++) {
                PropertyDescriptor propertyDescriptor = pds[i];
                if (propertyDescriptor.getName().equals("itemQuantities")) {
                    propertyDescriptor.setValue("transient", Boolean.TRUE);
                }
            }
        } catch (IntrospectionException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        BeanToXmlTransient bean = new BeanToXmlTransient();
        bean.setId(new Long(1));
        bean.setItemName("T-Shirt");
        bean.setItemColour("Dark Red");
        bean.setItemQuantities(new Integer(100));

        try {
            XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
                    new FileOutputStream("BeanTransient.xml")));

            //
            // Write an XML representation of the specified object to the output.
            //
            encoder.writeObject(bean);
            encoder.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public String getItemColour() {
        return itemColour;
    }

    public void setItemColour(String itemColour) {
        this.itemColour = itemColour;
    }

    public Integer getItemQuantities() {
        return itemQuantities;
    }

    public void setItemQuantities(Integer itemQuantities) {
        this.itemQuantities = itemQuantities;
    }
}

Here will see the the itemQuantities property is not serialized to XML.

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_02" class="java.beans.XMLDecoder"> 
 <object class="org.kodejava.example.bean.BeanToXmlTransient"> 
  <void property="id"> 
   <long>1</long> 
  </void> 
  <void property="itemColour"> 
   <string>Dark Red</string> 
  </void> 
  <void property="itemName"> 
   <string>T-Shirt</string> 
  </void> 
 </object> 
</java>  

How do I convert an XML persistence to Java Bean?

In the previous example you can see how to convert a bean into an XML persistence. Now we’ll do the opposite, converting the XML back to a bean. For the BeanToXML class use in this example please refer to How do I convert a bean to XML persistence? example.

package org.kodejava.example.bean;

import java.beans.XMLDecoder;
import java.io.BufferedInputStream;

public class XmlToBean {
    public static void main(String[] args) {
        XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(
                XmlToBean.class.getResourceAsStream("Bean.xml")));

        //
        // Reads the next object from the underlying input stream.
        //
        BeanToXML bean = (BeanToXML) decoder.readObject();
        decoder.close();

        System.out.println("ID              = " + bean.getId());
        System.out.println("Item Name       = " + bean.getItemName());
        System.out.println("Item Colour     = " + bean.getItemColour());
        System.out.println("Item Quantities = " + bean.getItemQuantities());
    }
}

Here is our Bean.xml persistence file:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_02" class="java.beans.XMLDecoder"> 
 <object class="org.kodejava.example.bean.BeanToXML"> 
  <void property="id"> 
   <long>1</long> 
  </void> 
  <void property="itemColour"> 
   <string>Dark Red</string> 
  </void> 
  <void property="itemName"> 
   <string>T-Shirt</string> 
  </void> 
  <void property="itemQuantities"> 
   <int>100</int> 
  </void> 
 </object> 
</java> 

The result are:

ID              = 1
Item Name       = T-Shirt
Item Colour     = Dark Red
Item Quantities = 100