001    package org.shiftone.jrat.util;
002    
003    import org.shiftone.jrat.core.JRatException;
004    import org.shiftone.jrat.util.log.Logger;
005    
006    import java.beans.PropertyDescriptor;
007    import java.beans.PropertyEditor;
008    import java.beans.PropertyEditorManager;
009    import java.util.Iterator;
010    import java.util.Map;
011    
012    /**
013     * @author jeff@shiftone.org (Jeff Drost)
014     */
015    public class PropertyUtil {
016    
017        private static final Logger LOG = Logger.getLogger(PropertyUtil.class);
018    
019        public static void setProperties(Object instance, Map properties) {
020    
021            Iterator iterator = properties.entrySet().iterator();
022            Class klass = instance.getClass();
023    
024            while (iterator.hasNext()) {
025    
026                Map.Entry entry = (Map.Entry) iterator.next();
027                String propertyName = (String) entry.getKey();
028                String value = (String) entry.getValue();
029    
030                try {
031    
032                    PropertyDescriptor descriptor = new PropertyDescriptor(propertyName, klass);
033                    PropertyEditor propertyEditor = PropertyEditorManager.findEditor(descriptor.getPropertyType());
034    
035                    if (propertyEditor == null) {
036                        throw new Exception("no property editor found for " + descriptor.getPropertyType().getName());
037                    }
038    
039                    propertyEditor.setValue(instance);
040    
041                    LOG.info(klass.getName() + "." + propertyName + " = " + value);
042    
043                    propertyEditor.setAsText(value);
044                    descriptor.getWriteMethod().invoke(instance, new Object[]{propertyEditor.getValue()});
045    
046                } catch (Exception e) {
047    
048                    throw new JRatException("failed to set property "
049                            + propertyName
050                            + " to value "
051                            + value
052                            + " on class "
053                            + klass.getName(), e);
054    
055                }
056            }
057    
058        }
059    }