package org.jvnet.jaxb2_commons.plugin.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.jvnet.jaxb2_commons.plugin.Ignoring; import com.sun.codemodel.JClass; import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JExpr; import com.sun.codemodel.JExpression; import com.sun.tools.xjc.outline.ClassOutline; public class StrategyClassUtils { public static <T> JExpression createStrategyInstanceExpression( JCodeModel codeModel, final Class<? extends T> strategyInterface, final String strategyClassName) { try { final Class<?> strategyClass = Class.forName(strategyClassName); final JClass strategyJClass = codeModel.ref(strategyClass); try { final Method getInstanceMethod = strategyClass.getMethod( "getInstance", new Class<?>[0]); if (getInstanceMethod != null && strategyInterface.isAssignableFrom(getInstanceMethod .getReturnType()) && Modifier.isStatic(getInstanceMethod.getModifiers()) && Modifier.isPublic(getInstanceMethod.getModifiers())) { return strategyJClass.staticInvoke("getInstance"); } } catch (Exception ignored) { // Nothing to do } try { final Field instanceField = strategyClass.getField("INSTANCE"); if (instanceField != null && strategyInterface.isAssignableFrom(instanceField .getType()) && Modifier.isStatic(instanceField.getModifiers()) && Modifier.isPublic(instanceField.getModifiers())) { return strategyJClass.staticRef("INSTANCE"); } } catch (Exception ignored) { // Nothing to do } return JExpr._new(strategyJClass); } catch (ClassNotFoundException cnfex) { final JClass strategyJClass = codeModel.ref(strategyClassName); return JExpr._new(strategyJClass); } } public static <T> Boolean superClassImplements(ClassOutline classOutline, Ignoring ignoring, Class<? extends T> theInterface) { if (classOutline.target.getBaseClass() != null) { if (!ignoring.isIgnored(classOutline.parent().getClazz( classOutline.target.getBaseClass()))) { return Boolean.TRUE; } else { return Boolean.FALSE; } } else if (classOutline.target.getRefBaseClass() != null) { try { if (theInterface.isAssignableFrom(Class .forName(classOutline.target.getRefBaseClass() .fullName()))) { return Boolean.TRUE; } else { return Boolean.FALSE; } } catch (ClassNotFoundException ignored) { // We'll assume it does implement return Boolean.TRUE; } } else { return null; } } }