1 9 package org.jboss.portal.core.theme.deployment.jboss; 10 11 import org.apache.log4j.Logger; 12 import org.apache.xpath.CachedXPathAPI; 13 import org.jboss.deployment.DeploymentException; 14 import org.jboss.portal.common.util.XML; 15 import org.jboss.portal.core.theme.impl.PortalThemeImpl; 16 import org.jboss.portal.core.theme.impl.ThemeLinkImpl; 17 import org.jboss.portal.core.theme.impl.ThemeScriptImpl; 18 import org.jboss.portal.server.ServerManager; 19 import org.jboss.portal.server.ServerRegistrationID; 20 import org.jboss.portal.server.ThemeServer; 21 import org.jboss.portal.server.deployment.PortalWebApp; 22 import org.jboss.portal.server.deployment.jboss.Deployment; 23 import org.jboss.portal.server.metadata.ThemeRegistrationMetaData; 24 import org.jboss.portal.server.theme.PortalTheme; 25 import org.jboss.portal.server.theme.ThemeException; 26 import org.jboss.portal.server.theme.ThemeLink; 27 import org.jboss.portal.server.theme.ThemeScript; 28 import org.w3c.dom.Document ; 29 import org.w3c.dom.Node ; 30 import org.w3c.dom.NodeList ; 31 import org.xml.sax.SAXException ; 32 33 import javax.servlet.ServletContext ; 34 import javax.xml.parsers.ParserConfigurationException ; 35 import javax.xml.transform.TransformerException ; 36 import java.io.IOException ; 37 import java.io.InputStream ; 38 import java.net.URL ; 39 40 48 public class ThemeDeployment extends Deployment 49 { 50 private static Logger log = Logger.getLogger(ThemeDeployment.class); 51 private final ThemeServer themeServer; 52 53 61 public ThemeDeployment(ServerManager serverManager, URL url, PortalWebApp pwa, String appName) 62 { 63 super(serverManager, url, pwa, appName); 64 themeServer = serverManager.getThemeServer(); 65 log.info("new theme deployer for : " + appName); 66 } 67 68 73 public void create() throws DeploymentException 74 { 75 log.info("create new theme(s), found in : " + appName); 76 try 77 { 78 InputStream themeStream = pwa.getServletContext().getResourceAsStream("/WEB-INF/portal-themes.xml"); 79 Document themes = XML.createDocument(themeStream); 80 CachedXPathAPI xpath = new CachedXPathAPI(); 81 NodeList nl = xpath.selectNodeList(themes, "/themes/theme"); 82 for (int i = 0; i < nl.getLength(); i++) 83 { 84 String name = xpath.selectSingleNode(nl.item(i), "./name/text()").getNodeValue(); 85 PortalTheme theme = createTheme(pwa.getServletContext(), pwa.getContextPath(), appName, name); 86 addThemeLinks(theme, xpath, nl.item(i)); 88 addThemeScripts(theme, xpath, nl.item(i)); 89 90 themeServer.addTheme((ThemeRegistrationMetaData)theme); 91 } 92 log.info("done creating new theme(s), found in : " + appName); 93 } 94 catch (IOException e) 95 { 96 throw new DeploymentException(e); 97 } 98 catch (ParserConfigurationException e) 99 { 100 throw new DeploymentException(e); 101 } 102 catch (SAXException e) 103 { 104 throw new DeploymentException(e); 105 } 106 catch (TransformerException e) 107 { 108 throw new DeploymentException(e); 109 } 110 catch (ThemeException e) 111 { 112 throw new DeploymentException(e); 113 } 114 } 115 116 121 public void destroy() throws DeploymentException 122 { 123 log.info("destroying theme(s), found in : " + appName); 124 try 125 { 126 themeServer.removeThemes(appName); 127 log.info("done destroying theme(s), found in : " + appName); 128 } 129 catch (ThemeException e) 130 { 131 throw new DeploymentException(e); 132 } 133 } 134 135 137 private PortalTheme createTheme(ServletContext servletContext, String contextPath, String appName, String name) 138 { 139 log.debug("create theme for context " + servletContext.getServletContextName() + " and name " + name); 140 if (servletContext == null || name == null) 141 { 142 throw new NullPointerException ("ServletContext[" + servletContext + "] name[" + name + "]"); 143 } 144 ServerRegistrationID id = ServerRegistrationID.createID(ServerRegistrationID.TYPE_THEME, new String []{appName, name}); 145 return new PortalThemeImpl(id, servletContext, contextPath, appName, name); 146 } 147 148 private void addThemeScripts(PortalTheme theme, CachedXPathAPI xpath, Node item) throws TransformerException 149 { 150 NodeList scripts = xpath.selectNodeList(item, "./script"); 151 if (scripts.getLength() > 0) 152 { 153 for (int s = 0; s < scripts.getLength(); s++) 154 { 155 String src = getNodeValue(xpath, scripts.item(s), "@src"); 156 String type = getNodeValue(xpath, scripts.item(s), "@type"); 157 createScript(theme, src, type); 158 } 159 } 160 } 161 162 private void addThemeLinks(PortalTheme theme, CachedXPathAPI xpath, Node item) throws TransformerException 163 { 164 NodeList links = xpath.selectNodeList(item, "./link"); 165 if (links.getLength() > 0) 166 { 167 for (int l = 0; l < links.getLength(); l++) 168 { 169 String href = getNodeValue(xpath, links.item(l), "@href"); 170 String type = getNodeValue(xpath, links.item(l), "@type"); 171 String title = getNodeValue(xpath, links.item(l), "@title"); 172 String media = getNodeValue(xpath, links.item(l), "@media"); 173 String rel = getNodeValue(xpath, links.item(l), "@rel"); 174 createLink(theme, rel, type, href, title, media); 175 } 176 } 177 } 178 179 private static ThemeLink createLink(PortalTheme theme, String rel, String type, String href, String title, String media) 180 { 181 log.debug("create link for theme " + theme.getName()); 182 ThemeLink link = new ThemeLinkImpl(theme, rel, type, href, title, media); 183 theme.addLink(link); 184 return link; 185 } 186 187 196 public static ThemeScript createScript(PortalTheme theme, String src, String type) 197 { 198 log.debug("create script for theme " + theme.getName()); 199 ThemeScript script = new ThemeScriptImpl(theme, src, type); 200 theme.addScript(script); 201 return script; 202 } 203 204 private static String getNodeValue(CachedXPathAPI xpath, Node item, String exp) throws TransformerException 205 { 206 Node node = xpath.selectSingleNode(item, exp); 207 if (node != null) 208 { 209 return node.getNodeValue(); 210 } 211 return null; 212 } 213 } 214 | Popular Tags |