All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.jwic.controls.pojoedit.PojoEditorModel Maven / Gradle / Ivy

There is a newer version: 5.3.43
Show newest version
/**
 * 
 */
package de.jwic.controls.pojoedit;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import de.jwic.base.IControl;
import de.jwic.controls.pojoedit.handler.BooleanFieldHandler;
import de.jwic.controls.pojoedit.handler.EnumFieldHandler;
import de.jwic.controls.pojoedit.handler.NumberFieldHandler;
import de.jwic.controls.pojoedit.handler.TextFieldHandler;

/**
 * The backend model for the PojoEditor. Initialize with the Class of objects you want
 * to edit. Then use loadPojo(..) and savePojo(..) to load and save data.
 * 
 * The object classes you want to edit can use annotations (PojoEditable) to specify
 * additional behavior.
 * 
 * @author lippisch
 */
public class PojoEditorModel implements Serializable{

	/** List of properties to always skip */
	private final static Set SKIP_PROPERTIES = new HashSet();
	static {
		SKIP_PROPERTIES.add("class");
	}

	private final static Log log = LogFactory.getLog(PojoEditorModel.class);
	
	private Class pojoClass;
	private List fields = new ArrayList();
	
	private List> availableHandler = new ArrayList>();
	
	
	/**
	 * Construct a new model for the type specified.
	 * @throws PojoEditorException 
	 */
	public PojoEditorModel(Class pojoClass) throws PojoEditorException {
		this(pojoClass, null);
	}
	
	/**
	 * Construct a new model for the type specified, including the additional handlers specified.
	 * @throws PojoEditorException 
	 */
	public PojoEditorModel(Class pojoClass, IFieldHandler customHandler[]) throws PojoEditorException {
		this.pojoClass = pojoClass;
		
		if (pojoClass == null) {
			throw new IllegalArgumentException("pojoClass must not be null");
		}
		
		if (customHandler != null) {
			Collections.addAll(availableHandler, customHandler);
		}
		// now add all the "standard handlers"
		availableHandler.add(new BooleanFieldHandler());
		availableHandler.add(new TextFieldHandler());
		availableHandler.add(new EnumFieldHandler());
		availableHandler.add(new NumberFieldHandler());
		
		evaluatePojoClass();
		
	}
	
	/**
	 * Build the field details from the pojo.
	 * @param pojo2
	 * @throws PojoEditorException 
	 */
	private void evaluatePojoClass() throws PojoEditorException {
		
		try {
			BeanInfo beanInfo = Introspector.getBeanInfo(pojoClass);
			for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
				// only add fields that have at least a read method and are not in the list of properties to skip.
				if (pd.getReadMethod() != null && !SKIP_PROPERTIES.contains(pd.getName())) { 
					PojoEditable annotation = pd.getReadMethod().getAnnotation(PojoEditable.class);

					PojoField field = new PojoField(pd, annotation);
					
					// select proper handler
					IFieldHandler fh = null;
					for (IFieldHandler handler : availableHandler) {
						if (handler.accepts(field)) {
							fh = handler;
							break;
						}
					}
					
					
					if (fh != null) {
						field.setFieldHandler(fh);
						fields.add(field);
					} else {
						log.warn("No FieldHandler found for property " + field.getName() + ". The property will not be displayed.");
					}
					
				}
			}
			
			Collections.sort(fields);
			
		} catch (Exception e) {
			throw new PojoEditorException("Error creating model from Pojo", e);
		}
		
	}

	/**
	 * @return the fields
	 */
	public List getFields() {
		return fields;
	}
	
	/**
	 * Load values into the form from the pojo.
	 * @param pojo
	 * @throws PojoEditorException 
	 */
	@SuppressWarnings("unchecked")
	public void loadPojo(Object pojo) throws PojoEditorException {
		
		if (pojo == null) {
			throw new IllegalArgumentException("The pojo to load from must not be null");
		}
		try {
			for (PojoField field : fields) {
				PropertyDescriptor pd = field.getPropertyDescriptor();
				Method readMethod = pd.getReadMethod();
				Object value = readMethod.invoke(pojo);
				IFieldHandler fh = (IFieldHandler)field.getFieldHandler();
				fh.loadValue(field, field.getControl(), value);
			}
		} catch (Exception e) {
			throw new PojoEditorException("Error loading values", e);
		}
	}
	
	/**
	 * Load values into the form from the pojo.
	 * @param pojo
	 * @throws PojoEditorException 
	 */
	@SuppressWarnings("unchecked")
	public void savePojo(Object pojo) throws PojoEditorException {
		
		if (pojo == null) {
			throw new IllegalArgumentException("The pojo to be saved to must not be null");
		}
		try {
			for (PojoField field : fields) {
				PropertyDescriptor pd = field.getPropertyDescriptor();
				Method writeMethod = pd.getWriteMethod();
				IFieldHandler fh = (IFieldHandler)field.getFieldHandler();
				Object value = fh.readValue(field, field.getControl());
				writeMethod.invoke(pojo, value);
			}
		} catch (Exception e) {
			throw new PojoEditorException("Error saving values", e);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy