/*
JWildfire - an image and animation processor written in Java
Copyright (C) 1995-2011 Andreas Maschke
This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this software;
if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jwildfire.base;
import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.l2fprod.common.beans.BaseBeanInfo;
import com.l2fprod.common.beans.ExtendedPropertyDescriptor;
public abstract class ManagedObject {
private final List<Preset> presets = new ArrayList<Preset>();
public String getName() {
return this.getClass().getSimpleName();
}
public final BeanInfo getBeanInfo() {
List<Field> annotatedFields = new ArrayList<Field>();
Class<?> cls = this.getClass();
while (cls != null) {
for (Field field : cls.getDeclaredFields()) {
if (field.isAnnotationPresent(Property.class)) {
annotatedFields.add(field);
}
}
cls = cls.getSuperclass();
}
if (annotatedFields.size() > 0)
return getAnnotationBeanInfo(annotatedFields);
else
return null; // getStandardBeanInfo();
}
private final BeanInfo getAnnotationBeanInfo(List<Field> pFields) {
BaseBeanInfo res = new BaseBeanInfo(this.getClass());
for (Field field : pFields) {
ExtendedPropertyDescriptor propDesc = res.addProperty(field.getName());
Property propAnno = field.getAnnotation(Property.class);
if (propAnno.description().length() > 0)
propDesc.setShortDescription(propAnno.description());
propDesc.setCategory(propAnno.category().toString());
if (propAnno.editorClass() != Property.DEFAULT.class)
propDesc.setPropertyEditorClass(propAnno.editorClass());
}
return res;
}
/*
private final BeanInfo getStandardBeanInfo() {
BeanInfo beanInfo = new SimpleBeanInfo();
try {
beanInfo = Introspector.getBeanInfo(this.getClass(), ManagedObject.class);
}
catch (Throwable e) {
e.printStackTrace();
}
return beanInfo;
}
*/
public Preset addPreset(String pName) {
Preset preset = new Preset(pName);
presets.add(preset);
return preset;
}
public List<Preset> getPresets() {
return presets;
}
public void initPresets() {
}
protected Preset getPresetByName(String pName) {
for (Preset preset : presets) {
if (preset.getName().equals(pName)) {
return preset;
}
}
return null;
}
protected void applyPreset(Preset preset) {
BeanInfo beanInfo = getBeanInfo();
if (beanInfo != null) {
PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
if (props != null) {
for (PropertyDescriptor prop : props) {
Method writeMethod = prop.getWriteMethod();
if (writeMethod != null) {
Object val = null;
PresetProperty<?> property = preset.getPropertyByName(prop.getName());
if (property != null) {
val = property.getValue();
}
if (val != null) {
try {
writeMethod.invoke(this, val);
}
catch (Exception ex) {
throw new RuntimeException("Error setting property " + prop.getName() + " " + val, ex);
}
}
}
}
}
}
}
}