/*
* Copyright 2014 Effektif GmbH.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.effektif.workflow.impl.data.types;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import com.effektif.workflow.api.Configuration;
import com.effektif.workflow.api.types.DataType;
import com.effektif.workflow.api.types.JavaBeanType;
import com.effektif.workflow.impl.data.DataTypeImpl;
import com.effektif.workflow.impl.data.DataTypeService;
import com.effektif.workflow.impl.json.JavaBeanValueMapper;
/**
* @author Tom Baeyens
*/
public class JavaBeanTypeImpl<T extends DataType> extends ObjectTypeImpl<T> {
protected JavaBeanValueMapper valueMapper;
protected Class<?> valueClass;
public JavaBeanTypeImpl() {
super((T) new JavaBeanType());
}
public JavaBeanTypeImpl(DataType typeApi) {
super((T) typeApi);
this.valueClass = (Class<?>)typeApi.getValueType();
}
public void setConfiguration(Configuration configuration) {
super.setConfiguration(configuration);
this.valueMapper = configuration.get(JavaBeanValueMapper.class);
initializeFields();
}
protected void initializeFields() {
scanFields(valueClass);
}
protected void scanFields(Class< ? > valueType) {
if (valueType!=null) {
for (Field field : valueType.getDeclaredFields()) {
if (!Modifier.isStatic(field.getModifiers())) {
addField(field);
}
}
Class< ? > superclass = valueType.getSuperclass();
if (superclass != Object.class) {
scanFields(superclass);
}
}
}
protected void addField(Field field) {
DataTypeService dataTypeService = configuration.get(DataTypeService.class);
DataTypeImpl dataType = dataTypeService.getDataTypeByValue(field.getGenericType());
JavaBeanFieldImpl javaBeanField = new JavaBeanFieldImpl(field, dataType);
addField(javaBeanField);
}
@Override
public boolean isStatic() {
return false;
}
@Override
public String validateInternalValue(Object internalValue) {
if (! valueClass.isAssignableFrom(internalValue.getClass())) {
return "Invalid internal value: was "+internalValue+" ("+internalValue.getClass().getName()+"), expected "+valueClass.getName();
}
return null;
}
public Class< ? > getValueClass() {
return valueClass;
}
public void setJsonService(JavaBeanValueMapper jsonMapper) {
this.valueMapper = jsonMapper;
}
}