package knorxx.framework.generator.web.generator; import com.google.common.base.Joiner; import java.lang.reflect.Method; import org.apache.commons.lang3.ClassUtils; /** * * @author sj */ public abstract class AbstractJavaScriptBuilder<T extends AbstractJavaScriptBuilder<T>> { protected final StringBuilder source = new StringBuilder(); private int indentation = 0; private boolean noIndent = false; protected abstract T self(); public T noIndent() { noIndent = true; return self(); } public T _noIndent() { noIndent = false; return self(); } public T newLine() { source.append("\n"); return self(); } public T namespace(Class javaClass) { indent(); source.append("stjs.ns('"); source.append(javaClass.getPackage().getName()); source.append("');\n\n"); return self(); } public T jsonStringifyObjectLiteral() { indent(); source.append("JSON.stringify({"); indentation++; return self(); } public T _jsonStringifyObjectLiteral() { indentation--; indent(); source.append("})"); return self(); } public T constructor(Class javaClass) { indent(); source.append(javaClass.getName()); source.append(" = function() {\n"); indentation++; return self(); } public T _constructor() { indentation--; indent(); source.append("}\n\n"); return self(); } public T if$(String expression) { indent(); source.append("if("); source.append(expression); source.append(") {\n"); indentation++; return self(); } public T else$() { indentation--; indent(); source.append("} else {\n"); indentation++; return self(); } public T _if() { indentation--; indent(); source.append("}\n"); return self(); } public T function(Class javaClass, Method method, String... argumentNames) { return function(javaClass, method.getName(), argumentNames); } public T function(Class javaClass, String methodName, String... argumentNames) { indent(); source.append(javaClass.getName()); source.append(".prototype."); source.append(methodName); source.append(" = function("); source.append(Joiner.on(", ").join(argumentNames)); source.append(") {\n"); indentation++; return self(); } public T staticFunction(Class javaClass, String methodName, String... argumentNames) { indent(); source.append(javaClass.getName()); source.append("."); source.append(methodName); source.append(" = function("); source.append(Joiner.on(", ").join(argumentNames)); source.append(") {\n"); indentation++; return self(); } public T staticVariable(Class javaClass, String variableName) { source.append(javaClass.getName()); source.append("."); source.append(variableName); source.append(" = "); return self(); } public T anonymousFunction(String... argumentNames) { source.append("function("); source.append(Joiner.on(", ").join(argumentNames)); source.append(") {\n"); indentation++; return self(); } public T _function() { indentation--; indent(); source.append("}\n\n"); return self(); } public T code(String code, Object... args) { indent(); source.append(String.format(code, args)); return self(); } public T literal(boolean value) { source.append(Boolean.toString(value)); return self(); } public T literal(int value) { source.append(Integer.toString(value)); return self(); } public T literal(Object value) { Class valueClass = value.getClass().equals(String.class) || ClassUtils.isPrimitiveWrapper(value.getClass()) ? value.getClass() : ClassUtils.primitiveToWrapper(value.getClass()); if(Integer.class.equals(valueClass)) { return literal((int)value); } else if(Boolean.class.equals(valueClass)) { return literal((boolean)value); } else if(String.class.equals(valueClass)) { return literal((String)value); } else { throw new IllegalStateException("The type '" + value.getClass().getName() + "' is not a supported literal type!"); } } public T literal(String value) { source.append("'"); source.append(value); source.append("'"); return self(); } public T comma() { source.append(", "); return self(); } public T semicolon() { source.append(";"); return self(); } public T jQueryPost() { indent(); source.append("$.ajax({ type: 'POST',\n"); indentation++; return self(); } public T _jQueryPost() { indentation--; indent(); source.append("});\n"); return self(); } public T property(String propertyName) { indent(); source.append(propertyName); source.append(" : "); return self(); } public String create() { return source.toString(); } protected void indent() { if (!noIndent) { for (int i = 0; i < indentation * 4; i++) { source.append(" "); } } } }