package org.concordion.internal.listener; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import org.concordion.api.Element; import org.concordion.api.Resource; import org.concordion.api.Target; import org.concordion.internal.command.SpecificationProcessingEvent; import org.concordion.internal.command.SpecificationProcessingListener; import org.concordion.internal.util.IOUtil; public class PageFooterRenderer implements SpecificationProcessingListener { private static final String CONCORDION_WEBSITE_URL = "http://www.concordion.org"; private static final String SOURCE_LOGO_RESOURCE_PATH = "/org/concordion/internal/resource/logo.png"; private static final Resource TARGET_LOGO_RESOURCE = new Resource("/image/concordion-logo.png"); private final Target target; private long startMillis; private static Logger logger = Logger.getLogger(PageFooterRenderer.class.getName()); public PageFooterRenderer(Target target) { this.target = target; } public void beforeProcessingSpecification(SpecificationProcessingEvent event) { startMillis = System.currentTimeMillis(); } public void afterProcessingSpecification(SpecificationProcessingEvent event) { try { copyLogoToTarget(); long millisTaken = System.currentTimeMillis() - startMillis; addFooterToDocument(event.getRootElement(), event.getResource(), millisTaken); } catch (Throwable t) { t.printStackTrace(); logger.warning("Failed to write page footer. " + t.getMessage()); } } private void addFooterToDocument(Element rootElement, Resource resource, long millisTaken) { Element body = rootElement.getFirstChildElement("body"); if (body != null) { Element footer = new Element("div"); footer.addStyleClass("footer"); footer.appendText("Results generated by "); Element link = new Element("a"); link.addAttribute("href", CONCORDION_WEBSITE_URL); footer.appendChild(link); Element img = new Element("img"); img.addAttribute("src", resource.getRelativePath(TARGET_LOGO_RESOURCE)); img.addAttribute("alt", "Concordion"); img.addAttribute("border", "0"); link.appendChild(img); Element dateDiv = new Element("div"); dateDiv.addStyleClass("testTime"); dateDiv.appendText("in " + (millisTaken + 1) + " ms "); dateDiv.appendText(new SimpleDateFormat("'on' dd-MMM-yyyy 'at' HH:mm:ss z").format(new Date())); footer.appendChild(dateDiv); body.appendChild(footer); } } private void copyLogoToTarget() { IOUtil.getResourceAsStream(SOURCE_LOGO_RESOURCE_PATH); InputStream inputStream = getClass().getResourceAsStream(SOURCE_LOGO_RESOURCE_PATH); try { target.copyTo(TARGET_LOGO_RESOURCE, inputStream); } catch (IOException e) { logger.log(Level.WARNING, "Failed to copy Concordion logo to target", e); } } }