001package co.codewizards.cloudstore.core.bean; 002 003import java.beans.PropertyChangeListener; 004 005public abstract class AbstractBean<P extends PropertyBase> implements CloneableBean<P>, Cloneable { 006 private BeanSupport<AbstractBean<P>, P> beanSupport = new BeanSupport<AbstractBean<P>, P>(this); 007 008 protected void setPropertyValue(P property, Object value) { 009 beanSupport.setPropertyValue(property, value); 010 } 011 012 protected <V> V getPropertyValue(P property) { 013 return beanSupport.getPropertyValue(property); 014 } 015 016 @Override 017 public void addPropertyChangeListener(PropertyChangeListener listener) { 018 beanSupport.addPropertyChangeListener(listener); 019 } 020 021 @Override 022 public void removePropertyChangeListener(PropertyChangeListener listener) { 023 beanSupport.removePropertyChangeListener(listener); 024 } 025 026 @Override 027 public void addPropertyChangeListener(P property, PropertyChangeListener listener) { 028 beanSupport.addPropertyChangeListener(property, listener); 029 } 030 031 @Override 032 public void removePropertyChangeListener(P property, PropertyChangeListener listener) { 033 beanSupport.removePropertyChangeListener(property, listener); 034 } 035 036 protected void firePropertyChange(final P property, Object oldValue, Object newValue) { 037 beanSupport.firePropertyChange(property, oldValue, newValue); 038 } 039 040 @Override 041 public Object clone() { // returning Object to allow sub-classes to declare returning an interface or whatever they want (and fits) 042 final AbstractBean<P> clone; 043 try { 044 @SuppressWarnings("unchecked") 045 final AbstractBean<P> c = (AbstractBean<P>) super.clone(); 046 clone = c; 047 } catch (CloneNotSupportedException e) { 048 throw new RuntimeException(e); 049 } 050 clone.beanSupport = new BeanSupport<AbstractBean<P>, P>(clone); 051 return clone; 052 } 053}