/**
* $Id: FieldAdapterManager.java 54 2009-05-18 15:29:27Z azeckoski $
* $URL: http://reflectutils.googlecode.com/svn/trunk/src/main/java/org/azeckoski/reflectutils/beanutils/FieldAdapterManager.java $
* FieldAdapterManager.java - reflectutils - Oct 2, 2008 10:31:44 PM - azeckoski
**************************************************************************
* Copyright (c) 2008 Aaron Zeckoski
* Licensed under the Apache License, Version 2.0
*
* A copy of the Apache License has been included in this
* distribution and is available at: http://www.apache.org/licenses/LICENSE-2.0.txt
*
* Aaron Zeckoski (azeckoski @ gmail.com) (aaronz @ vt.edu) (aaron @ caret.cam.ac.uk)
*/
package org.azeckoski.reflectutils.beanutils;
import org.azeckoski.reflectutils.ClassLoaderUtils;
/**
* This manager ensures that the field adapter keeps working even if the class it is adapting goes away
*
* @author Aaron Zeckoski (azeckoski @ gmail.com)
*/
public class FieldAdapterManager {
public static final String DYNABEAN_CLASSNAME = "org.apache.commons.beanutils.DynaBean";
public static final String DYNABEAN_ADAPTER = "DynaBeanAdapter";
protected FieldAdapter fieldAdapter;
public FieldAdapterManager() {
/*
* loads up the field adapter if the right classes exist,
* this allows us to support DynaBeans even though they may not be available
*/
Class<?> dynaBean = ClassLoaderUtils.getClassFromString(DYNABEAN_CLASSNAME);
if (dynaBean != null) {
// assumes the adapter impl is in the same path as the interface
String path = FieldAdapter.class.getName();
path = path.replace(FieldAdapter.class.getSimpleName(), DYNABEAN_ADAPTER);
Class<?> adapterClass = ClassLoaderUtils.getClassFromString(path);
if (adapterClass == null) {
System.err.println("WARN: Could not find adapter class: " + path + ", will continue without the dynabean adapter");
//throw new IllegalStateException("Could not find adapter class: " + DYNABEAN_ADAPTER);
} else {
// found the adapter class
try {
fieldAdapter = (FieldAdapter) adapterClass.newInstance();
} catch (Exception e) {
System.err.println("WARN: Failed to instantiate field adapter ("+adapterClass+"), will continue without the dynabean adapter: "+e);
//throw new RuntimeException("Failed to instantiate field adapter ("+adapterClass+"): "+e, e);
}
}
} else {
// no dynabean so use default
fieldAdapter = new DefaultFieldAdapter();
}
if (fieldAdapter == null) {
// failure with dynabean so use default
fieldAdapter = new DefaultFieldAdapter();
}
}
public FieldAdapter getFieldAdapter() {
return fieldAdapter;
}
public boolean isAdaptableObject(Object obj) {
boolean adaptable = false;
try {
adaptable = fieldAdapter.isAdaptableObject(obj);
} catch (NoClassDefFoundError e) {
// invalid field adapter, back to the default one
fieldAdapter = new DefaultFieldAdapter();
adaptable = false;
}
return adaptable;
}
public boolean isAdaptableClass(Class<?> beanClass) {
boolean adaptable = false;
try {
adaptable = fieldAdapter.isAdaptableClass(beanClass);
} catch (NoClassDefFoundError e) {
// invalid field adapter, back to the default one
fieldAdapter = new DefaultFieldAdapter();
adaptable = false;
}
return adaptable;
}
}