package knorxx.framework.generator.web.generator; import knorxx.framework.generator.single.JavaScriptResult; import knorxx.framework.generator.single.SingleFileGeneratorException; import static knorxx.framework.generator.util.JavaIdentifierUtils.hasSuperclassOrImplementsInterface; import knorxx.framework.generator.web.client.JsonHelper; import knorxx.framework.generator.web.client.MessageQueue; import knorxx.framework.generator.web.generator.stjs.StjsJavaScriptClassBuilder; import org.atmosphere.config.service.ManagedService; /** * * @author sj */ public class MessageQueueFileGenerator extends SpecialFileGenerator { @Override public JavaScriptResult generate(Class<?> javaClass) throws SingleFileGeneratorException { String messageQueueUrl = javaClass.getAnnotation(ManagedService.class).path(); StjsJavaScriptClassBuilder builder = new StjsJavaScriptClassBuilder(javaClass) .constructor(javaClass) ._constructor() .function(javaClass, "subscribe", "callbacks") .code("var request = {};").newLine() .code("$.extend(request, callbacks);").newLine() .newLine() .code("request.url =").literal(messageQueueUrl).semicolon().newLine() .code("request.contentType = ").literal("application/json").semicolon().newLine() .code("request.trackMessageLength = ").literal(true).semicolon().newLine() .code("request.shared = ").literal(false).semicolon().newLine() .code("request.transport = ").literal("websocket").semicolon().newLine() .code("request.fallbackTransport = ").literal("long-polling").semicolon().newLine() .newLine() .if$("callbacks.onMessage") .code("request.onMessage = ").anonymousFunction("response") .code("response.data = JSON.parse(response.responseBody, %s);", JsonHelper.PARSE_REVIVER_FUNCTION).newLine() .code("delete response.responseBody;").newLine() .code("callbacks.onMessage(response);").newLine() ._function() ._if() .newLine() .code("var connection = $.atmosphere.subscribe(request);").newLine() .code("var oldPushFunction = connection.push;").newLine() .code("connection.push = ").anonymousFunction("data") .code("oldPushFunction.call(connection, JSON.stringify(data, %s));", JsonHelper.STRINGIFY_REPLACER_FUNCTION).newLine() ._function() .newLine() .code("return connection;").newLine() ._function(); return new JavaScriptResult(builder.create()); } @Override public boolean isGeneratable(Class<?> javaClass) { return !javaClass.getName().equals(MessageQueue.class.getName()) && hasSuperclassOrImplementsInterface(javaClass, MessageQueue.class.getName()); } }