package origo.helpers.forms;
import org.apache.commons.lang.StringUtils;
import origo.helpers.ReflectionHelper;
import play.modules.origo.core.CachedAnnotation;
import play.modules.origo.core.Listeners;
import play.modules.origo.core.Node;
import play.modules.origo.core.annotations.forms.OnLoadForm;
import play.modules.origo.core.ui.UIElement;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Helper to trigger \@OnLoad form listeners. Should not be used directly, use NodeHelper instead.
*
* @see origo.helpers.NodeHelper
* @see play.modules.origo.core.annotations.OnLoad
*/
public class OnLoadFormHelper {
public static void triggerBeforeListener(Node node, Class argType, Object arg) {
triggerBeforeListener(null, node, argType, arg);
}
public static void triggerBeforeListener(String withType, Node node) {
triggerBeforeListener(withType, node, Collections.<Class, Object>emptyMap());
}
public static void triggerBeforeListener(String withType, Node node, Class argType, Object arg) {
triggerBeforeListener(withType, node, Collections.<Class, Object>singletonMap(argType, arg));
}
public static void triggerBeforeListener(String withType, Node node, Map<Class, Object> args) {
List<CachedAnnotation> listeners = findListenerForType(withType, false);
if (listeners != null && !listeners.isEmpty()) {
Map<Class, Object> parameters = new HashMap<Class, Object>();
parameters.put(Node.class, node);
parameters.putAll(args);
for (CachedAnnotation listener : listeners) {
ReflectionHelper.invokeMethod(listener.method, parameters);
}
}
}
public static void triggerAfterListener(Node node, Class argType, Object arg, UIElement uiElement) {
triggerAfterListener(null, node, argType, arg, uiElement);
}
public static void triggerAfterListener(String withType, Node node, Class argType, Object arg, UIElement uiElement) {
Map<Class, Object> args = new HashMap<Class, Object>();
args.put(argType, arg);
args.put(UIElement.class, uiElement);
triggerAfterListener(withType, node, args);
}
public static void triggerAfterListener(String withType, Node node, UIElement uiElement) {
triggerAfterListener(withType, node, Collections.<Class, Object>singletonMap(UIElement.class, uiElement));
}
public static void triggerAfterListener(String withType, Node node) {
triggerAfterListener(withType, node, Collections.<Class, Object>emptyMap());
}
public static void triggerAfterListener(String withType, Node node, Map<Class, Object> args) {
List<CachedAnnotation> listeners = findListenerForType(!StringUtils.isBlank(withType) ? withType : node.getClass().getName(), true);
if (listeners != null && !listeners.isEmpty()) {
Map<Class, Object> parameters = new HashMap<Class, Object>();
parameters.put(Node.class, node);
parameters.putAll(args);
for (CachedAnnotation listener : listeners) {
ReflectionHelper.invokeMethod(listener.method, parameters);
}
}
}
private static List<CachedAnnotation> findListenerForType(final String withType, final boolean after) {
return Listeners.getListenersForAnnotationType(OnLoadForm.class, new CachedAnnotation.ListenerSelector() {
@Override
public boolean isCorrectListener(CachedAnnotation listener) {
OnLoadForm annotation = ((OnLoadForm) listener.annotation);
return annotation.after() == after && (StringUtils.isBlank(annotation.with()) || annotation.with().equals(withType));
}
});
}
}