/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/portal/trunk/portal-xsl/tool/src/java/org/sakaiproject/portal/xsltcharon/impl/XsltRenderContext.java $
* $Id: XsltRenderContext.java 112035 2012-08-31 16:51:48Z earle.nietzel@gmail.com $
***********************************************************************************
*
* Copyright (c) 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.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 org.sakaiproject.portal.xsltcharon.impl;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.portal.api.PortalRenderContext;
import org.sakaiproject.portal.api.PortalRenderEngine;
import org.sakaiproject.portal.render.api.RenderResult;
import org.sakaiproject.portal.render.api.ToolRenderException;
import org.sakaiproject.util.Xml;
import org.sakaiproject.util.Web;
import org.sakaiproject.util.ResourceLoader;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserDirectoryService;
import org.sakaiproject.site.api.SitePage;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.tidy.Tidy;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.http.HttpServletRequest;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.dom.DOMSource;
import java.io.StringWriter;
import java.io.StringReader;
import java.util.*;
import java.util.Map.Entry;
/**
* Created by IntelliJ IDEA.
* User: johnellis
* Date: Jul 13, 2007
* Time: 12:07:00 PM
* To change this template use File | Settings | File Templates.
*/
public class XsltRenderContext implements PortalRenderContext {
private static final Log log = LogFactory.getLog(XsltRenderEngine.class);
private static final String ALT_TEMPLATE = "xsltUseTemplate";
/** messages. */
private static ResourceLoader rb = new ResourceLoader("org/sakaiproject/portal/xsltcharon/messages");
private PortalRenderEngine renderEngine;
private PortalRenderContext baseContext;
private Map context = new HashMap();
private UserDirectoryService userDirectoryService;
private HttpServletRequest request;
public XsltRenderContext(PortalRenderEngine renderEngine, PortalRenderContext baseContext, HttpServletRequest request) {
this.renderEngine = renderEngine;
this.baseContext = baseContext;
this.request = request;
this.userDirectoryService = org.sakaiproject.user.cover.UserDirectoryService.getInstance();
}
public void put(String string, Object value) {
context.put(string, value);
baseContext.put(string, value);
}
public Object get(String key) {
return context.get(key);
}
public String dump() {
return baseContext.dump();
}
public boolean uses(String includeOption) {
return baseContext.uses(includeOption);
}
/**
* Get the render engine associated with this context.
*
* @return the render engine
*/
public PortalRenderEngine getRenderEngine() {
return renderEngine;
}
public PortalRenderContext getBaseContext() {
return baseContext;
}
public void setBaseContext(PortalRenderContext baseContext) {
this.baseContext = baseContext;
}
public Document produceDocument() {
Document doc = Xml.createDocument();
Element root = doc.createElement("portal");
doc.appendChild(root);
User currentUser = userDirectoryService.getCurrentUser();
boolean loggedIn = false;
if (currentUser != null && currentUser.getId().length() > 0) {
root.appendChild(createUserXml(doc, currentUser));
loggedIn = true;
}
Map sitePages = (Map) context.get("sitePages");
root.appendChild(createLoginXml(doc, request));
appendTextElementNodeFromProp(doc, "pageTitle", "pageTitle", root);
root.appendChild(createSkin(doc));
root.appendChild(createConfixXml(doc, loggedIn, sitePages));
//subsites:
if(context.get("subSites") != null){
if(sitePages.get("subsiteClass") != null){
Element subSiteClass = doc.createElement("subSiteClass");
subSiteClass.setAttribute("subSiteClass", sitePages.get("subsiteClass").toString());
root.appendChild(subSiteClass);
}
try{
List<HashMap> subsites = (List<HashMap>) context.get("subSites");
for (HashMap hashMap : subsites) {
Element subSiteElement = doc.createElement("subSite");
String siteTitle = hashMap.get("siteTitle").toString();
String siteUrl = hashMap.get("siteUrl").toString();
subSiteElement.setAttribute("siteTitle", siteTitle);
subSiteElement.setAttribute("siteUrl", siteUrl);
root.appendChild(subSiteElement);
}
}catch (Exception e) {
//prob class cast exception
log.warn(e);
}
}
if (loggedIn) {
root.appendChild(createSites(doc));
}
try {
root.appendChild(createPageCategories(doc, (List) sitePages.get("pageNavTools")));
} catch (ToolRenderException e) {
log.error("", e);
}
root.appendChild(createExternalizedXml(doc));
return doc;
}
protected Element createExternalizedXml(Document doc) {
Element externalized = doc.createElement("externalized");
for (Iterator i=rb.entrySet().iterator();i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
externalized.appendChild(createExternalizedEntryXml(doc, entry.getKey(), entry.getValue()));
}
ResourceLoader rbsitenav = (ResourceLoader) context.get("rloader");
for (Iterator i=rbsitenav.entrySet().iterator();i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
externalized.appendChild(createExternalizedEntryXml(doc, entry.getKey(), entry.getValue()));
}
return externalized;
}
protected Element createExternalizedEntryXml(Document doc, Object key, Object value) {
Element entry = doc.createElement("entry");
entry.setAttribute("key", (String) key);
appendTextElementNode(doc, "value", (String) value, entry);
return entry;
}
protected Element createSites(Document doc) {
Element sites = doc.createElement("sites");
Map tabSites = (Map) context.get("tabsSites");
Element tabsSites = createSitesList(doc, tabSites, "tabsSites", "tabsSites");
appendTextElementNode(doc, "tutorial", tabSites.get("tutorial").toString(), tabsSites);
appendTextElementNode(doc, "tabsMoreSitesShow", tabSites.get("tabsMoreSitesShow").toString(), tabsSites);
sites.appendChild(tabsSites);
sites.appendChild(createSitesList(doc, tabSites, "tabsMoreSites", "tabsMoreSites"));
if (tabSites.get("tabsMoreSortedTermList") != null) {
sites.appendChild(createTermSites(doc, tabSites));
}
return sites;
}
protected Element createTermSites(Document doc, Map tabSites) {
Element siteTypes = doc.createElement("siteTypes");
List<String> terms = (List<String>) tabSites.get("tabsMoreSortedTermList");
Map termsMap = (Map) tabSites.get("tabsMoreTerms");
int index = 0;
for (String title : terms) {
Element siteType = doc.createElement("siteType");
siteType.setAttribute("order", "" + index);
appendTextElementNode(doc, "title", title, siteType);
siteType.appendChild(createSitesList(doc, termsMap, title, "sites"));
siteTypes.appendChild(siteType);
index++;
}
return siteTypes;
}
protected Element createSitesList(Document doc, Map currentContext, String prop, String elementName) {
Element list = doc.createElement(elementName);
List<Map> sites = (List<Map>) currentContext.get(prop);
if (sites == null) {
return list;
}
int index = 0;
for (Map site : sites) {
list.appendChild(createSite(doc, site, index));
index++;
}
return list;
}
protected Element createSite(Document doc, Map siteMap, int index) {
Element site = doc.createElement("site");
appendTextElementNode(doc, "url", (String) siteMap.get("siteUrl"), site);
appendTextElementNode(doc, "title", (String) siteMap.get("siteTitle"), site);
appendTextElementNode(doc, "description", (String) siteMap.get("siteDescription"), site);
appendTextElementNode(doc, "shortDescription", (String) siteMap.get("shortDescription"), site);
appendTextElementNode(doc, "parent", (String) siteMap.get("parentSite"), site);
appendTextElementNode(doc, "type", (String) siteMap.get("siteType"), site);
appendTextElementNode(doc, "siteId", (String) siteMap.get("siteId"), site);
site.setAttribute("selected", siteMap.get("isCurrentSite").toString());
if (((Boolean)siteMap.get("isCurrentSite")).booleanValue()){
if (context.get("viewAsStudentLink") != null &&
((Boolean)context.get("viewAsStudentLink")).booleanValue() ) {
Element viewAsStudentLink = doc.createElement("viewAsStudentLink");
site.appendChild(viewAsStudentLink);
if (context.get("roleSwitchState") != null) {
appendTextElementNode(doc, "roleSwitchState", context.get("roleSwitchState").toString(), viewAsStudentLink);
}
appendTextElementNode(doc, "roleUrlValue", (String) context.get("roleUrlValue"), viewAsStudentLink);
if (context.get("roleswapdropdown") != null) {
appendTextElementNode(doc, "roleswapdropdown", context.get("roleswapdropdown").toString(), viewAsStudentLink);
}
appendTextElementNode(doc, "switchRoleUrl", (String) context.get("switchRoleUrl"), viewAsStudentLink);
appendTextElementNode(doc, "panelString", (String) context.get("panelString"), viewAsStudentLink);
if (context.get("siteRoles") != null) {
List roles = (List)context.get("siteRoles");
appendTextElementNodes(doc, (String[])roles.toArray(new String[roles.size()]), viewAsStudentLink, "siteRoles", "role");
}
}
}
site.setAttribute("myWorkspace", siteMap.get("isMyWorkspace").toString());
site.setAttribute("depth", siteMap.get("depth").toString());
site.setAttribute("order", "" + index);
if ( siteMap.get("isChild") != null ){
site.setAttribute("isChild", "true");
site.setAttribute("child", siteMap.get("isChild").toString());
List pwd = (List) siteMap.get("pwd");
if(pwd != null){
for(Map pwdMap : (List<Map>) pwd){
Element pwdElement = doc.createElement("pwd");
for(Entry entry : (Set<Entry>) pwdMap.entrySet()){
pwdElement.setAttribute(entry.getKey().toString(), entry.getValue().toString());
}
site.appendChild(pwdElement);
}
}
}
else if ( siteMap.get("parentSite") != null )
site.setAttribute("child", Boolean.TRUE.toString());
else
site.setAttribute("child", Boolean.FALSE.toString());
Map<String, ?> sitePages = (Map<String, ?>) siteMap.get("sitePages");
if (sitePages != null) {
site.appendChild(createSitePages(doc, (List<Map<String, ?>>) sitePages.get("pageNavTools")));
}
return site;
}
protected Element createSitePages(Document doc, List<Map<String, ?>> navPages) {
Element pages = doc.createElement("pages");
if (navPages != null && navPages.size() > 0) {
pages.setAttribute("count", Integer.toString(navPages.size()));
for (Map<String, ?> navPage : navPages) {
Element page = doc.createElement("page");
page.setAttribute("hidden", navPage.get("hidden").toString());
page.setAttribute("current", navPage.get("current").toString());
page.setAttribute("isPage", navPage.get("isPage").toString());
appendTextElementNode(doc, "title", navPage.get("pageTitle").toString(), page);
appendTextElementNode(doc, "description", navPage.get("description").toString(), page);
appendTextElementNode(doc, "url", navPage.get("pageRefUrl").toString(), page);
appendTextElementNode(doc, "menuClass", navPage.get("menuClass").toString(), page);
appendTextElementNode(doc, "pageId", navPage.get("pageId").toString(), page);
pages.appendChild(page);
}
} else {
pages.setAttribute("count", "0");
}
return pages;
}
protected Element createPageCategories(Document doc, List pageTools) throws ToolRenderException {
Element categories = doc.createElement("categories");
int index = 0;
String lastCategory = null;
Element lastCategoryElement = null;
for (Iterator<Map> i = pageTools.iterator();i.hasNext();) {
Map page = i.next();
Map pageProps = (Map)page.get("pageProps");
String currentCategory = (String) pageProps.get("sitePage.pageCategory"); //todo put the static final here
if (currentCategory == null || !isDisplayToolCategories()) {
lastCategory = null;
lastCategoryElement = null;
categories.appendChild(createUncategorizedPage(doc, page, index));
index++;
}
else if (currentCategory.equals(lastCategory)) {
lastCategoryElement.appendChild(createPageXml(doc, page));
if ("true".equalsIgnoreCase(page.get("current").toString())) {
((Element)lastCategoryElement.getParentNode()).setAttribute("selected", "true");
}
}
else {
lastCategory = currentCategory;
lastCategoryElement = createCategory(doc, categories, page, currentCategory, index);
lastCategoryElement.appendChild(createPageXml(doc, page));
categories.appendChild(lastCategoryElement.getParentNode());
index++;
}
}
return categories;
}
protected Element createCategory(Document doc, Element categories, Map page, String name, int index) {
Element categoryElement = doc.createElement("category");
categoryElement.setAttribute("selected", page.get("current").toString());
categoryElement.setAttribute("order", Integer.toString(index));
Element categoryKeyElement = doc.createElement("key");
safeAppendTextNode(doc, categoryKeyElement, name, true);
Element categoryEscapedKeyElement = doc.createElement("escapedKey");
safeAppendTextNode(doc, categoryEscapedKeyElement, Web.escapeJavascript(name), false);
categoryElement.appendChild(categoryKeyElement);
categoryElement.appendChild(categoryEscapedKeyElement);
Element pagesElement = doc.createElement("pages");
categoryElement.appendChild(pagesElement);
return pagesElement;
}
protected Element createUncategorizedPage(Document doc, Map page, int index) throws ToolRenderException {
Element categoryElement = doc.createElement("category");
categoryElement.setAttribute("selected", page.get("current").toString());
categoryElement.setAttribute("order", Integer.toString(index));
Element categoryKeyElement = doc.createElement("key");
safeAppendTextNode(doc, categoryKeyElement,
"org.theospi.portfolio.portal.model.ToolCategory.uncategorized", false);
Element categoryEscapedKeyElement = doc.createElement("escapedKey");
safeAppendTextNode(doc, categoryEscapedKeyElement,
Web.escapeJavascript("org.theospi.portfolio.portal.model.ToolCategory.uncategorized"), false);
categoryElement.appendChild(categoryKeyElement);
categoryElement.appendChild(categoryEscapedKeyElement);
Element pagesElement = doc.createElement("pages");
pagesElement.appendChild(createPageXml(doc, page));
categoryElement.appendChild(pagesElement);
return categoryElement;
}
protected Element createPageXml(Document doc, Map page) throws ToolRenderException {
Element pageElement = doc.createElement("page");
pageElement.setAttribute("order", Integer.valueOf(0).toString());
Boolean selected = (Boolean) page.get("current");
pageElement.setAttribute("selected", selected.toString());
pageElement.setAttribute("popUp", page.get("ispopup").toString());
pageElement.setAttribute("hidden", page.get("hidden").toString());
Element pageName = doc.createElement("title");
safeAppendTextNode(doc, pageName, page.get("pageTitle").toString(), true);
Element pageUrl = doc.createElement("url");
safeAppendTextNode(doc, pageUrl, page.get("pageRefUrl").toString(), true);
Element popPageUrl = doc.createElement("popUrl");
safeAppendTextNode(doc, popPageUrl, page.get("pagePopupUrl").toString() + page.get("pageId").toString(), true);
Element menuClass = doc.createElement("menuClass");
safeAppendTextNode(doc, menuClass, page.get("menuClass").toString(), true);
pageElement.appendChild(pageName);
pageElement.appendChild(pageUrl);
pageElement.appendChild(popPageUrl);
pageElement.appendChild(menuClass);
if (selected) {
pageElement.setAttribute("layout",
(context.get("pageColumnLayout").equals("col1"))?"0":"1");
Element columns = doc.createElement("columns");
Element column = doc.createElement("column");
column.setAttribute("index", "0");
column.appendChild(createColumnToolsXml(doc, (List)context.get("pageColumn0Tools"), page));
columns.appendChild(column);
if (context.get("pageColumnLayout").equals("col1of2")) {
Element column2 = doc.createElement("column");
column2.setAttribute("index", "1");
column2.appendChild(createColumnToolsXml(doc, (List)context.get("pageColumn1Tools"), page));
columns.appendChild(column2);
}
pageElement.appendChild(columns);
}
return pageElement;
}
protected Element createColumnToolsXml(Document doc, List tools, Map page) throws ToolRenderException {
Element toolsElement = doc.createElement("tools");
for (Iterator<Map> i=tools.iterator();i.hasNext();) {
toolsElement.appendChild(createToolXml(doc, i.next(), page));
}
return toolsElement;
}
protected Element createToolXml(Document doc, Map tool, Map page) throws ToolRenderException {
Element toolElement = doc.createElement("tool");
Element title = doc.createElement("title");
safeAppendTextNode(doc, title, tool.get("toolTitle").toString(), true);
Element escapedId = doc.createElement("escapedId");
safeAppendTextNode(doc, escapedId, tool.get("toolPlacementIDJS").toString(), true);
toolElement.appendChild(title);
toolElement.appendChild(escapedId);
appendTextElementNode(doc, "toolReset", tool.get("toolResetActionUrl").toString(), toolElement);
appendTextElementNode(doc, "toolHelp", tool.get("toolHelpActionUrl").toString(), toolElement);
if (tool.get("toolJSR168Edit") != null) {
appendTextElementNode(doc, "toolJSR168Edit", tool.get("toolJSR168Edit").toString(), toolElement);
toolElement.setAttribute("has168Edit", "true");
}
if (tool.get("toolJSR168Help") != null) {
appendTextElementNode(doc, "toolJSR168Help", tool.get("toolJSR168Help").toString(), toolElement);
toolElement.setAttribute("has168Help", "true");
}
toolElement.setAttribute("hasReset", tool.get("toolShowResetButton").toString());
toolElement.setAttribute("hasHelp", tool.get("toolShowHelpButton").toString());
if ((Boolean)tool.get("hasRenderResult")) {
toolElement.setAttribute("renderResult", "true");
RenderResult result = (RenderResult) tool.get("toolRenderResult");
appendTextElementNode(doc, "resultTitle", result.getTitle(), toolElement);
//SAK-18793 - readDocumentFromString returns null on error; this check prevents NPEs
String contentStr = result.getContent();
if (contentStr == null)
{
throw new ToolRenderException ("tool xml failed to render and is null");
}
//remove the title b/c XML will freak out if there is some foreign language utf-8 symbols
contentStr = contentStr.replaceAll("title=\".*" + result.getTitle() + ".*\"", "");
Tidy tdpr = new Tidy();
tdpr.setForceOutput(true);
tdpr.setShowWarnings(false);
tdpr.setXHTML(true);
tdpr.setXmlOut(true);
tdpr.setPrintBodyOnly(true);
tdpr.setQuiet(true);
StringWriter sw = new StringWriter();
tdpr.parse(new StringReader(contentStr), sw);
// Wrap tidy'd source in a div so we guarantee a root element
Document content = Xml.readDocumentFromString("<div>" + sw.toString() + "</div>");
Element contentRoot = (Element) doc.importNode(content.getDocumentElement(), true);
Element contentElement = doc.createElement("content");
contentElement.appendChild(contentRoot);
toolElement.appendChild(contentElement);
}
else {
//portal/tool/ad222467-e186-4cca-80e9-d12a9d6db392?panel=Main
Element toolUrl = doc.createElement("url");
safeAppendTextNode(doc, toolUrl, tool.get("toolUrl") + "?panel=Main", true);
toolElement.appendChild(toolUrl);
}
return toolElement;
}
protected Map createSiteTypesMap() {
Map siteTypes = new HashMap();
return siteTypes;
}
protected Element createConfixXml(Document doc, boolean loggedIn, Map sitePages) {
Element config = doc.createElement("config");
String skinRepo = (String) context.get("logoSkinRepo") + "/" + context.get("logoSkin");
String helpUrl = null;
String tutorial = null;
if (sitePages != null) {
String presenceUrl = (String) sitePages.get("pageNavPresenceUrl");
boolean showPresence = ((Boolean)sitePages.get("pageNavShowPresenceLoggedIn")).booleanValue();
Element presence = doc.createElement("presence");
safeAppendTextNode(doc, presence, presenceUrl, true);
presence.setAttribute("include", Boolean.valueOf(showPresence && loggedIn).toString());
config.appendChild(presence);
helpUrl = (String) sitePages.get("pageNavHelpUrl");
config.setAttribute("pageNavPublished", sitePages.get("pageNavPublished").toString());
}
Element logo = doc.createElement("logo");
safeAppendTextNode(doc, logo, skinRepo + "/images/logo_inst.gif", true);
Element banner = doc.createElement("banner");
safeAppendTextNode(doc, banner, skinRepo + "/images/banner_inst.gif", true);
Element logout = doc.createElement("logout");
safeAppendTextNode(doc, logout, (String) context.get("loginLogInOutUrl"), true);
String copyright = (String) context.get("");
String service = (String) context.get("bottomNavService");
String serviceVersion = (String) context.get("bottomNavServiceVersion");
String sakaiVersion = (String) context.get("bottomNavSakaiVersion");
String server = (String) context.get("bottomNavServer");
String portalPath = (String) context.get("portalPath");
String loggedOutUrl = (String) context.get("loggedOutUrl");
String timeoutDialogEnabled = context.get("timeoutDialogEnabled").toString();
String timeoutDialogWarningSeconds = context.get("timeoutDialogWarningSeconds").toString();
String portal_allow_auto_minimize = context.get("portal_allow_auto_minimize").toString();
String portal_allow_minimize_tools = context.get("portal_allow_minimize_tools").toString();
String portal_allow_minimize_navigation = context.get("portal_allow_minimize_navigation").toString();
String portal_add_mobile_link = context.get("portal_add_mobile_link").toString();
String maxToolsInt = context.get("maxToolsInt").toString();
String neoChat = context.get("neoChat").toString();
String neoAvatar = context.get("neoAvatar").toString();
if (context.containsKey("tutorial"))
tutorial = context.get("tutorial").toString();
String[] bottomNav = getListAsStringArray("bottomNav");
List poweredByList = (List) context.get("bottomNavPoweredBy");
String[] poweredByUrl = new String[poweredByList.size()];
String[] poweredByImage = new String[poweredByList.size()];
String[] poweredByAltText = new String[poweredByList.size()];
config.appendChild(logo);
config.appendChild(banner);
config.appendChild(logout);
appendTextElementNode(doc, "copyright", copyright, config);
appendTextElementNode(doc, "service", service, config);
appendTextElementNode(doc, "serviceVersion", serviceVersion, config);
appendTextElementNode(doc, "sakaiVersion", sakaiVersion, config);
appendTextElementNode(doc, "server", server, config);
appendTextElementNode(doc, "helpUrl", helpUrl, config);
appendTextElementNode(doc, "portalPath", portalPath, config);
appendTextElementNode(doc, "loggedOutUrl", loggedOutUrl, config);
appendTextElementNode(doc, "timeoutDialogWarningSeconds", timeoutDialogWarningSeconds, config);
appendTextElementNode(doc, "timeoutDialogEnabled", timeoutDialogEnabled, config);
appendTextElementNode(doc, "portal_allow_auto_minimize", portal_allow_auto_minimize, config);
appendTextElementNode(doc, "portal_allow_minimize_tools", portal_allow_minimize_tools, config);
appendTextElementNode(doc, "portal_allow_minimize_navigation", portal_allow_minimize_navigation, config);
appendTextElementNode(doc, "portal_add_mobile_link", portal_add_mobile_link, config);
appendTextElementNode(doc, "maxToolsInt", maxToolsInt, config);
appendTextElementNode(doc, "neoChat", neoChat, config);
appendTextElementNode(doc, "neoAvatar", neoAvatar, config);
appendTextElementNode(doc, "tutorial", tutorial, config);
appendTextElementNodes(doc, bottomNav, config, "bottomNavs", "bottomNav");
for (int i = 0; i < poweredByList.size(); i++) {
Map poweredBy = (Map)poweredByList.get(i);
poweredByAltText[i] = (String) poweredBy.get("poweredByAltText");
poweredByImage[i]= (String) poweredBy.get("poweredByImage");
poweredByUrl[i] = (String) poweredBy.get("poweredByUrl");
config.appendChild(createPoweredByXml(doc, poweredByAltText[i], poweredByImage[i], poweredByUrl[i]));
}
appendTextElementNodes(doc, poweredByUrl, config, "poweredByUrls", "poweredByUrl");
appendTextElementNodes(doc, poweredByImage, config, "poweredByImages", "poweredByImage");
appendTextElementNodes(doc, poweredByAltText, config, "poweredByAltTexts", "poweredByAltText");
addExtraConfig(config);
return config;
}
protected void addExtraConfig(Element config) {
Element extra = config.getOwnerDocument().createElement("extra");
config.appendChild(extra);
for (Iterator<Map.Entry> i=context.entrySet().iterator();i.hasNext();) {
Map.Entry entry = i.next();
if (entry.getValue() instanceof String) {
appendTextElementNode(config.getOwnerDocument(),
(String) entry.getKey(), (String) entry.getValue(), extra);
}
else if (entry.getValue() instanceof String[]) {
appendTextElementNodes(config.getOwnerDocument(),
(String[]) entry.getValue(), extra, entry.getKey().toString() + "-list",
entry.getKey().toString());
}
else if (entry.getValue() instanceof List) {
List value = (List) entry.getValue();
if (value.size() > 0 && value.get(0) instanceof String) {
String[] values = new String[value.size()];
for (int j=0;j<values.length;j++) {
if (value.get(j) != null) {
values[j] = value.get(j).toString();
}
else {
values[j] = null;
}
}
appendTextElementNodes(config.getOwnerDocument(),
values, extra, entry.getKey().toString() + "-list",
entry.getKey().toString());
}
}
}
}
protected Element createPoweredByXml(Document doc, String text, String image, String url) {
Element poweredBy = doc.createElement("poweredBy");
appendTextElementNode(doc, "text", text, poweredBy);
appendTextElementNode(doc, "image", image, poweredBy);
appendTextElementNode(doc, "url", url, poweredBy);
return poweredBy;
}
protected String[] getListAsStringArray(String key) {
List list = (List) context.get(key);
return (String[]) list.toArray(new String[]{});
}
protected Element createSkin(Document doc) {
Element skins = doc.createElement("skins");
String skinUrl = context.get("pageSkinRepo")+"/"+context.get("pageSkin")+"/portal.css";
Element skin = doc.createElement("skin");
skins.appendChild(skin);
safeAppendTextNode(doc, skin, skinUrl, true);
skin.setAttribute("order", "0");
return skins;
}
protected Element createLoginXml(Document doc, HttpServletRequest req) {
Element login = doc.createElement("loginInfo");
appendTextElementNodeFromProp(doc, "topLogin", "siteNavTopLogin", login);
appendTextElementNodeFromProp(doc, "logInOutUrl", "loginLogInOutUrl", login);
appendTextElementNodeFromProp(doc, "loginText", "loginMessage", login);
appendTextElementNodeFromProp(doc, "logoutText", "loginMessage", login);
appendTextElementNodeFromProp(doc, "image1", "loginImage1", login);
return login;
}
protected void appendTextElementNodeFromProp(Document doc, String nodeName, String propName, Element parent) {
Object nodeValue = context.get(propName);
if (nodeValue == null) {
appendTextElementNode(doc, nodeName, null, parent);
}
else {
appendTextElementNode(doc, nodeName, nodeValue.toString(), parent);
}
}
protected Element createUserXml(Document doc, User current) {
Element user = doc.createElement("currentUser");
appendTextElementNode(doc, "id", current.getId(), user);
appendTextElementNode(doc, "eid", current.getEid(), user);
appendTextElementNode(doc, "first", current.getFirstName(), user);
appendTextElementNode(doc, "last", current.getLastName(), user);
appendTextElementNode(doc, "displayName", current.getDisplayName(), user);
appendTextElementNode(doc, "email", current.getEmail(), user);
appendTextElementNode(doc, "type", current.getType(), user);
return user;
}
protected void appendTextElementNode(Document doc, String name, String text, Element parent) {
Element element = doc.createElement(name);
safeAppendTextNode(doc, element, text, true);
parent.appendChild(element);
}
protected void safeAppendTextNode(Document doc, Element element, String text, boolean cdata) {
if (text != null) {
element.appendChild(cdata?doc.createCDATASection(text):doc.createTextNode(text));
}
}
protected void dumpDocument(Node node) {
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty( OutputKeys.INDENT, "yes" );
transformer.transform( new DOMSource(node), new StreamResult(System.out) );
}
catch ( Exception e )
{
e.printStackTrace();
}
}
protected void appendTextElementNodes(Document doc, String[] strings, Element parent,
String topNodeName, String nodeName) {
Element topNode = doc.createElement(topNodeName);
if (strings == null) {
return;
}
for (int i=0;i<strings.length;i++) {
appendTextElementNode(doc, nodeName, strings[i], topNode);
}
parent.appendChild(topNode);
}
public String getAlternateTemplate() {
if (request.getParameter(ALT_TEMPLATE) != null) {
return request.getParameter(ALT_TEMPLATE);
}
if (request.getAttribute(ALT_TEMPLATE) != null) {
return request.getAttribute(ALT_TEMPLATE).toString();
}
return null;
}
public boolean isDisplayToolCategories() {
return ServerConfigurationService.getBoolean("xslPortal.displayToolCategories", true);
}
}