All pastes #279356 Raw Edit

Unnamed

public text v1 · immutable
·published 2006-12-14 23:47 UTC
rendered paste body
/*
 * BeanContainer.java
 *
 * Created on 2 décembre 2006, 10:48
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package de.berlios.developer.jhtmlcleaner.utils;

import org.apache.commons.collections.ExtendedProperties;
import org.apache.commons.io.IOUtils;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;

import java.io.BufferedInputStream;
import java.io.InputStream;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import java.util.Hashtable;
import java.util.Iterator;


/**
 *
 * @author mrcheeks
 */
public class BeanContainer {
    private static BeanContainer container;
    private String propertiesFile;
    private ExtendedProperties properties;
    private Hashtable beanList;
    private final String BEAN_CLASS_PREFIX = ".(class)";

    /** Creates a new instance of BeanContainer */
    private BeanContainer() {
        beanList = new Hashtable();
        properties = new ExtendedProperties();
    }

    public Object getBean(String alias) {
        return beanList.get(alias);
    }

    public static BeanContainer getInstance() {
        if (container == null) {
            container = new BeanContainer();
        }

        return container;
    }

    public void load(String location) {
        setup(location);
    }

    public void setup(String location) {
        try {
            InputStream is = getClass()
                                 .getResourceAsStream(location);
            InputStream bis = new BufferedInputStream(is);

            properties.load(bis);

            IOUtils.closeQuietly(bis);
            IOUtils.closeQuietly(is);

            Iterator it = properties.getKeys();

            while (it.hasNext()) {
                String property_key = it.next().toString();

                String[] keyTable = property_key.split("\\.");

                if (property_key.endsWith(BEAN_CLASS_PREFIX)) {
                    String beanClass = properties.getString(property_key);

                    Object bean = Class.forName(beanClass).newInstance();

                    StringBuffer actionCommand = new StringBuffer();
                    actionCommand.append(keyTable[0] + "." + keyTable[1]);

                    beanList.put(actionCommand.toString(), bean);

                    BeanInfo bi = Introspector.getBeanInfo(bean.getClass());

                    PropertyDescriptor[] pd = bi.getPropertyDescriptors();

                    final int len = pd.length;

                    for (int i = 0; i < len; i++) {
                        PropertyDescriptor property = pd[i];

                        String name = property.getName();

                        if (name.endsWith("class")) {
                            continue;
                        }

                        StringBuffer propToFind = new StringBuffer();
                        propToFind.append(keyTable[0]);
                        propToFind.append(".");
                        propToFind.append(keyTable[1]);
                        propToFind.append(".");
                        propToFind.append(name);

                        String propertyLookup = propToFind.toString();

                        String value = properties.getString(propertyLookup);

                        if (value != null) {
                            setProperty(bean, property, value);
                        }
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(1);
        }
    }

    private void setProperty(Object bean, PropertyDescriptor p, String value) {
        Class propType = p.getPropertyType();
        PropertyEditor editor = PropertyEditorManager.findEditor(propType);

        if (editor == null) {
            throw new IllegalArgumentException("Not found: " + propType);
        }

        Method setter = p.getWriteMethod();
        editor.setAsText(value);

        Object result = editor.getValue();

        try {
            setter.invoke(bean, new Object[] { result });
        } catch (IllegalAccessException e) {
            throw new SecurityException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    public String getPropertiesFile() {
        return propertiesFile;
    }

    public void setPropertiesFile(String propertiesFile) {
        this.propertiesFile = propertiesFile;
    }
}