package instantiation;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Map;

import org.apache.ojb.broker.util.logging.Logger;
import org.apache.ojb.broker.util.logging.LoggerFactory;
import org.apache.ojb.broker.PersistenceBrokerException;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.metadata.FieldDescriptor;

/**
 * @author tal
 */
public class InstantiationDefaultImpl implements Instantiation {
	/**
	 * Constructor for InstantiationDefaultImpl.
	 */
	public InstantiationDefaultImpl() {
		super();
	}

	/**
	 * @see internal.ojb.Instantiation#createObject(ClassDescriptor, Map)
	 */
	public Object createObject(ClassDescriptor cld, Map row) {
		Logger logger = getLogger();
		if (logger.isDebugEnabled()) logger.debug("createObject " + cld.getClassOfObject().getName());
		
        Object result;
        FieldDescriptor fmd;
 		       
        try {
            Class c = cld.getClassOfObject();
            result = c.newInstance();
            
            FieldDescriptor[] fields = cld.getFieldDescriptions();
            for (int i = 0; i < fields.length; i++) {
                fmd = fields[i];
                fmd.getPersistentField().set(result, row.get(fmd.getColumnName()));
            }
            
            return result;
        } catch(Exception ex) {
            throw new PersistenceBrokerException("Unable to build object instance :" + cld.getClassOfObject(), ex);
        }
	}
	
	private static Logger getLogger() {
		return LoggerFactory.getLogger("InstantiationFactory");
	}
}
