From: Bob J. <jac...@us...> - 2003-04-28 14:07:41
|
Update of /cvsroot/jmri/jmri In directory sc8-pr-cvs1:/tmp/cvs-serv30605 Added Files: NamedBean.java AbstractNamedBean.java Log Message: new interface and base class --- NEW FILE: NamedBean.java --- // NamedBean.java package jmri; /** * The NamedBean interface provides common services for classes representing objects * on the layout, and allows the of common code by their Managers. * <P> * Each object has a two names. The "user" name is entirely free form, and * can be used for any purpose. The "system" name is provided by the system-specific * implementations, and provides a unique mapping to the layout control system * (e.g. LocoNet, NCE, etc) and address within that system. * * @author Bob Jacobsen Copyright (C) 2001 * @version $Revision: 1.1 $ * @see jmri.AbstractManager * @see jmri.AbstractNamedBean */ public interface NamedBean { // user identification, _bound_ parameter so manager(s) can listen public String getUserName(); public void setUserName(String s); /** * Get a system-specific name. This encodes the hardware addressing * information. */ public String getSystemName(); /** * Request a call-back when a bound property changes. * Bound properties are the known state, commanded state, user and system names. */ public void addPropertyChangeListener(java.beans.PropertyChangeListener l); /** * Remove a request for a call-back when a bound property changes. */ public void removePropertyChangeListener(java.beans.PropertyChangeListener l); /** * Remove references to and from this object, so that it can * eventually be garbage-collected. */ public void dispose(); // remove _all_ connections! } /* @(#)NamedBean.java */ --- NEW FILE: AbstractNamedBean.java --- // AbstractNamedBean.java package jmri; /** * Abstract base for the NamedBean interface. * <P> * Implements the parameter binding support. * * @author Bob Jacobsen Copyright (C) 2001 * @version $Revision: 1.1 $ */ public abstract class AbstractNamedBean implements NamedBean, java.io.Serializable { private AbstractNamedBean() { mSystemName = null; mUserName = null; log.warn("Unexpected use of null ctor"); Exception e = new Exception(); e.printStackTrace(); } public AbstractNamedBean(String sys) { mSystemName = sys; mUserName = null; } public AbstractNamedBean(String sys, String user) { this(sys); mUserName = user; } // implementing classes will typically have a function/listener to get // updates from the layout, which will then call // public void firePropertyChange(String propertyName, // Object oldValue, // Object newValue) // _once_ if anything has changed state // since we can't do a "super(this)" in the ctor to inherit from PropertyChangeSupport, we'll // reflect to it java.beans.PropertyChangeSupport pcs = new java.beans.PropertyChangeSupport(this); public synchronized void addPropertyChangeListener(java.beans.PropertyChangeListener l) { pcs.addPropertyChangeListener(l); } public synchronized void removePropertyChangeListener(java.beans.PropertyChangeListener l) { pcs.removePropertyChangeListener(l); } public String getSystemName() {return mSystemName;} public String getUserName() {return mUserName;} public void setUserName(String s) { String old = mUserName; mUserName = s; firePropertyChange("UserName", old, s); } private String mUserName; private String mSystemName; protected void firePropertyChange(String p, Object old, Object n) { pcs.firePropertyChange(p,old,n);} public void dispose() { pcs = null; } static org.apache.log4j.Category log = org.apache.log4j.Category.getInstance(AbstractNamedBean.class.getName()); } /* @(#)AbstractNamedBean.java */ |