Java tutorial
/** * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.web.extender.internal; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.SAXReaderUtil; import com.liferay.portal.kernel.xml.XPath; import com.liferay.util.ContentUtil; import com.liferay.web.extender.servlet.FilterDefinition; import com.liferay.web.extender.servlet.ListenerDefinition; import com.liferay.web.extender.servlet.ServletDefinition; import java.util.Hashtable; import java.util.Map; import java.util.TreeMap; import javax.servlet.Filter; import javax.servlet.Servlet; import org.osgi.framework.Bundle; /** * @author Raymond Aug */ public class WebXMLLoader { public static WebXML loadWebXML(Bundle bundle) { WebXML webXML = new WebXML(); try { Document webXmlDocument = SAXReaderUtil.read(_DEFAULT_WEB); Element root = webXmlDocument.getRootElement(); loadContext(bundle, root, webXML); loadFilters(bundle, root, webXML); loadServlets(bundle, root, webXML); loadMimeMappings(bundle, root, webXML); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn(e.getMessage()); } } try { Document webXmlDocument = SAXReaderUtil.read(bundle.getEntry("WEB-INF/web.xml")); Element root = webXmlDocument.getRootElement(); loadContext(bundle, root, webXML); loadFilters(bundle, root, webXML); loadServlets(bundle, root, webXML); loadMimeMappings(bundle, root, webXML); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn(e.getMessage(), e); } } return webXML; } protected static void loadContext(Bundle bundle, Element root, WebXML webXML) throws Exception { Hashtable<String, String> contextParams = webXML.getContextParams(); for (Element element : root.elements("context-param")) { String contextParamName = element.element("param-name").getTextTrim(); String contextParamValue = element.element("param-value").getTextTrim(); webXML.setContextParam(contextParamName, contextParamValue); } Map<String, ListenerDefinition> listeners = webXML.getListeners(); for (Element listenerElement : root.elements("listener")) { String listenerClass = listenerElement.element("listener-class").getTextTrim(); ListenerDefinition listenerDefinition = null; try { Object listener = bundle.loadClass(listenerClass).newInstance(); listenerDefinition = new ListenerDefinition(); listenerDefinition.setListener(listener); listenerDefinition.setContextParams(contextParams); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn(e.getMessage()); } continue; } listeners.put(listenerClass, listenerDefinition); } } protected static void loadFilters(Bundle bundle, Element root, WebXML webXML) throws Exception { Map<String, FilterDefinition> filters = webXML.getFilters(); for (Element filterMappingsEl : root.elements("filter-mapping")) { String filterName = filterMappingsEl.element("filter-name").getTextTrim(); String urlPattern = filterMappingsEl.element("url-pattern").getTextTrim(); Map<String, String> namespaces = new TreeMap<String, String>(); namespaces.put("x", root.getNamespace().getText()); XPath xPath = SAXReaderUtil.createXPath("//x:filter[x:filter-name/text() ='" + filterName + "']", namespaces); Element filterElement = (Element) xPath.selectSingleNode(root); if (filterElement == null) { continue; } if (urlPattern.endsWith("/*") && (urlPattern.length() > 2)) { urlPattern = urlPattern.substring(0, urlPattern.length() - 2); } if (urlPattern.startsWith("*")) { urlPattern = "/".concat(urlPattern); } String filterClass = filterElement.element("filter-class").getTextTrim(); FilterDefinition filterDefinition = null; try { Filter filterInstance = (Filter) bundle.loadClass(filterClass).newInstance(); filterDefinition = new FilterDefinition(); filterDefinition.setFilter(filterInstance); filterDefinition.setName(filterName); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn(e.getMessage()); } continue; } for (Element initParam : filterElement.elements("init-param")) { String initParamName = initParam.element("param-name").getTextTrim(); String initParamValue = initParam.element("param-value").getTextTrim(); filterDefinition.setInitParam(initParamName, initParamValue); } filters.put(urlPattern, filterDefinition); } } protected static void loadMimeMappings(Bundle bundle, Element root, WebXML webXML) throws Exception { for (Element servletElement : root.elements("mime-mapping")) { String extension = servletElement.element("extension").getTextTrim(); String mimeType = servletElement.element("mime-type").getTextTrim(); webXML.setMimeType(_RESOURCE_PREFIX.concat(extension), mimeType); } } protected static void loadServlets(Bundle bundle, Element root, WebXML webXML) throws Exception { Map<String, ServletDefinition> servlets = webXML.getServlets(); for (Element servletMappingsEl : root.elements("servlet-mapping")) { String servletName = servletMappingsEl.element("servlet-name").getTextTrim(); String urlPattern = servletMappingsEl.element("url-pattern").getTextTrim(); Map<String, String> namespaces = new TreeMap<String, String>(); namespaces.put("x", root.getNamespace().getText()); XPath xPath = SAXReaderUtil.createXPath("//x:servlet[x:servlet-name/text()='" + servletName + "']", namespaces); Element servletElement = (Element) xPath.selectSingleNode(root); if (servletElement == null) { continue; } if (urlPattern.endsWith("/*") && (urlPattern.length() > 2)) { urlPattern = urlPattern.substring(0, urlPattern.length() - 2); } if (urlPattern.startsWith("*.")) { urlPattern = "/".concat(urlPattern); } String servletClass = servletElement.element("servlet-class").getTextTrim(); ServletDefinition servletDefinition = null; try { Class<?> clazz = bundle.loadClass(servletClass); Servlet servletInstance = (Servlet) clazz.newInstance(); servletDefinition = new ServletDefinition(); servletDefinition.setServlet(servletInstance); servletDefinition.setName(servletName); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn(e.getMessage()); } continue; } for (Element initParam : servletElement.elements("init-param")) { String initParamName = initParam.element("param-name").getTextTrim(); String initParamValue = initParam.element("param-value").getTextTrim(); servletDefinition.setInitParam(initParamName, initParamValue); } servlets.put(urlPattern, servletDefinition); } } private static final String _DEFAULT_WEB = ContentUtil.get(WebXMLLoader.class.getClassLoader(), "com/liferay/web/extender/internal/dependencies/web.xml"); private static String _RESOURCE_PREFIX = "/*."; private static final Log _log = LogFactoryUtil.getLog(WebXMLLoader.class); }