package org.jboss.seam.util;
import java.lang.reflect.Method;
public class JSF
{
public static final Class PHASE_ID;
public static final Class FACES_EVENT;
public static final Class DATA_MODEL;
public static final Class VALIDATOR_EXCEPTION;
public static final Class CONVERTER_EXCEPTION;
public static final Method GET_WRAPPED_DATA;
public static final Method SET_WRAPPED_DATA;
public static final Method GET_ROW_COUNT;
public static final Object RESTORE_VIEW;
public static final Object UPDATE_MODEL_VALUES;
public static final Object INVOKE_APPLICATION;
public static final Object RENDER_RESPONSE;
static class Dummy {}
static
{
PHASE_ID = classForName("javax.faces.event.PhaseId");
FACES_EVENT = classForName("javax.faces.event.FacesEvent");
DATA_MODEL = classForName("javax.faces.model.DataModel");
VALIDATOR_EXCEPTION = classForName("javax.faces.validator.ValidatorException");
CONVERTER_EXCEPTION = classForName("javax.faces.convert.ConverterException");
GET_WRAPPED_DATA = methodForName(DATA_MODEL, "getWrappedData");
SET_WRAPPED_DATA = methodForName(DATA_MODEL, "setWrappedData", Object.class);
GET_ROW_COUNT = methodForName(DATA_MODEL, "getRowCount");
RESTORE_VIEW = constantValueForName(PHASE_ID, "RESTORE_VIEW");
UPDATE_MODEL_VALUES = constantValueForName(PHASE_ID, "UPDATE_MODEL_VALUES");
INVOKE_APPLICATION = constantValueForName(PHASE_ID, "INVOKE_APPLICATION");
RENDER_RESPONSE = constantValueForName(PHASE_ID, "RENDER_RESPONSE");
}
private static Class classForName(String name)
{
try
{
return Reflections.classForName(name);
}
catch (ClassNotFoundException cnfe)
{
return Dummy.class;
}
}
private static Method methodForName(Class clazz, String name, Class... paramTypes)
{
if (clazz.equals(Dummy.class)) return null;
try
{
return clazz.getDeclaredMethod(name, paramTypes);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
private static Object constantValueForName(Class clazz, String name)
{
if (clazz.equals(Dummy.class)) return null;
try
{
return clazz.getField(name).get(null);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public static int getRowCount(Object dataModel)
{
return (Integer) Reflections.invokeAndWrap(GET_ROW_COUNT, dataModel);
}
public static Object getWrappedData(Object dataModel)
{
return Reflections.invokeAndWrap(GET_WRAPPED_DATA, dataModel);
}
public static Object setWrappedData(Object dataModel, Object data)
{
return Reflections.invokeAndWrap(SET_WRAPPED_DATA, dataModel, data);
}
}