oops i forgot the new virtual:
class abstract CucumberQuery
{
JavaScript getQuery() { return new JavaScript("cucumbers; ${middle};
moreCucumbers").merge(getMiddle()); }
protected abstract Javascript getMiddle();
}
Jonathan Locke wrote:
>
>
> yeah, it's a little tricky, but i think the inheritance hierarchy can
> provide the levels you're looking for (sort of as it does now) with
> overrides and calls to super. i'm not sure exactly what you are asking me
> to do, but the code might look like this (if i understand you right):
>
> class QueryGoogle
> {
> JavaScript getScript()
> {
> final JavaScript script = new JavaScript("function
> wget(http://www.google.com/q=${query},function(){${success}},function(){${failure}}");
>
> return script.merge("query", getQuery(), "success", getSuccess(),
> "failure", getFailure());
> }
>
> protected abstract JavaScript getQuery();
> protected JavaScript getSuccess() { return JavaScript.EMPTY; }
> protected JavaScript getFailure() { return JavaScript.EMPTY; }
> }
>
> class CucumberQuery
> {
> JavaScript getQuery() { return new JavaScript("cucumbers"); }
> }
>
> class ThrottlingCucumberQuery extends CucumberQuery
> {
> JavaScript getQuery() { return new
> ThrottlingDecorator(super.getQuery()); }
> }
>
> class NoTomatoAndAlertCucumberQuery extends CucumberQuery
> {
> JavaScript noTomatoes = new JavaScript("...");
> JavaScript alert = new JavaScript("...");
> JavaScript getQuery() { return
> super.getQuery().append(noTomatoes).append(alert); }
> }
>
> Of course, if the cucumber script supports some kind of merging, it would
> have to provide insertion points, like:
>
> class CucumberQuery
> {
> JavaScript getQuery() { return new JavaScript("cucumbers; ${middle};
> moreCucumbers"); }
> }
>
>
> igor.vaynberg wrote:
>>
>> so you got single level layering
>>
>> but what about multi level?
>>
>> lets say our default ajax behavior returns this:
>>
>> JavaScript code = new JavaScript(
>> "function
>> wget(http://www.google.com/q=${query},function(){${success}},function(){${failure}}");
>>
>> now something down the road wants to search google for cucumbers
>>
>> so it does
>>
>> return code.merge("query","cucumbers");
>>
>> something later down the road wants to exclude tomatoes from the search
>> results, and also add an alert on failure, but since the previous script
>> lost all the placeholders how would that work? i mean its really use it
>> or
>> lose it.
>>
>> unless the previous script that added cucumbers now provides its own
>> placeholders for all the previous placeholders, but these need to be
>> factored into functions or some such.
>>
>> could you show me what that would look like with your code?
>>
>> so...
>>
>> JavaScript code = new JavaScript(
>> "function
>> wget(http://www.google.com/q=${query},function(){${success}},function(){${failure}}");
>>
>> one layer adds cucumbers to the query
>>
>> the next layer excludes tomatoes and adds an alert on failure
>>
>> -igor
>>
>>
>> On 4/19/07, Jonathan Locke <[EMAIL PROTECTED]> wrote:
>>>
>>>
>>>
>>> A throttling decorator would look like this:
>>>
>>> public static class ThrottlingDecorator extends JavaScript {
>>>
>>> private static final JavaScript THROTTLER = new JavaScript(
>>> "wicketThrottler.throttle('${id}', ${milliseconds},
>>> ${function});");
>>>
>>> public ThrottlingDecorator(final String id,
>>> final Duration maxFrequency, final JavaScript script) {
>>> super(THROTTLER.merge("id", id, "milliseconds", maxFrequency
>>> .getMilliseconds(), "function", script.function()));
>>> }
>>> }
>>>
>>> and usage of that would be:
>>>
>>> code = new ThrottlingDecorator("id", Duration.ONE_SECOND, code);
>>>
>>>
>>> Jonathan Locke wrote:
>>> >
>>> > 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#a10090957
>>> Sent from the Wicket - Dev mailing list archive at Nabble.com.
>>>
>>>
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/JavaScript-object-tf3610605.html#a10091122
Sent from the Wicket - Dev mailing list archive at Nabble.com.