package org.rendersnake.site.components;
import static org.rendersnake.HtmlAttributesFactory.align;
import static org.rendersnake.HtmlAttributesFactory.id;
import static org.rendersnake.HtmlAttributesFactory.type;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.rendersnake.HtmlCanvas;
import org.rendersnake.Renderable;
import org.rendersnake.servlet.FormHandler;
import org.rendersnake.servlet.FormResponseAction;
import org.rendersnake.servlet.ServletUtils;
import org.rendersnake.site.HtmlToRenderSnakeTranslator;
public class TranslatorForm implements Renderable, FormHandler {
public FormResponseAction handle(HttpServletRequest request, HttpServletResponse response) {
boolean useTidy = "on".equals(request.getParameter("tidy"));
String handle = request.getParameter("handle");
if ("translate".equals(handle)) {
ByteArrayInputStream input = new ByteArrayInputStream(request.getParameter("html").getBytes());
HtmlToRenderSnakeTranslator translator = new HtmlToRenderSnakeTranslator();
try {
translator.translate(input,useTidy);
} catch (Exception ex) {
translator.errorMessage = ex.getMessage();
}
request.getSession().setAttribute("java", translator.isSuccess() ? translator.toJavaSource() : translator.errorMessage);
request.getSession().setAttribute("html", request.getParameter("html"));
}
if ("back".equals(handle)) {
request.getSession().setAttribute("java", null);
}
if (useTidy) {
request.getSession().setAttribute("tidy", "on");
} else {
request.getSession().setAttribute("tidy", null);
}
return new FormResponseAction().redirectingTo("translator.html");
}
public void renderOn(HtmlCanvas html) throws IOException {
html.h2().write("From HTML to Java")._h2();
html.p().write("Developers who wish to create Renderable components from existing HTML pages or fragments,"
+ " can use the translator below to generate the corresponding Java source.")._p();
html.p().write("Copy and paste your XHTML into the top textarea and hit the translate button."
+ " Make sure the XHTML is well-formed ; an error will be displayed otherwise.")._p();
html.table().tr().td();
this.renderFormOn(html);
html._td()._tr()._table();
this.renderStatisticsOn(html);
}
public void renderFormOn(HtmlCanvas html) throws IOException {// @formatter:off
// either is empty, showing java or showing html
String tidy = (String)ServletUtils.sessionFor(html).getAttribute("tidy");
String checked = "on".equals(tidy) ? "checked" : null;
String java = (String)ServletUtils.sessionFor(html).getAttribute("java");
String xhtml = (String)ServletUtils.sessionFor(html).getAttribute("html");
boolean hasJava = !StringUtils.isEmpty(java);
boolean hasHtml = !StringUtils.isEmpty(xhtml);
if (!hasJava && !hasHtml) {
hasHtml = true;
xhtml = "<table id=\"sample\" class=\"title\">\n" +
" <tr>\n" +
" <td>renderSnake.org</td>\n" +
" </tr>\n" +
"</table>";
}
html.form(
id("translator")
.action("org.rendersnake.site.components.TranslatorForm")
.method("post"))
.input(type("submit").value(!hasJava ? "Translate XHTML to Java" : "Back to XHTML"))
.div(align("right")).content("rev.604")
.input(type("checkbox").name("tidy").checked(checked))
.write("use tidy").br()
.input(type("hidden").name("handle").value(!hasJava ? "translate" : "back"))
.textarea(
type("text")
.name("html")
.add("rows", "60", false)
.add("cols", "60", false))
.write(hasJava ? java : xhtml)
._textarea()._form();
}
private void renderStatisticsOn(HtmlCanvas html) throws IOException {
html
.h4().write("Statistics")._h4()
.ul()
.li().write(""+HtmlToRenderSnakeTranslator.TRANSLATIONS_OK+" succesful")._li()
.li().write(""+HtmlToRenderSnakeTranslator.TRANSLATIONS_LINECOUNT+" source lines generated")._li()
.li().write(""+HtmlToRenderSnakeTranslator.TRANSLATIONS_FAILED+" failed")._li()
._ul();
}
}