package org.ovirt.engine.ui.webadmin.plugin.jsni; import org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction.ErrorHandler; import com.google.gwt.core.client.JsArray; /** * Helper class that stores {@link JsFunction} invocation result information for later use. */ public class JsFunctionResultHelper { private final JsFunction function; // Function invocation result information private Object resultValue; private String resultType; public JsFunctionResultHelper(JsFunction function) { this.function = function; } /** * Convenience method combining {@link #invokeAsString} and {@link #getResultAsString}. * <p> * All method parameters are optional (can be {@code null}). */ public static String invokeAndGetResultAsString(JsFunction function, JsArray<?> args, ErrorHandler errorHandler, String defaultValue) { if (function == null) { return defaultValue; } JsFunctionResultHelper helper = new JsFunctionResultHelper(function); if (helper.invokeAsString(args, errorHandler)) { String result = helper.getResultAsString(); if (result != null) { return result; } } return defaultValue; } /** * Convenience method combining {@link #invokeAsNumber} and {@link #getResultAsNumber}. * <p> * All method parameters are optional (can be {@code null}). */ public static double invokeAndGetResultAsNumber(JsFunction function, JsArray<?> args, ErrorHandler errorHandler, double defaultValue) { if (function == null) { return defaultValue; } JsFunctionResultHelper helper = new JsFunctionResultHelper(function); if (helper.invokeAsNumber(args, errorHandler)) { Double result = helper.getResultAsNumber(); if (result != null) { return result.doubleValue(); } } return defaultValue; } /** * Convenience method combining {@link #invokeAsBoolean} and {@link #getResultAsBoolean}. * <p> * All method parameters are optional (can be {@code null}). */ public static boolean invokeAndGetResultAsBoolean(JsFunction function, JsArray<?> args, ErrorHandler errorHandler, boolean defaultValue) { if (function == null) { return defaultValue; } JsFunctionResultHelper helper = new JsFunctionResultHelper(function); if (helper.invokeAsBoolean(args, errorHandler)) { Boolean result = helper.getResultAsBoolean(); if (result != null) { return result.booleanValue(); } } return defaultValue; } void clearResultInformation() { this.resultValue = null; this.resultType = null; } /** * Invokes the native function, expecting String return value. * * @see JsFunction#invoke(JsArray, String, org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction.ResultHandler, ErrorHandler) * @see #getResultAsString */ public boolean invokeAsString(JsArray<?> args, ErrorHandler errorHandler) { clearResultInformation(); return function.invoke(args, JsFunction.RESULT_TYPE_STRING, (String result) -> { JsFunctionResultHelper.this.resultValue = result; JsFunctionResultHelper.this.resultType = JsFunction.RESULT_TYPE_STRING; }, errorHandler); } public String getResultAsString() { return JsFunction.RESULT_TYPE_STRING.equals(resultType) ? (String) resultValue : null; } /** * Invokes the native function, expecting Double return value. * * @see JsFunction#invoke(JsArray, String, org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction.ResultHandler, ErrorHandler) * @see #getResultAsNumber */ public boolean invokeAsNumber(JsArray<?> args, ErrorHandler errorHandler) { clearResultInformation(); return function.invoke(args, JsFunction.RESULT_TYPE_NUMBER, (Double result) -> { JsFunctionResultHelper.this.resultValue = result; JsFunctionResultHelper.this.resultType = JsFunction.RESULT_TYPE_NUMBER; }, errorHandler); } public Double getResultAsNumber() { return JsFunction.RESULT_TYPE_NUMBER.equals(resultType) ? (Double) resultValue : null; } /** * Invokes the native function, expecting Boolean return value. * * @see JsFunction#invoke(JsArray, String, org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction.ResultHandler, ErrorHandler) * @see #getResultAsBoolean */ public boolean invokeAsBoolean(JsArray<?> args, ErrorHandler errorHandler) { clearResultInformation(); return function.invoke(args, JsFunction.RESULT_TYPE_BOOLEAN, (Boolean result) -> { JsFunctionResultHelper.this.resultValue = result; JsFunctionResultHelper.this.resultType = JsFunction.RESULT_TYPE_BOOLEAN; }, errorHandler); } public Boolean getResultAsBoolean() { return JsFunction.RESULT_TYPE_BOOLEAN.equals(resultType) ? (Boolean) resultValue : null; } }