package org.ripple.power.i18n.message; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Proxy; import org.ripple.power.i18n.message.annotations.Handler; import org.ripple.power.i18n.message.handlers.MessageFormatMessageHandler; import org.ripple.power.i18n.message.handlers.StringFormatMessageHandler; public class MessageUtils { public static <T> T createMessages(Class<T> clazz) { Handler annotation = clazz.getAnnotation(Handler.class); Class<? extends MessageHandler> handlerClass; if (annotation == null) { return createMessagesByStringFormat(clazz); } else { handlerClass = annotation.value(); } return createMessages(clazz, handlerClass); } public static <T> T createMessages(Class<T> clazz, Class<? extends MessageHandler> handlerClass) { try { MessageHandler handler = handlerClass.getConstructor(Class.class) .newInstance(clazz); return createMessages(clazz, handler); } catch (IllegalArgumentException e) { throw new IllegalStateException(e); } catch (SecurityException e) { throw new IllegalStateException(e); } catch (InstantiationException e) { throw new IllegalStateException(e); } catch (IllegalAccessException e) { throw new IllegalStateException(e); } catch (InvocationTargetException e) { throw new IllegalStateException(e); } catch (NoSuchMethodException e) { throw new IllegalStateException(e); } } public static <T> T createMessages(Class<T> clazz, MessageHandler handler) { Object obj = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz }, handler); return clazz.cast(obj); } public static <T> T createMessagesByStringFormat(Class<T> clazz) { return createMessages(clazz, new StringFormatMessageHandler(clazz)); } public static <T> T createMessagesByMessageFormat(Class<T> clazz) { return createMessages(clazz, new MessageFormatMessageHandler(clazz)); } }