/********************************************************************************
* *
* (c) Copyright 2010 Verizon Communications USA and The Open University UK *
* *
* This software is freely distributed in accordance with *
* the GNU Lesser General Public (LGPL) license, version 3 or later *
* as published by the Free Software Foundation. *
* For details see LGPL: http://www.fsf.org/licensing/licenses/lgpl.html *
* and GPL: http://www.fsf.org/licensing/licenses/gpl-3.0.html *
* *
* This software is provided by the copyright holders and contributors "as is" *
* and any express or implied warranties, including, but not limited to, the *
* implied warranties of merchantability and fitness for a particular purpose *
* are disclaimed. In no event shall the copyright owner or contributors be *
* liable for any direct, indirect, incidental, special, exemplary, or *
* consequential damages (including, but not limited to, procurement of *
* substitute goods or services; loss of use, data, or profits; or business *
* interruption) however caused and on any theory of liability, whether in *
* contract, strict liability, or tort (including negligence or otherwise) *
* arising in any way out of the use of this software, even if advised of the *
* possibility of such damage. *
* *
********************************************************************************/
package com.compendium.core.datamodel;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The PCObject defines a compendium object.
* Every compendium object must derive from this object.
*
* @author Rema and Sajid
*/
public class PCObject implements IPCObject, java.io.Serializable {
/** logger for PCObject.class */
final Logger log = LoggerFactory.getLogger(this.getClass());
/** Every PCObject has a reference to the model it belongs to. */
protected IModel oModel = null;
/** Every PCSession has a reference to the session of which this object is part of. */
protected PCSession oSession = null ;
/** Property change support and support for propagation of events. */
//protected PropertyChangeSupport oChangeSupport = null ;
/** Holds a list of registered property change listeners. */
private Vector listenerList = new Vector();
/**
* Constructor, creates a new Project Compendium Object
*/
public PCObject() {}
/**
* Intialize this object with its model and session.
*
* @param PCSession session, the session of which this object is part of.
* @param IModel model, the model to which this object belongs to.
*/
public void initialize(PCSession session, IModel model) {
oModel = model;
oSession = session;
// set up the object in the model for bidirectional relationship and cache management
// THIS CACHE IS NOT USED AT PRESENT
//model.addObject(this);
// set up property change support for firing property changes to the GUI
//oChangeSupport = new PropertyChangeSupport(this) ;
}
/** Does nothing. */
public void finalize() {}
/**
* Free property change support class.
*/
public void cleanUp() {
//oChangeSupport = null;
}
/**
* This method does a deep clone on a object.
* Since the normal Java clone method does a shallow clone, we need a cloning operation
* which is deep and __exact__. We do a clone using byte serialization!.
*
* @param Object the object to be cloned
* @return Object the cloned object
*/
public static Object cloneObject(Object o) throws Exception {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(o);
ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(bIn);
return(in.readObject());
}
/**
* Returns the list of listeners registered to this object.
* @return Returns the listenerList.
* Lakshmi (2/13/06)
*/
public Vector getListenerList() {
return listenerList;
}
/**
* Defines the model of which this object is part of
*
* @param model The model to which this object belongs to
*/
public void setModel(IModel model) {
oModel = model ;
}
/**
* Returns the model of which this object is part of.
*
* @return IModel, the model to which this object belongs to.
*/
public IModel getModel() {
return oModel;
}
/**
* Defines the session of which this object is part of.
*
* @param PCSession session, the session of which this object is part of.
*/
public void setSession(PCSession session) {
oSession = session ;
}
/**
* Returns the session of which this object is part of.
*
* @return PCSession, the session of which this object is part of.
*/
public PCSession getSession() {
return oSession;
}
/**
* Support for reporting bound property changes. If oldValue and
* newValue are not equal and the PropertyChangeEvent listener list
* isn't empty, then fire a RemotePropertyChange event to each listener.
* This method has an overloaded method for each primitive type. For
* example, here's how to write a bound property set method whose
* value is an int:
* <pre>
* public void setFoo(int newValue) {
* int oldValue = foo;
* foo = newValue;
* firePropertyChange("foo", oldValue, newValue);
* }
* </pre>
*
* @param propertyName The programmatic name of the property that was changed.
* @param oldValue The old value of the property.
* @param newValue The new value of the property.
*/
protected synchronized void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
//if (oChangeSupport != null) {
// oChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
//}
for (int i = listenerList.size()- 1 ; i >= 0 ; i--) {
if (propertyName == NodeSummary.NODE_TYPE_PROPERTY) {
log.debug("firing update for property type change + "+((PropertyChangeListener)listenerList.elementAt(i)).getClass().getName());
}
((PropertyChangeListener)listenerList.elementAt(i)).propertyChange(new PropertyChangeEvent(this, propertyName, oldValue, newValue));
}
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, byte oldValue, byte newValue){
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Byte(oldValue), new Byte(newValue));
//}
firePropertyChange(propertyName, new Byte(oldValue), new Byte(newValue));
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, char oldValue, char newValue) {
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Character(oldValue), new Character(newValue));
//}
firePropertyChange(propertyName, new Character(oldValue), new Character(newValue));
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, short oldValue, short newValue) {
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Short(oldValue), new Short(newValue));
//}
firePropertyChange(propertyName, new Short(oldValue), new Short(newValue));
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, int oldValue, int newValue) {
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Integer(oldValue), new Integer(newValue));
//}
firePropertyChange(propertyName, new Integer(oldValue), new Integer(newValue));
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, long oldValue, long newValue) {
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Long(oldValue), new Long(newValue));
//}
firePropertyChange(propertyName, new Long(oldValue), new Long(newValue));
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, float oldValue, float newValue) {
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Float(oldValue), new Float(newValue));
//}
firePropertyChange(propertyName, new Float(oldValue), new Float(newValue));
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, double oldValue, double newValue) {
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Double(oldValue), new Double(newValue));
//}
firePropertyChange(propertyName, new Double(oldValue), new Double(newValue));
}
/**
* @see #firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object)
*/
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue){
//if ((oChangeSupport != null) && (oldValue != newValue)) {
// oChangeSupport.firePropertyChange(propertyName, new Boolean(oldValue), new Boolean(newValue));
//}
firePropertyChange(propertyName, new Boolean(oldValue), new Boolean(newValue));
}
/**
* Add a PropertyChangeListener to the listener list.
* The listener is registered for all properties.
* <p>
* A PropertyChangeEvent will get fired in response to setting
* a bound property, e.g. setFont, setBackground, or setForeground.
* Note that if the current component is inheriting its foreground,
* background, or font from its container, then no event will be
* fired in response to a change in the inherited property.
*
* @param listener The PropertyChangeListener to be added
*/
public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
//if (oChangeSupport == null) {
// oChangeSupport = new PropertyChangeSupport(this);
//}
//oChangeSupport.addPropertyChangeListener(listener);
listenerList.addElement(listener);
}
/**
* Remove a PropertyChangeListener from the listener list.
* This removes a PropertyChangeListener that was registered
* for all properties.
*
* @param listener The PropertyChangeListener to be removed
*/
public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
//if (oChangeSupport != null) {
// oChangeSupport.removePropertyChangeListener(listener);
//}
listenerList.removeElement(listener);
}
}