Something like class below (although perhaps more efficient) could help us to
decorate and merge javascript in our AJAX code.  Because code merges only
occur one layer at a time, it's as good as an AST for our simple purposes
(we don't need to globally refactor JavaScript, for example, only combine it
neatly), but much easier to use.  I personally would have no problem
breaking the API to make this better, but we could also do this with 100%
backwards compat by simply having things that need JavaScript make a call to
a getWhateverJavaScript() method first and if that returns null (in the
default impl), it could proceed to do what it does now.  So basically if you
wanted to assemble your script this new way, you could override these new
methods and the old stuff would be bypassed.  Feedback?

    Jonathan

---

package thoof.util.javascript;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.wicket.util.io.Streams;
import org.apache.wicket.util.string.interpolator.MapVariableInterpolator;

public class JavaScript {

    private final String script;

    private static final Pattern UNINTERPOLATED_VARIABLES = Pattern
            .compile("\\s*\\$\\{\\w+\\}\\s*");

    public JavaScript(final String script) {
        this.script = script;
    }

    public static JavaScript load(final Class<?> type, final String
resourceName) {
        return load(type.getResourceAsStream(resourceName));
    }

    public static JavaScript load(final InputStream in) {
        try {
            return new JavaScript(Streams.readString(in));
        } catch (final IOException e) {
            throw new IllegalStateException("Cannot load email template",
e);
        }
    }

    public final JavaScript merge(final Map<String, Object> map) {
        final String mergedScript = new MapVariableInterpolator(this.script,
                map).toString();
        return new JavaScript(UNINTERPOLATED_VARIABLES.matcher(mergedScript)
                .replaceAll(" "));
    }

    public final JavaScript merge(final Object... args) {
        if (args.length % 2 != 0) {
            throw new IllegalArgumentException(
                    "Invalid interpolation arguments");
        }
        final Map<String, Object> map = new HashMap<String, Object>();
        for (int i = 0; i < args.length; i += 2) {
            if (args[i] instanceof String) {
                map.put((String) args[i], args[i + 1]);
            } else {
                throw new IllegalArgumentException(
                        "Invalid interpolation arguments");
            }
        }
        return merge(map);
    }

    public final JavaScript prepend(final JavaScript script) {
        return new JavaScript(script + ";" + this.script);
    }

    public final JavaScript append(final JavaScript script) {
        return new JavaScript(this.script + ";" + script);
    }

    public final JavaScript function(final String functionName) {
        return new JavaScript("var " + functionName + " = function { " +
script
                + "};");
    }

    @Override
    public String toString() {
        return MapVariableInterpolator.interpolate(script,
                Collections.EMPTY_MAP);
    }

    public static void main(final String arguments[]) {
        JavaScript code = new JavaScript("var x = 10 + 3");
        System.out.println("" + code.toString());
        code = code.prepend(new JavaScript("a + b"));
        System.out.println("" + code.toString());
        code = code.append(new JavaScript("c + d"));
        System.out.println("" + code.toString());
        code = code.function("callback");
        System.out.println("" + code.toString());
        JavaScript ajax = new JavaScript(
                "var wcall; ${beforeCallback} wcall =
wicketAjaxGet('${url}', function() { ${success} }, function() { ${failure}
}); ${afterCallback} return !wcall;);");
        code = ajax.merge("url", "/abc/def", "beforeCallback", code,
                "afterCallback", "a = b + c + d");
        System.out.println("" + code.toString());
    }
}

-- 
View this message in context: 
http://www.nabble.com/JavaScript-object-tf3610605.html#a10089745
Sent from the Wicket - Dev mailing list archive at Nabble.com.

Reply via email to