/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others. *
* All rights reserved. This program and the accompanying materials *
* are made available under the terms of the Eclipse Public License v1.0 *
* which accompanies this distribution, and is available at *
* http://www.eclipse.org/legal/epl-v10.html *
* *
* Contributors: *
* Soyatec - initial API and implementation *
*******************************************************************************/
package org.eclipse.papyrus.xwt.dataproviders;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.papyrus.xwt.XWT;
import org.eclipse.papyrus.xwt.XWTException;
import org.eclipse.papyrus.xwt.core.IBinding;
import org.eclipse.papyrus.xwt.databinding.JFaceXWTDataBinding;
import org.eclipse.papyrus.xwt.metadata.IMetaclass;
import org.eclipse.papyrus.xwt.metadata.IProperty;
/**
* @author jliu (jin.liu@soyatec.com)
*/
public class ObjectDataProvider extends AbstractDataProvider implements IObjectDataProvider {
static DataModelService dataModelService = new DataModelService() {
public Object toModelType(Object object) {
return JFaceXWTDataBinding.toType(object);
}
public Object loadModelType(String className) {
return XWT.getLoadingContext().loadClass(className);
}
public Object toModelPropertyType(Object type, String propertyName) {
IMetaclass metaclass = XWT.getMetaclass(type);
IProperty property = metaclass.findProperty(propertyName);
if(property == null) {
throw new XWTException(" Property \"" + propertyName + "\" is not found in the class " + metaclass.getType().getName());
}
return property.getType();
}
};
private Object objectInstance;
private Class<?> objectType;
private String methodName;
private List<Object> methodParameters;
/*
* (non-Javadoc)
*
* @see org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#getMethodName()
*/
public String getMethodName() {
return methodName;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#getMethodParameters
* ()
*/
public List<Object> getMethodParameters() {
return methodParameters;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#getObjectInstance()
*/
public Object getObjectInstance() {
if(objectInstance == null && objectType != null) {
try {
objectInstance = objectType.newInstance();
} catch (Exception e) {
throw new XWTException(e);
}
}
return objectInstance;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#getObjectType()
*/
public Class<?> getObjectType() {
if(objectType == null && objectInstance != null) {
objectType = objectInstance.getClass();
}
return objectType;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#setMethodName(java
* .lang.String)
*/
public void setMethodName(String methodName) {
this.methodName = methodName;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#setMethodParameters
* (java.util.List)
*/
public void setMethodParameters(List<Object> parameters) {
this.methodParameters = parameters;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#setObjectInstance
* (java.lang.Object)
*/
public void setObjectInstance(Object objectImstance) {
this.objectInstance = objectImstance;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IObjectDataProvider#setObjectType(java
* .lang.Class)
*/
public void setObjectType(Class<?> objectType) {
this.objectType = objectType;
}
protected Object getTarget() {
Object target = getObjectInstance();
if(target == null) {
return null;
}
Class<?> targetType = getObjectType();
Method method = null;
if(methodName != null) {
List<Class<?>> paras = new ArrayList<Class<?>>();
if(methodParameters != null) {
for(Object p : methodParameters) {
paras.add(p.getClass());
}
}
try {
if(paras.isEmpty()) {
method = targetType.getDeclaredMethod(methodName);
return method.invoke(target);
} else {
method = targetType.getDeclaredMethod(methodName, paras.toArray(new Class<?>[paras.size()]));
return method.invoke(target, methodParameters.toArray(new Object[methodParameters.size()]));
}
} catch (SecurityException e) {
} catch (IllegalArgumentException e) {
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
return target;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IDataProvider#getData(java.lang.String)
*/
public Object getData(String path) {
if(path == null) {
return getTarget();
}
return getData(getTarget(), path);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IDataProvider#getData(java.lang.String)
*/
public Object getData(Object object, String path) {
if(object instanceof IObservableValue) {
object = ((IObservableValue)object).getValue();
}
if(path == null || path.trim().length() == 0 || path.equals(".")) {
return JFaceXWTDataBinding.getValue(object, null);
}
int index = path.indexOf(".");
while(index != -1 && object != null) {
object = JFaceXWTDataBinding.getValue(object, path.substring(0, index));
path = path.substring(index + 1);
index = path.indexOf(".");
}
return JFaceXWTDataBinding.getValue(object, path);
}
public void setData(Object object, String path, Object value) {
if(object instanceof IObservableValue) {
object = ((IObservableValue)object).getValue();
}
int index = path.indexOf(".");
while(index != -1 && object != null) {
object = JFaceXWTDataBinding.getValue(object, path.substring(0, index));
path = path.substring(index + 1);
index = path.indexOf(".");
}
JFaceXWTDataBinding.setValue(object, path, value);
}
public void setData(String path, Object value) {
setData(getTarget(), path, value);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.papyrus.xwt.dataproviders.IDataProvider#getDataType(java.lang.
* String)
*/
public Class<?> getDataType(String path) {
Object target = getTarget();
if(target == null) {
return null;
}
Class<?> type = JFaceXWTDataBinding.toType(target);
if(path == null) {
return type;
}
return JFaceXWTDataBinding.getValueType(type, path);
}
/**
* check if the property is read only
*
* @param path
* @return
*/
public boolean isPropertyReadOnly(String path) {
Object target = getTarget();
if(target == null || path == null) {
return true;
}
if(target instanceof IBinding) {
target = ((IBinding)target).getValue(null);
}
Class<?> type = JFaceXWTDataBinding.toType(target);
int index = path.indexOf(".");
while(index != -1 && target != null) {
type = JFaceXWTDataBinding.getValueType(type, path.substring(0, index));
path = path.substring(index + 1);
index = path.indexOf(".");
}
return JFaceXWTDataBinding.isPropertyReadOnly(type, path);
}
@Override
protected IObservableValue observeValue(Object bean, String propertyName) {
if(JFaceXWTDataBinding.isBeanSupport(bean)) {
return BeansObservables.observeValue(XWT.getRealm(), bean, propertyName);
}
return PojoObservables.observeValue(XWT.getRealm(), bean, propertyName);
}
protected IObservableList observeList(Object bean, String propertyName) {
if(JFaceXWTDataBinding.isBeanSupport(bean)) {
return BeansObservables.observeList(XWT.getRealm(), bean, propertyName);
}
return PojoObservables.observeList(XWT.getRealm(), bean, propertyName);
}
protected IObservableSet observeSet(Object bean, String propertyName) {
if(JFaceXWTDataBinding.isBeanSupport(bean)) {
return BeansObservables.observeSet(XWT.getRealm(), bean, propertyName);
}
return PojoObservables.observeSet(XWT.getRealm(), bean, propertyName);
}
protected IObservableList observeDetailList(IObservableValue bean, Object elementType, String propertyName, Object propertyType) {
if(JFaceXWTDataBinding.isBeanSupport(bean)) {
return BeansObservables.observeDetailList(bean, propertyName, (Class<?>)propertyType);
}
return PojoObservables.observeDetailList(bean, propertyName, (Class<?>)propertyType);
}
protected IObservableSet observeDetailSet(IObservableValue bean, Object elementType, String propertyName, Object propertyType) {
if(JFaceXWTDataBinding.isBeanSupport(bean)) {
return BeansObservables.observeDetailSet(bean, propertyName, (Class<?>)propertyType);
}
return PojoObservables.observeDetailSet(bean, propertyName, (Class<?>)propertyType);
}
@Override
protected IObservableValue observeDetailValue(IObservableValue master, Object elementType, String propertyName, Object propertyType) {
Class<?> beanClass = (Class<?>)elementType;
if(beanClass == null && master.getValueType() instanceof Class<?>) {
beanClass = (Class<?>)master.getValueType();
}
if(JFaceXWTDataBinding.isBeanSupport(beanClass)) {
return BeanProperties.value(beanClass, propertyName, (Class<?>)propertyType).observeDetail(master);
}
return PojoProperties.value(beanClass, propertyName, (Class<?>)propertyType).observeDetail(master);
}
public IValueProperty createValueProperty(Object type, String propertyName) {
if(JFaceXWTDataBinding.isBeanSupport(type)) {
return BeanProperties.value(JFaceXWTDataBinding.toType(type), propertyName);
}
return PojoProperties.value(JFaceXWTDataBinding.toType(type), propertyName);
}
public DataModelService getModelService() {
return dataModelService;
}
}