Package nsf.playground.playground

Source Code of nsf.playground.playground.PreviewJavaHandler$Renderer

package nsf.playground.playground;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lotus.domino.Document;
import lotus.domino.NotesException;
import nsf.playground.beans.DataAccessBean;
import nsf.playground.beans.JavaSnippetBean;
import nsf.playground.environments.PlaygroundEnvironment;
import nsf.playground.extension.JavaPreviewExtension;
import nsf.playground.extension.PlaygroundExtensionFactory;
import nsf.playground.jsp.JspCompiler;
import nsf.playground.jsp.JspFragment;
import nsf.playground.jsp.JspSampleWriter;

import com.ibm.commons.runtime.Context;
import com.ibm.commons.runtime.util.ParameterProcessor;
import com.ibm.commons.runtime.util.UrlUtil;
import com.ibm.commons.util.IExceptionEx;
import com.ibm.commons.util.PathUtil;
import com.ibm.commons.util.StringUtil;
import com.ibm.commons.util.io.json.JsonJavaFactory;
import com.ibm.commons.util.io.json.JsonJavaObject;
import com.ibm.commons.util.io.json.JsonObject;
import com.ibm.commons.util.io.json.JsonParser;
import com.ibm.sbt.jslibrary.SBTEnvironment;
import com.ibm.xsp.model.domino.DominoUtils;
import com.ibm.xsp.sbtsdk.servlets.JavaScriptLibraries;
import com.ibm.xsp.util.HtmlUtil;
import com.ibm.xsp.util.ManagedBeanUtil;


public class PreviewJavaHandler extends PreviewHandler {

  private static final String LAST_REQUEST = "javasnippet.lastrequest";

  public static class RequestParams implements Serializable {
    private static final long serialVersionUID = 1L;
    String sOptions;
    String id;
        public RequestParams(String sOptions, String id) {
          this.sOptions = sOptions;
          this.id = id;
        }
  }

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String pathInfo = req.getPathInfo();
    if(pathInfo.equals("/javasnippet")) {
      String sOptions = req.getParameter("fm_options");
      String id = req.getParameter("fm_id");
      RequestParams requestParams = new RequestParams(sOptions,id);
      req.getSession().setAttribute(LAST_REQUEST, requestParams);
      String url = UrlUtil.getRequestUrl(req);
      url = StringUtil.replace(url, "/javasnippet", "/jsppage");
      resp.sendRedirect(url);
    } else {
      doGet(req, resp);
    }
  }

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    RequestParams requestParams = (RequestParams)req.getSession().getAttribute(LAST_REQUEST);
    if(requestParams!=null) {
          findRenderer(req, resp, requestParams).execRequest();
    } else {
      PrintWriter pw = resp.getWriter();
      pw.println("Social Business Toolkit Playground - JavaScript Snippet Preview Servlet");
      pw.flush();
    }
  }

  public Renderer findRenderer(HttpServletRequest req, HttpServletResponse resp, RequestParams requestParams) throws IOException {
    List<JavaPreviewExtension> pgExtensions = (List<JavaPreviewExtension>)PlaygroundExtensionFactory.getExtensions(JavaPreviewExtension.class);
   
    // Find the first renderer that handles it, from the registered extensions
    Renderer r = null;
    for(int i=0; i<pgExtensions.size(); i++) {
      r = pgExtensions.get(i).findRenderer(req, resp, requestParams, false);
      if(r!=null) {
        break;
      }
    }
    if(r==null) {
      for(int i=0; i<pgExtensions.size(); i++) {
        r = pgExtensions.get(i).findRenderer(req, resp, requestParams, true);
        if(r!=null) {
          break;
        }
      }
    }
    if(r==null) {
      r = new Renderer(req, resp, requestParams);
    }
    r.init();
    return r;
  }
 
 
  public static class Renderer extends BaseRenderer {
   
    protected HttpServletRequest req;
    protected HttpServletResponse resp;
    protected RequestParams requestParams;
   
    protected Renderer(HttpServletRequest req, HttpServletResponse resp, RequestParams requestParams) {
      this.req = req;
      this.resp = resp;
      this.requestParams = requestParams;
    }
   
    protected void init() throws IOException {
    }
   
    protected void execRequest() throws ServletException, IOException {
      resp.setContentType("text/html");
      resp.setStatus(HttpServletResponse.SC_OK);
 
      String sOptions = requestParams.sOptions;
      JsonJavaObject options = new JsonJavaObject();
      try {
        options = (JsonJavaObject)JsonParser.fromJson(JsonJavaFactory.instanceEx, sOptions);
      } catch(Exception ex) {}
      boolean debug = options.getBoolean("debug");
 
      String unid = requestParams.id;
 
      DataAccessBean dataAccess = DataAccessBean.get();
     
      String envName = options.getString("env");
      PlaygroundEnvironment env = dataAccess.getEnvironment(envName);
      env.prepareEndpoints();
 
      // Push the dynamic parameters to the user session
      JsonObject p = (JsonObject)options.get("params");
      if(p!=null) {
        for(Iterator<String> it= p.getJsonProperties(); it.hasNext(); ) {
          String name = it.next();
          String value = (String)p.getJsonProperty(name);
          env.pushSessionParams(name, value);
        }
      }
     
      String serverUrl = composeServerUrl(req);
      String dbUrl = composeDatabaseUrl(req,serverUrl);
 
      JavaScriptLibraries.JSLibrary jsLib = JavaScriptLibraries.LIBRARIES[0]; // Default
      String jsLibraryPath = getDefautLibraryPath(serverUrl);
     
      SBTEnvironment.push(Context.get(), env);
 
      EnvParameterProvider prov = new EnvParameterProvider(env);
 
      // Load the jsp document
      String jsp = null;
      try {
        Document doc = DominoUtils.getDocumentById(DominoUtils.getCurrentDatabase(), unid);
        jsp = doc.getItemValueString("Jsp");
        jsp = ParameterProcessor.process(jsp, prov);
      } catch(NotesException ex) {
        throw new ServletException(ex);
      }
     
      PrintWriter pw = resp.getWriter();
     
      pw.println("<!DOCTYPE html>");
      pw.println("<html lang=\"en\">");
     
      pw.println("<head>");
      pw.println("  <title>Social Business Playground - Java Snippet</title>");
     
      pw.println("  <style type=\"text/css\">");
      pw.println("    @import \""+jsLibraryPath+"dijit/themes/claro/claro.css\";");
      pw.println("    @import \""+jsLibraryPath+"dojo/resources/dojo.css\";");
      pw.println("  </style>");
      String bodyTheme = "claro";
 
      jsLibraryPath = PathUtil.concat(jsLibraryPath,"/dojo/dojo.js",'/');
      pw.println("  <script type=\"text/javascript\">");
      pw.println("    dojoConfig = {");
      pw.println("        parseOnLoad: true");
      pw.println("    };");
      pw.println("  </script>");
      pw.println("  <script type=\"text/javascript\" src=\""+jsLibraryPath+"\"></script>");
 
      String libType = jsLib.getLibType().toString();
      String libVersion = jsLib.getLibVersion();
      pw.print("  <script type=\"text/javascript\" src=\""+composeToolkitUrl(dbUrl)+"?lib="+libType+"&ver="+libVersion);
      pw.print("&env=");
      pw.print(envName);
      pw.println("\"></script>");
     
      pw.println("  <script>");
      pw.println("    require(['dojo/parser']);"); // avoid dojo warning
      pw.println("  </script>");
     
      pw.println("</head>");
 
      pw.print("<body");
      if(StringUtil.isNotEmpty(bodyTheme)) {
        pw.print(" class=\"");
        pw.print(bodyTheme);
        pw.print("\"");
      }
      pw.println(">");
 
      //Debugging...
      if(false) {
        pw.println("<pre>");
        pw.println(jsp);
        pw.println("</pre>");
      }
     
      String jspClassName = "xspjsp.jsp_"+unid;
      //String jspClassName = "jsp_"+unid;
     
      String sourceCode = null;
      try {
        JavaSnippetBean bean = (JavaSnippetBean)ManagedBeanUtil.getBean(FacesContext.getCurrentInstance(), "javaSnippetBean");
        Class<JspFragment> jspClass = bean.getCompiledClass(jspClassName);
        if(jspClass==null) {
          JspCompiler compiler = new JspCompiler();
          sourceCode = compiler.compileJsp(jsp, jspClassName);
          if(false) {
            pw.println("<pre>");
            pw.println(HtmlUtil.toHTMLContentString(sourceCode, false));
            pw.println("</pre>");
          }
          jspClass = bean.compileSnippet(jspClassName, sourceCode);
        }
        if(jspClass!=null) {
          JspFragment f = jspClass.newInstance();
          f.exec(new JspSampleWriter(pw),req,resp);
        }
      } catch(Throwable e) {
        pw.println("Execution error");
        pw.println("<pre>");
       
        StringWriter sw = new StringWriter();
        PrintWriter psw = new PrintWriter(sw);
        if(e instanceof IExceptionEx) {
          ((IExceptionEx)e).printExtraInformation(psw);
          psw.println("");
        }
        if(sourceCode==null) {
          JspCompiler compiler = new JspCompiler();
          sourceCode = compiler.compileJsp(jsp, jspClassName);
        }
        if(sourceCode!=null) {
          printSourceCode(psw,sourceCode,true,-1);
          //psw.println(HtmlUtil.toHTMLContentString(sourceCode, false));
        }
        e.printStackTrace(psw);
        psw.flush();
        pw.println(HtmlUtil.toHTMLContentString(sw.toString(), false));
        pw.println("</pre>");
      }
     
      pw.println("</body>");
      pw.println("</html>");
     
      pw.flush();
      pw.close();
    }
   
      public void printSourceCode(PrintWriter out, String code, boolean alltext, int errline) {
          if(code==null) {
            return;
          }
          code = code.trim();
          if (StringUtil.isNotEmpty(code)) {
              int codeLength = code.length();
              int pos = 0;
              for (int line = 1; pos < codeLength; line++) {
                  int start = pos;
                  while (pos < codeLength && code.charAt(pos) != '\n'
                          && code.charAt(pos) != '\r') {
                      pos++;
                  }
                  boolean show = alltext || Math.abs(line-errline)<3; // 5 lines being displayed
                  boolean iserr = errline == line;
                  if(show) {
                    if (iserr) {
                        out.print("->"); //$NON-NLS-1$
                    } else {
                      out.print("  "); //$NON-NLS-1$
                    }
                  String sLine = StringUtil.toString(line);
                    for (int i = 0; i < 4 - sLine.length(); i++) {
                        out.print(" "); //$NON-NLS-1$
                    }
                    out.print(sLine);
                    out.print(": "); //$NON-NLS-1$
                    out.print(code.substring(start, pos));
                  }
                  if (pos < codeLength) {
                      if (code.charAt(pos) == '\n') {
                          pos++;
                          if (pos < codeLength && code.charAt(pos) == '\r') {
                              pos++;
                          }
                      }
                      else if (code.charAt(pos) == '\r') {
                          pos++;
                          if (pos < codeLength && code.charAt(pos) == '\n') {
                              pos++;
                          }
                      }
                  }
                  if(show) {
                    out.println(""); //$NON-NLS-1$
                  }
              }
          }
      }
  }
}
TOP

Related Classes of nsf.playground.playground.PreviewJavaHandler$Renderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.