package org.nocket.gen.domain.visitor.html.create; import gengui.domain.AbstractDomainReference; import gengui.util.SevereGUIException; import java.io.File; import java.io.IOException; import java.util.ArrayDeque; import java.util.Deque; import org.apache.commons.io.FileUtils; import org.apache.ecs.Element; import org.apache.ecs.MultiPartElement; import org.apache.ecs.html.Body; import org.apache.ecs.html.Comment; import org.apache.ecs.html.Div; import org.apache.ecs.html.FieldSet; import org.apache.ecs.html.Form; import org.apache.ecs.html.Head; import org.apache.ecs.html.Html; import org.apache.ecs.html.Link; import org.apache.ecs.xml.XML; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.nocket.gen.domain.DMDWebGenContext; import org.nocket.gen.domain.element.ButtonElement; import org.nocket.gen.domain.element.CheckboxPropertyElement; import org.nocket.gen.domain.element.ChoicerPropertyElement; import org.nocket.gen.domain.element.HeadlineElement; import org.nocket.gen.domain.element.HiddenPropertyElement; import org.nocket.gen.domain.element.MultivaluePropertyElement; import org.nocket.gen.domain.element.ResourceElement; import org.nocket.gen.domain.element.SimplePropertyElement; import org.nocket.gen.domain.visitor.html.AbstractHtmlVisitor; import org.nocket.gen.domain.visitor.html.styling.common.AbstractStylingStrategyImpl; import org.nocket.gen.domain.visitor.html.styling.common.StylingStrategyI; import org.nocket.gen.page.element.ModalElement; public class CreateHtmlVisitor<E extends AbstractDomainReference> extends AbstractHtmlVisitor<E> { protected final Html html; protected final Deque<MultiPartElement> panelStack = new ArrayDeque<MultiPartElement>(); protected final StylingStrategyI componentBuilder; public CreateHtmlVisitor(DMDWebGenContext<E> context, StylingStrategyI componentBuilder) { super(context); this.componentBuilder = componentBuilder; this.html = newHtml(); } protected Html newHtml() { Html html = new Html(); html.addAttribute("xmlns:wicket", "http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"); Body body = new Body(); addHeader(html); html.addElement(body); final XML wicketContainer; if (isPanel()) { wicketContainer = new XML("wicket:panel"); } else { wicketContainer = new XML("wicket:extend"); } body.addElement(wicketContainer); wicketContainer.addElement(new Comment(new Div().addAttribute(AbstractStylingStrategyImpl.ATTR_WICKET_ID, "feedback"))); wicketContainer.addElement(new Div().addAttribute(AbstractStylingStrategyImpl.ATTR_WICKET_ID, ModalElement.DEFAULT_WICKET_ID)); Form form = new Form(); form.addAttribute(AbstractStylingStrategyImpl.ATTR_CLASS, "form-horizontal"); form.removeAttribute("accept-charset"); form.removeAttribute("enctype"); wicketContainer.addElement(form); form.addAttribute(AbstractStylingStrategyImpl.ATTR_WICKET_ID, "form"); panelStack.add(form); return html; } protected void addHeader(Html html) { //<head> // <link rel="stylesheet" href="../../../../../resources/webapp/css/bootstrap.css" type="text/css" /> // </head> String[] headerlinks = getContext().getHeaderlinks(); if (headerlinks != null && headerlinks.length > 0) { String relativePath = constructRelativeLinkPath(); Head head = new Head(); for (String headerlink : headerlinks) { Link link = new Link(); link.setRel("stylesheet"); link.setType("text/css"); link.setHref(relativePath + headerlink.trim()); head.addElement(link); } html.addElement(head); } } protected String constructRelativeLinkPath() { int packageDepth = getDomainClass().getName().split("\\.").length - 1; int genPathDepth = getContext().getGenDir().getPath().split("/").length; String relativePath = ""; for (int i = 0; i < packageDepth + genPathDepth; i++) relativePath += "../"; return relativePath; } protected void maybeAdd(Element element) { if (element != null) { panelStack.getLast().addElementToRegistry(element); } } @Override public void visitSimpleProperty(SimplePropertyElement<E> e) { Element input = componentBuilder.createSimpleProperty(e); maybeAdd(input); } @Override public void visitChoicerProperty(ChoicerPropertyElement<E> e) { Element select = componentBuilder.createChoicerProperty(e); maybeAdd(select); } @Override public void visitCheckboxProperty(CheckboxPropertyElement<E> e) { Element checkbox = componentBuilder.createCheckboxProperty(e); maybeAdd(checkbox); } @Override public void visitButton(ButtonElement<E> e) { Element button = componentBuilder.createButton(e); maybeAdd(button); } @Override public void visitResource(ResourceElement<E> e) { Element resource = componentBuilder.createResource(e); maybeAdd(resource); } @Override public void visitFieldsetOpen(HeadlineElement<E> e) { FieldSet fieldset = componentBuilder.createFieldset(e); maybeAdd(fieldset); panelStack.add(fieldset); } @Override public void visitMultivalueProperty(MultivaluePropertyElement<E> e) { Element table = componentBuilder.createMultivalueProperty(e); maybeAdd(table); } @Override public void visitFieldsetClose() { if (panelStack.removeLast() == null) { throw new IllegalStateException("PanelStack improperly implemented, did not expect a panel to be null!"); } } @Override public void visitHiddenProperty(HiddenPropertyElement<E> e) { // ignore } @Override public void finish() { String gen = "<!DOCTYPE HTML>" + html.toString(); Document doc = Jsoup.parse(gen); checkAndAddGroupTabbedPanel(doc); gen = toHtml(doc); File file = getHtmlFile(); try { FileUtils.forceMkdir(file.getParentFile()); FileUtils.writeStringToFile(file, gen); writeStatics(file.getName(), true, false, null); } catch (IOException e) { writeStatics(file.getName(), false, false, e.getMessage()); throw new SevereGUIException(e); } } }