package org.fluentlenium.core.conditions.message;
import java.lang.reflect.Proxy;
import java.util.List;
/**
* Provides message proxy implementations of interface that records calls to build message from methods annotated with
* {@link Message}, {@link NotMessage} and {@link MessageContext}.
*/
public final class MessageProxy {
private MessageProxy() {
// Utility class
}
/**
* Wrap an object into a message proxy supporting {@link Message}, {@link NotMessage} and {@link MessageContext}.
*
* @param messageClass class to wrap in the proxy.
* @param instance original instance.
* @param context initial context for generated message.
* @param <T> type of the class to wrap.
* @return a proxy generating message from annotations.
*/
public static <T> T wrap(Class<T> messageClass, Object instance, String context) {
return (T) Proxy.newProxyInstance(MessageProxy.class.getClassLoader(), new Class<?>[] {messageClass},
new MessageBuilderInvocationHandler(context, instance));
}
/**
* Wrap an object into a message proxy supporting {@link Message}, {@link NotMessage} and {@link MessageContext}.
*
* @param messageClass class to wrap in the proxy.
* @param instance original instance.
* @param calls call stack of the proxy.
* @param <T> type of the class to wrap.
* @return a proxy generating message from annotations.
*/
public static <T> T wrap(Class<T> messageClass, Object instance, List<MessageBuilderCall> calls) {
return (T) Proxy.newProxyInstance(MessageProxy.class.getClassLoader(), new Class<?>[] {messageClass},
new MessageBuilderInvocationHandler(calls));
}
/**
* Build a message proxy supporting {@link Message}, {@link NotMessage} and {@link MessageContext}.
*
* @param messageClass class to wrap in the proxy.
* @param context initial context for generated message.
* @param <T> type of the class to wrap.
* @return a proxy generating message from annotations.
*/
public static <T> T builder(Class<T> messageClass, String context) {
return (T) Proxy.newProxyInstance(MessageProxy.class.getClassLoader(), new Class<?>[] {messageClass},
new MessageBuilderInvocationHandler(context));
}
/**
* Build a message proxy supporting {@link Message}, {@link NotMessage} and {@link MessageContext}.
*
* @param messageClass class to wrap in the proxy.
* @param calls call stack of the proxy.
* @param <T> type of the class to wrap.
* @return a proxy generating message from annotations.
*/
public static <T> T builder(Class<T> messageClass, List<MessageBuilderCall> calls) {
return (T) Proxy.newProxyInstance(MessageProxy.class.getClassLoader(), new Class<?>[] {messageClass},
new MessageBuilderInvocationHandler(calls));
}
/**
* Build the message from a proxy
*
* @param proxy message builder proxy
* @return generated message.
*/
public static String message(Object proxy) {
MessageBuilderInvocationHandler invocationHandler = (MessageBuilderInvocationHandler) Proxy.getInvocationHandler(proxy);
if (invocationHandler == null) {
return null;
}
return invocationHandler.buildMessage();
}
}