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

org.zkoss.bind.xel.zel.DynamicPropertiedELResolver Maven / Gradle / Ivy

/* DynamicPropertyELResolver.java

	Purpose:
		
	Description:
		
	History:
		2012/11/20 Created by dennis

Copyright (C) 2011 Potix Corporation. All Rights Reserved.
 */
package org.zkoss.bind.xel.zel;

import java.beans.FeatureDescriptor;
import java.util.Iterator;

import org.zkoss.zel.BeanELResolver;
import org.zkoss.zel.ELContext;
import org.zkoss.zel.ELException;
import org.zkoss.zel.PropertyNotFoundException;
import org.zkoss.zel.PropertyNotWritableException;
import org.zkoss.zk.ui.ext.DynamicPropertied;

/**
 * A resolver to resolve value base on BeanELResolver and DynamicPropertied.
 * It only handle evaluation when a base object's type is DynamicPropertied
 * @author dennis
 * @since 6.5.1
 */
public class DynamicPropertiedELResolver extends BeanELResolver {

	
	public DynamicPropertiedELResolver(){
		super(false);
	}
	
	
	public Object getValue(ELContext context, Object base, Object property) throws NullPointerException,
			PropertyNotFoundException, ELException {
		if (context == null) {
			throw new NullPointerException();
		}
		Object val = null;
		if(base instanceof DynamicPropertied){
			//don't get value before check it types(DynamicPropertied), to prevent call super 
			//BeanELResolver too early before other resolvers
			try{
				val = super.getValue(context, base, property);
			}catch(PropertyNotFoundException x){
				if(((DynamicPropertied)base).hasDynamicProperty(property.toString())){
					context.setPropertyResolved(true);
					val = ((DynamicPropertied)base).getDynamicProperty(property.toString());
				}else{
					context.setPropertyResolved(false);//super always set resolved to true, reset it
				}
			}
		}
		return val;
	}

	
	public Class getType(ELContext context, Object base, Object property) throws NullPointerException,
			PropertyNotFoundException, ELException {
		Class type = null;
		if(base instanceof DynamicPropertied){
			//don't get value before check it types, , to prevent call super 
			//BeanELResolver too early before other resolvers
			try{
				type = super.getType(context, base, property);
			}catch(PropertyNotFoundException x){
				context.setPropertyResolved(true);
				type = Object.class;
			}
		}
		
		return type;
	}

	
	public void setValue(ELContext context, Object base, Object property, Object value) throws NullPointerException,
			PropertyNotFoundException, PropertyNotWritableException, ELException {
		if(base instanceof DynamicPropertied){
			//don't get value before check it types, , to prevent call super 
			//BeanELResolver too early before other resolvers
			try{
				super.setValue(context, base, property,value);
			}catch(PropertyNotFoundException x){
				context.setPropertyResolved(true);
				((DynamicPropertied)base).setDynamicProperty(property.toString(), value);
			}
		}
	}

	
	public boolean isReadOnly(ELContext context, Object base, Object property) throws NullPointerException,
			PropertyNotFoundException, ELException {
		if(base instanceof DynamicPropertied){
			return super.isReadOnly(context, base, property);
		}
		return true;
	}

	
	public Iterator getFeatureDescriptors(ELContext context, Object base) {
		return null;
	}

	
	public Class getCommonPropertyType(ELContext context, Object base) {
		return null;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy