/* * JBoss, Home of Professional Open Source * Copyright 2008, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This 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 software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.metadata.sip.jboss; import java.lang.reflect.Method; import java.util.List; import java.util.Set; import org.jboss.metadata.ejb.jboss.JBossEnvironmentRefsGroupMetaData; import org.jboss.metadata.javaee.jboss.RunAsIdentityMetaData; import org.jboss.metadata.javaee.spec.Environment; import org.jboss.metadata.sip.spec.ListenerMetaData; import org.jboss.metadata.sip.spec.MessageDestinationsMetaData; import org.jboss.metadata.sip.spec.ParamValueMetaData; import org.jboss.metadata.sip.spec.ProxyConfigMetaData; import org.jboss.metadata.sip.spec.SecurityRolesMetaData; import org.jboss.metadata.sip.spec.ServletSelectionMetaData; import org.jboss.metadata.sip.spec.ServletsMetaData; import org.jboss.metadata.sip.spec.SessionConfigMetaData; import org.jboss.metadata.sip.spec.Sip11MetaData; import org.jboss.metadata.sip.spec.SipLoginConfigMetaData; import org.jboss.metadata.sip.spec.SipMetaData; import org.jboss.metadata.sip.spec.SipSecurityConstraintMetaData; import org.jboss.metadata.web.jboss.JBossWebMetaData; import org.mobicents.servlet.sip.annotation.ConcurrencyControlMode; /** * Extend the JBossWebMetaData from JBoss 5 to provide support for converged sip/http applications * * @author jean.deruelle@gmail.com * */ public class JBossConvergedSipMetaData extends JBossWebMetaData { private static final long serialVersionUID = 1; private String applicationName; private ServletSelectionMetaData servletSelection; private ProxyConfigMetaData proxyConfig; private List<SipSecurityConstraintMetaData> sipSecurityContraints; private SessionConfigMetaData sipSessionConfig; private SipLoginConfigMetaData sipLoginConfig; private List<? extends ParamValueMetaData> sipContextParams; private List<ListenerMetaData> sipListeners; private JBossServletsMetaData sipServlets; private MessageDestinationsMetaData messageDestinations; private SecurityRolesMetaData securityRoles; private Method sipApplicationKeyMethod; private ConcurrencyControlMode concurrencyControlMode; public void merge(JBossConvergedSipMetaData override, SipMetaData original) { this.merge(override, original, "jboss-web.xml", "sip.xml", false); } public void merge(JBossConvergedSipMetaData override, SipMetaData original, String overrideFile, String overridenFile, boolean mustOverride) { super.merge(override, original); if(override != null && override.getDistributable()!= null) setDistributable(override.getDistributable()); else if(original != null && original.getDistributable() != null) setDistributable(original.getDistributable()); if(override != null && override.isMetadataComplete() != false) setMetadataComplete(override.isMetadataComplete()); else if(original != null && (original instanceof Sip11MetaData) ) { Sip11MetaData sip11MD = (Sip11MetaData) original; setMetadataComplete(sip11MD.isMetadataComplete()); } else if(original != null && (original instanceof JBossSip11MetaData) ) { JBossSip11MetaData sip11MD = (JBossSip11MetaData) original; setMetadataComplete(sip11MD.isMetadataComplete()); } if(override != null && override.getSipContextParams()!= null) setSipContextParams(override.getSipContextParams()); else if(original != null && original.getContextParams() != null) setSipContextParams(original.getContextParams()); if(override != null && override.getServletVersion()!= null) setServletVersion(override.getServletVersion()); else if(original != null && original.getVersion() != null) setServletVersion(original.getVersion()); if(override != null && override.getSessionConfig()!= null) setSessionConfig(override.getSessionConfig()); else if(original != null && original.getSessionConfig() != null) { org.jboss.metadata.web.spec.SessionConfigMetaData sessionConfigMetaData = new org.jboss.metadata.web.spec.SessionConfigMetaData(); sessionConfigMetaData.setSessionTimeout(original.getSessionConfig().getSessionTimeout()); setSessionConfig(sessionConfigMetaData); } if(override != null && override.getFilters()!= null) setFilters(override.getFilters()); if(override != null && override.getFilterMappings()!= null) setFilterMappings(override.getFilterMappings()); if(override != null && override.getErrorPages()!= null) setErrorPages(override.getErrorPages()); if(override != null && override.getJspConfig()!= null) setJspConfig(override.getJspConfig()); if(override != null && override.getLoginConfig()!= null) setLoginConfig(override.getLoginConfig()); if(override != null && override.getMimeMappings()!= null) setMimeMappings(override.getMimeMappings()); if(override != null && override.getServletMappings()!= null) setServletMappings(override.getServletMappings()); if(override != null && override.getSecurityContraints()!= null) setSecurityContraints(override.getSecurityContraints()); if(override != null && override.getWelcomeFileList()!= null) setWelcomeFileList(override.getWelcomeFileList()); if(override != null && override.getLocalEncodings()!= null) setLocalEncodings(override.getLocalEncodings()); if(override != null && override.isJaccAllStoreRole()) setJaccAllStoreRole(override.isJaccAllStoreRole()); if(override != null && override.getVersion()!= null) setVersion(override.getVersion()); else if(original != null && original.getVersion() != null) setVersion(original.getVersion()); if(override != null && override.getContextRoot()!= null) setContextRoot(override.getContextRoot()); if(override != null && override.getAlternativeDD()!= null) setAlternativeDD(override.getAlternativeDD()); if(override != null && override.getSecurityDomain()!= null) setSecurityDomain(override.getSecurityDomain()); if(override != null && override.getJaccContextID()!= null) setJaccContextID(override.getJaccContextID()); if(override != null && override.getClassLoading()!= null) setClassLoading(override.getClassLoading()); if(override != null && override.getDepends()!= null) setDepends(override.getDepends()); if(override != null && override.getRunAsIdentity()!= null) setRunAsIdentity(override.getRunAsIdentity()); if(getSipSecurityRoles() == null) setSipSecurityRoles(new SecurityRolesMetaData()); SecurityRolesMetaData overrideRoles = null; SecurityRolesMetaData originalRoles = null; if(override != null) overrideRoles = override.getSipSecurityRoles(); if(original != null) originalRoles = original.getSecurityRoles(); getSipSecurityRoles().merge(overrideRoles, originalRoles); MessageDestinationsMetaData overrideMsgDests = null; MessageDestinationsMetaData originalMsgDests = null; if(override != null && override.getSipMessageDestinations()!= null) overrideMsgDests = override.getSipMessageDestinations(); if(original != null && original.getMessageDestinations() != null) originalMsgDests = original.getMessageDestinations(); setSipMessageDestinations(MessageDestinationsMetaData.merge(overrideMsgDests, originalMsgDests, overridenFile, overrideFile)); if(this.getJndiEnvironmentRefsGroup() == null) setJndiEnvironmentRefsGroup(new JBossEnvironmentRefsGroupMetaData()); Environment env = null; JBossEnvironmentRefsGroupMetaData jenv = null; if( override != null ) jenv = (JBossEnvironmentRefsGroupMetaData) override.getJndiEnvironmentRefsGroup(); if(original != null) env = original.getJndiEnvironmentRefsGroup(); ((JBossEnvironmentRefsGroupMetaData)getJndiEnvironmentRefsGroup()).merge(jenv, env, null, overrideFile, overridenFile, mustOverride); if(override != null && override.getVirtualHosts()!= null) setVirtualHosts(override.getVirtualHosts()); if(override != null && override.isFlushOnSessionInvalidation()) setFlushOnSessionInvalidation(override.isFlushOnSessionInvalidation()); if(override != null && override.isUseSessionCookies()) setUseSessionCookies(override.isUseSessionCookies()); if(override != null && override.getReplicationConfig()!= null) setReplicationConfig(override.getReplicationConfig()); if(override != null && override.getPassivationConfig()!= null) setPassivationConfig(override.getPassivationConfig()); if(override != null && override.getWebserviceDescriptions()!= null) setWebserviceDescriptions(override.getWebserviceDescriptions()); if(override != null && override.getArbitraryMetadata()!= null) setArbitraryMetadata(override.getArbitraryMetadata()); if(override != null && override.getMaxActiveSessions() != null) setMaxActiveSessions(override.getMaxActiveSessions()); if(override != null && override.getSessionCookies() != -1) setSessionCookies(override.getSessionCookies()); if(override != null && override.getApplicationName()!= null) setApplicationName(override.getApplicationName()); else if(original != null && original.getApplicationName() != null) setApplicationName(original.getApplicationName()); if(override != null && override.servletSelection!= null) setServletSelection(override.servletSelection); else if(original != null && original.getServletSelection() != null) setServletSelection(original.getServletSelection()); if(override != null && override.proxyConfig!= null) setProxyConfig(override.proxyConfig); else if(original != null && original.getProxyConfig() != null) setProxyConfig(original.getProxyConfig()); if(override != null && override.sipSessionConfig!= null) setSipSessionConfig(override.sipSessionConfig); else if(original != null && original.getSessionConfig() != null) setSipSessionConfig(original.getSessionConfig()); if(override != null && override.sipLoginConfig!= null) setSipLoginConfig(override.sipLoginConfig); else if(original != null && original.getSipLoginConfig() != null) setSipLoginConfig(original.getSipLoginConfig()); if(override != null && override.sipSecurityContraints!= null) setSipSecurityContraints(override.sipSecurityContraints); else if(original != null && original.getSipSecurityContraints() != null) setSipSecurityContraints(original.getSipSecurityContraints()); if(override != null && override.sipContextParams!= null) setSipContextParams(override.sipContextParams); else if(original != null && original.getContextParams() != null) setSipContextParams(original.getContextParams()); if(override != null && override.sipListeners!= null) setSipListeners(override.sipListeners); else if(original != null && original.getListeners() != null) setSipListeners(original.getListeners()); JBossServletsMetaData soverride = null; ServletsMetaData soriginal = null; if(override != null) soverride = override.getSipServlets(); if(original != null) { if(original instanceof Sip11MetaData) { soriginal = ((Sip11MetaData)original).getServlets(); } if(original instanceof JBossSip11MetaData) { soriginal = ((JBossSip11MetaData)original).getServlets(); } } sipServlets = JBossServletsMetaData.merge(soverride, soriginal); // if(sipContextParams != null) { // List<ParamValueMetaData> mergedContextParams = new ArrayList<ParamValueMetaData>(sipContextParams); // if(override != null && override.getContextParams() != null) { // mergedContextParams.addAll(override.getContextParams()); // } // setContextParams(mergedContextParams); // } if(override != null && override.getSipApplicationKeyMethod()!= null) setSipApplicationKeyMethod(override.getSipApplicationKeyMethod()); else if(original != null && original.getSipApplicationKeyMethod() != null) setSipApplicationKeyMethod(original.getSipApplicationKeyMethod()); if(override != null && override.getConcurrencyControlMode()!= null) setConcurrencyControlMode(override.getConcurrencyControlMode()); else if(original != null && original.getConcurrencyControlMode() != null) setConcurrencyControlMode(original.getConcurrencyControlMode()); //listeners should not be merged because they have a special treatment when loading the context // Update run-as indentity for a run-as-principal if(sipServlets != null) { for(JBossServletMetaData servlet : sipServlets) { String servletName = servlet.getServletName(); String principalName = servlet.getRunAsPrincipal(); // Get the sip.xml run-as primary role String sipXmlRunAs = null; if(servlet.getRunAs() != null) sipXmlRunAs = servlet.getRunAs().getRoleName(); if (principalName != null) { // Update the run-as indentity to use the principal name if (sipXmlRunAs == null) { //Needs to be merged from Annotations sipXmlRunAs = "PLACEHOLDER_FOR_ANNOTATION"; //throw new IllegalStateException("run-as-principal: " + principalName + " found in jboss-web.xml but there was no run-as in web.xml"); } // See if there are any additional roles for this principal Set<String> extraRoles = getSecurityRoles().getSecurityRoleNamesByPrincipal(principalName); RunAsIdentityMetaData runAsId = new RunAsIdentityMetaData(sipXmlRunAs, principalName, extraRoles); getRunAsIdentity().put(servletName, runAsId); } else if (sipXmlRunAs != null) { RunAsIdentityMetaData runAsId = new RunAsIdentityMetaData(sipXmlRunAs, null); getRunAsIdentity().put(servletName, runAsId); } } } } /** * @param applicationName the applicationName to set */ public void setApplicationName(String applicationName) { this.applicationName = applicationName; } /** * @return the applicationName */ public String getApplicationName() { return applicationName; } /** * @param servletSelection the servletSelection to set */ public void setServletSelection(ServletSelectionMetaData servletSelection) { this.servletSelection = servletSelection; } /** * @return the servletSelection */ public ServletSelectionMetaData getServletSelection() { return servletSelection; } /** * @param proxyConfig the proxyConfig to set */ public void setProxyConfig(ProxyConfigMetaData proxyConfig) { this.proxyConfig = proxyConfig; } /** * @return the proxyConfig */ public ProxyConfigMetaData getProxyConfig() { return proxyConfig; } /** * @param sipSecurityContraints the sipSecurityContraints to set */ public void setSipSecurityContraints(List<SipSecurityConstraintMetaData> sipSecurityContraints) { this.sipSecurityContraints = sipSecurityContraints; } /** * @return the sipSecurityContraints */ public List<SipSecurityConstraintMetaData> getSipSecurityContraints() { return sipSecurityContraints; } /** * @param sipLoginConfig the sipLoginConfig to set */ public void setSipLoginConfig(SipLoginConfigMetaData sipLoginConfig) { this.sipLoginConfig = sipLoginConfig; } /** * @return the sipLoginConfig */ public SipLoginConfigMetaData getSipLoginConfig() { return sipLoginConfig; } /** * @param sipContextParams the sipContextParams to set */ public void setSipContextParams(List<? extends ParamValueMetaData> sipContextParams) { this.sipContextParams = sipContextParams; } /** * @return the sipContextParams */ public List<? extends ParamValueMetaData> getSipContextParams() { return sipContextParams; } /** * @param sipListeners the sipListeners to set */ public void setSipListeners(List<ListenerMetaData> sipListeners) { this.sipListeners = sipListeners; } /** * @return the sipListeners */ public List<ListenerMetaData> getSipListeners() { return sipListeners; } /** * @param sipServlets the sipServlets to set */ public void setSipServlets(JBossServletsMetaData sipServlets) { this.sipServlets = sipServlets; } /** * @return the sipServlets */ public JBossServletsMetaData getSipServlets() { return sipServlets; } /** * @param sipSessionConfig the sipSessionConfig to set */ public void setSipSessionConfig(SessionConfigMetaData sipSessionConfig) { this.sipSessionConfig = sipSessionConfig; } /** * @return the sipSessionConfig */ public SessionConfigMetaData getSipSessionConfig() { return sipSessionConfig; } /** * @param sipApplicationKeyMethod the sipApplicationKeyMethod to set */ public void setSipApplicationKeyMethod(Method sipApplicationKeyMethod) { this.sipApplicationKeyMethod = sipApplicationKeyMethod; } /** * @return the sipApplicationKeyMethod */ public Method getSipApplicationKeyMethod() { return sipApplicationKeyMethod; } /** * @param messageDestinations the messageDestinations to set */ public void setSipMessageDestinations(MessageDestinationsMetaData messageDestinations) { this.messageDestinations = messageDestinations; } /** * @return the messagesDestinations */ public MessageDestinationsMetaData getSipMessageDestinations() { return messageDestinations; } /** * @param securityRoles the securityRoles to set */ public void setSipSecurityRoles(SecurityRolesMetaData securityRoles) { this.securityRoles = securityRoles; } /** * @return the securityRoles */ public SecurityRolesMetaData getSipSecurityRoles() { return securityRoles; } /** * @param concurrencyControlMode the concurrencyControlMode to set */ public void setConcurrencyControlMode(ConcurrencyControlMode ConcurrencyControlMode) { this.concurrencyControlMode = ConcurrencyControlMode; } /** * @return the concurrencyControlMode */ public ConcurrencyControlMode getConcurrencyControlMode() { return concurrencyControlMode; } }