/** * Copyright (c) 2000-present 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.portal.http.service.internal.definition; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.DocumentException; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.SAXReaderUtil; import java.net.URL; import java.util.List; import javax.servlet.Filter; import javax.servlet.Servlet; import org.osgi.framework.Bundle; /** * @author Raymond Augé * @author Miguel Pastor */ public class WebXMLDefinitionLoader { public WebXMLDefinition loadWebXML(Bundle bundle) throws DocumentException, IllegalAccessException, InstantiationException { WebXMLDefinition webXML = new WebXMLDefinition(); URL url = bundle.getEntry("WEB-INF/web.xml"); if (url != null) { Document document = SAXReaderUtil.read(url); Element rootElement = document.getRootElement(); readContextParameters(bundle, rootElement, webXML); readFilters(bundle, rootElement, webXML); readListeners(bundle, rootElement, webXML); readServlets(bundle, rootElement, webXML); } return webXML; } protected String getURLPattern(Element element) { String urlPattern = element.elementText("url-pattern"); if (urlPattern.endsWith(_SLASH_STAR) && (urlPattern.length() > 2)) { urlPattern = urlPattern.substring(0, urlPattern.length() - 2); } if (urlPattern.startsWith(StringPool.STAR)) { urlPattern = StringPool.SLASH.concat(urlPattern); } return urlPattern; } protected void readContextParameters( Bundle bundle, Element rootElement, WebXMLDefinition webXML) { for (Element element : rootElement.elements("context-param")) { String name = element.elementText("param-name"); String value = element.elementText("param-value"); webXML.setContextParameter(name, value); } } protected void readFilters( Bundle bundle, Element rootElement, WebXMLDefinition webXML) throws IllegalAccessException, InstantiationException { List<Element> filterElements = rootElement.elements("filter"); for (Element filterElement : filterElements) { FilterDefinition filterDefinition = new FilterDefinition(); String filterClassName = filterElement.elementText("filter-class"); Class<?> clazz = null; try { clazz = bundle.loadClass(filterClassName); } catch (Exception e) { _log.error("Unable to load filter " + filterClassName); continue; } Filter filter = (Filter)clazz.newInstance(); filterDefinition.setFilter(filter); List<Element> initParamElements = filterElement.elements( "init-param"); for (Element initParamElement : initParamElements) { String paramName = initParamElement.elementText("param-name"); String paramValue = initParamElement.elementText("param-value"); filterDefinition.setInitParameter(paramName, paramValue); } String filterName = filterElement.elementText("filter-name"); filterDefinition.setName(filterName); List<Element> filterMappingElements = rootElement.elements( "filter-mapping"); for (Element filterMappingElement : filterMappingElements) { String filterMappingElementFilterName = filterMappingElement.elementText("filter-name"); if (filterMappingElementFilterName.equals(filterName)) { String urlPattern = getURLPattern(filterMappingElement); filterDefinition.addURLPattern(urlPattern); } } webXML.setFilterDefinition(filterName, filterDefinition); } } protected void readListeners( Bundle bundle, Element rootElement, WebXMLDefinition webXML) throws IllegalAccessException, InstantiationException { List<Element> listenerElements = rootElement.elements("listener"); for (Element listenerElement : listenerElements) { ListenerDefinition listenerDefinition = new ListenerDefinition(); String listenerClassName = listenerElement.elementText( "listener-class"); Class<?> clazz = null; try { clazz = bundle.loadClass(listenerClassName); } catch (Exception e) { _log.error("Unable to load listener " + listenerClassName); continue; } Object listener = clazz.newInstance(); listenerDefinition.setListener(listener); webXML.addListenerDefinition(listenerDefinition); } } protected void readServlets( Bundle bundle, Element rootElement, WebXMLDefinition webXML) throws IllegalAccessException, InstantiationException { List<Element> servletElements = rootElement.elements("servlet"); for (Element servletElement : servletElements) { ServletDefinition servletDefinition = new ServletDefinition(); String servletClassName = servletElement.elementText( "servlet-class"); Class<?> servletClass = null; try { servletClass = bundle.loadClass(servletClassName); } catch (Exception e) { _log.error("Unable to load servlet " + servletClassName); continue; } Servlet servlet = (Servlet)servletClass.newInstance(); servletDefinition.setServlet(servlet); List<Element> initParamElements = servletElement.elements( "init-param"); for (Element initParamElement : initParamElements) { String paramName = initParamElement.elementText("param-name"); String paramValue = initParamElement.elementText("param-value"); servletDefinition.setInitParameter(paramName, paramValue); } String servletName = servletElement.elementText("servlet-name"); servletDefinition.setName(servletName); List<Element> servletMappingElements = rootElement.elements( "servlet-mapping"); for (Element servletMappingElement : servletMappingElements) { String servletMappingElementServletName = servletMappingElement.elementText("servlet-name"); if (servletMappingElementServletName.equals(servletName)) { String urlPattern = getURLPattern(servletMappingElement); servletDefinition.addURLPattern(urlPattern); } } webXML.setServletDefinition(servletName, servletDefinition); } } private static final String _SLASH_STAR = "/*"; private static Log _log = LogFactoryUtil.getLog( WebXMLDefinitionLoader.class); }