/* * Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de) * * Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://creativecommons.org/licenses/by-nc-sa/3.0/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.knurt.fam.template.util; import java.net.URLEncoder; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.validator.UrlValidator; import org.jdom.Element; import de.knurt.fam.connector.FamConnector; import de.knurt.fam.template.model.TemplateContentPropertiesDefault; import de.knurt.fam.template.model.TemplatePage; import de.knurt.heinzelmann.ui.html.HtmlElement; import de.knurt.heinzelmann.ui.html.HtmlFactory; import de.knurt.heinzelmann.ui.html.Text2Html; import de.knurt.heinzelmann.util.query.QueryString; /** * produce html from content properties. * * @author Daniel Oltmanns * @since 1.3.0 (10/03/2010) */ public class TemplateHtml { /** one and only instance of TemplateHtml */ private volatile static TemplateHtml me; private UrlValidator urlValidator; /** construct TemplateHtml */ private TemplateHtml() { String[] schemes = { "http", "https" }; urlValidator = new UrlValidator(schemes, UrlValidator.ALLOW_ALL_SCHEMES); } /** * return the one and only instance of TemplateHtml * * @return the one and only instance of TemplateHtml */ public static TemplateHtml getInstance() { if (me == null) { // ↖ no instance so far synchronized (TemplateHtml.class) { if (me == null) { // ↖ still no instance so far // ↓ the one and only me me = new TemplateHtml(); } } } return me; } /** * short for {@link #getInstance()} * * @return the one and only instance of TemplateHtml */ public static TemplateHtml me() { return getInstance(); } /** * shortcut in velocity. write * * <pre> * $util.html.a('imprint', $lang.xml, $config.xml) * </pre> * * instead of * * <pre> * <a href="$config.base_url_public$lang.xml.getChild('pages').getChild('imprint').getChildText('href')" title="$lang.xml.getChild('pages').getChild('imprint').getChildText('title')">$lang.xml.getChild('pages').getChild('imprint').getChildText('headline')</a> * </pre> * * @param hrefBase * @param resourceName * @return */ public HtmlElement a(String resourceName, Element langXmlRoot, Element configXmlRoot) { Element page = TemplateContentPropertiesDefault.me().getCustomLanguagePage(resourceName); if (page == null) { return this.getNotFound(resourceName); } else { return this.a(resourceName, page.getChildText("headline"), langXmlRoot, configXmlRoot); } } public String formatUserInput(String string) { String result = Text2Html.me().linkUrls(urlValidator, string, "_parent"); result = Text2Html.me().nl2br(result); return result; } private HtmlElement getNotFound(String resourceName) { return HtmlFactory.get("span", String.format("page <code>%s</code> is not configured (correctly)", resourceName)).cla("warning"); } public HtmlElement a(String resourceName) { Element page = TemplateContentPropertiesDefault.me().getCustomLanguagePage(resourceName); String href = this.getHref(resourceName); if (href != null) { return this.a(href, page.getChildText("headline"), page.getChildText("title")); } else { return this.getNotFound(resourceName); } } public HtmlElement aWithAQuery(String resourceName, String query) { Element page = TemplateContentPropertiesDefault.me().getCustomLanguagePage(resourceName); String href = this.getHref(resourceName); if (href != null) { return this.a(href + query, page.getChildText("headline"), page.getChildText("title")); } else { return this.getNotFound(resourceName); } } public String hrefWithAQuery(String resourceName, String query) { return href(resourceName) + query; } public String getEntities(String raw) { return StringEscapeUtils.escapeHtml(raw); } public HtmlElement a(String resourceName, String content, Element langXmlRoot, Element configXmlRoot) { Element page = TemplateContentPropertiesDefault.me().getCustomLanguagePage(resourceName); String href = this.getHref(resourceName, page, configXmlRoot); if (href != null) { return this.a(href, content, page.getChildText("title")); } else { return this.getNotFound(resourceName); } } private HtmlElement a(String href, String content, String title) { return HtmlFactory.get_a(href, content).title(title); } public String getHref(String resourceName, Element langPage, Element configXmlRoot) { assert langPage.getName().equals("page"); String result = null; String hrefBase = this.getHrefBase(resourceName, configXmlRoot); if (!hrefBase.isEmpty()) { result = hrefBase; if (langPage.getChild("href") == null) { String tmphref = langPage.getChildText("title").toLowerCase().replaceAll(" ", "-").replaceAll(",", "").replaceAll("\\?", "").replaceAll("!", ""); try { result += String.format("%s-%s.html", URLEncoder.encode(tmphref, "UTF-8"), resourceName); } catch (Exception e) { result += tmphref; } } else { result += langPage.getChildText("href"); } } return result; } private String getHrefBase(String resourceName, Element configXmlRoot) { String result = ""; Element page = TemplateContentPropertiesDefault.me().getCustomConfigPage(resourceName); if (page != null) { if (page.getAttributeValue("visibility").equals("public")) { result = FamConnector.baseUrlPublic(); } else if (page.getAttributeValue("visibility").equals("protected")) { result = FamConnector.baseUrlProtected(); } else if (page.getAttributeValue("visibility").equals("admin")) { result = FamConnector.baseUrlAdmin(); } } return result; } public String getHref(String resourceName) { return this.getHref(resourceName, TemplateContentPropertiesDefault.me().getCustomLanguagePage(resourceName), TemplateContentPropertiesDefault.me().getCustomConfig()); } public String getHref(TemplatePage templatePage) { return this.getHref(templatePage.getResourceName()); } public static String href(String resourceName) { return me().getHref(resourceName); } /** * return a url like {@link #getHref(String)} but as relative path. this is * only needed in very specific cases where a reverse proxy is working on a * different port then the application and does not map it right. */ public String getRelativeHref(String resourceName) { String result = this.getHref(resourceName); return result.replaceFirst("http(s){0,1}:\\/\\/[^\\/]+\\/", "/"); } public String getHref(String string, QueryString qs) { return this.getHref(string) + qs.getAsHtmlLinkHref(false); } }