package datechooser.beans; import java.beans.BeanInfo; import java.beans.PropertyDescriptor; import java.lang.reflect.*; /** * JavaBeans utilities. * @author Androsov Vadim * @since 1.1 */ public class BeanUtils { private static AbstractDateChooserBeanInfo[] info = new AbstractDateChooserBeanInfo[] {null, null, null}; private static final byte PANEL = 0; private static final byte COMBO = 1; private static final byte DIALOG = 2; private static AbstractDateChooserBeanInfo getDateChooserBeanInfo(DateChooserBean bean) { if (bean == null) return null; if (bean instanceof DateChooserPanel) { if (info[PANEL] == null) info[PANEL] = new DateChooserPanelBeanInfo(); return info[PANEL]; } if (bean instanceof DateChooserCombo) { if (info[COMBO] == null) info[COMBO] = new DateChooserComboBeanInfo(); return info[COMBO]; } if (bean instanceof DateChooserDialog) { if (info[DIALOG] == null) info[DIALOG] = new DateChooserDialogBeanInfo(); return info[DIALOG]; } throw new IllegalArgumentException("BeanInfo not found for " + bean.getClass().getName()); } /** * Sets target datechooser bean properties from source bean. * @param srcBean Source bean. * @param trgBean Target bean. * @since 1.1 */ public static void assignBean(DateChooserBean srcBean, DateChooserBean trgBean) { assignBean(srcBean, trgBean, getDateChooserBeanInfo(srcBean)); } /** * Clones datechooser javabean using default constructor. * @param bean Bean to clone. * @return Cloned bean. * @since 1.1 */ public static DateChooserBean cloneBean(DateChooserBean bean) { return (DateChooserBean) cloneBean(bean, getDateChooserBeanInfo(bean)); } /** * Clones javabean using default constructor and BeanInfo class. * @param bean Bean to clone. * @param beanInfo BeanInfo class. * @return Cloned bean. * @since 1.1 */ public static Object cloneBean(Object bean, BeanInfo beanInfo) { if (!beanInfo.getBeanDescriptor().getBeanClass().equals(bean.getClass())) { throw new IllegalArgumentException("Bad beaninfo for bean"); } Object newBean = null; try { newBean = bean.getClass().newInstance(); } catch (Exception ex) { throw new IllegalArgumentException("Cant create bean", ex); } assignBean(bean, newBean, beanInfo); return newBean; } /** * Sets target bean properties from source bean. * @param srcBean Source bean. * @param trgBean Target bean. * @param beanInfo BeanInfo class. * @since 1.1 */ public static void assignBean(Object srcBean, Object trgBean, BeanInfo beanInfo) { if (!srcBean.getClass().equals(trgBean.getClass())) { throw new IllegalArgumentException("Cant assign beans of different classes"); } if (!beanInfo.getBeanDescriptor().getBeanClass().equals(srcBean.getClass())) { throw new IllegalArgumentException("Bad beaninfo for bean"); } PropertyDescriptor[] descr = beanInfo.getPropertyDescriptors(); PropertyDescriptor currDescr = null; for (int i = 0; i < descr.length; i++) { currDescr = descr[i]; Method writeM = currDescr.getWriteMethod(); Method readM = currDescr.getReadMethod(); if (writeM == null) continue; try { writeM.invoke(trgBean, readM.invoke(srcBean)); } catch (Exception ex) { throw new IllegalArgumentException("Cant set property", ex); } } } }