package com.trsvax.facebook.services; import java.util.Map; import java.util.Map.Entry; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.plastic.MethodAdvice; import org.apache.tapestry5.plastic.MethodInvocation; import org.apache.tapestry5.plastic.PlasticMethod; import org.apache.tapestry5.services.Environment; import org.apache.tapestry5.services.javascript.JavaScriptSupport; import com.trsvax.facebook.FBSubscribe; import com.trsvax.facebook.environment.FacebookEnvironment; import com.trsvax.jacquard.annotations.Subscribe; import com.trsvax.jacquard.services.AbstractSubscribeWorker; public class FBSubscribeWorker extends AbstractSubscribeWorker implements FBSubscribe { private final Environment environment; public FBSubscribeWorker(JavaScriptSupport javaScriptSupport, Environment environment) { super(javaScriptSupport); this.environment = environment; } @Override public void subscribe(final Map<String, Subscribe> events, final PlasticMethod method) { method.addAdvice( new MethodAdvice() { public void advise(MethodInvocation invocation) { ComponentResources resources = invocation.getInstanceContext().get(ComponentResources.class); FacebookEnvironment facebookEnvironment = environment.peekRequired(FacebookEnvironment.class); for ( Entry<String, Subscribe> entry: events.entrySet() ) { String name = entry.getKey(); Subscribe subscribe = entry.getValue(); String url = resources.createEventLink(name).toURI(); facebookEnvironment.addInitializerCall(script(name,url,subscribe)); //javaScriptSupport.addScript(script(name, url, subscribe)); } invocation.proceed(); } }); } @Override public String script(String name, String url, Subscribe subscribe) { return String.format("FB.Event.subscribe('%s',function(response) {" + "$.ajax({url: '%s'}); " + "return %s;\n});",name, url,subscribe.returnValue()); } }