<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../.resources/report.css" type="text/css"/><link rel="shortcut icon" href="../.resources/report.gif" type="image/gif"/><title>Rampart.java</title><link rel="stylesheet" href="../.resources/prettify.css" type="text/css"/><script type="text/javascript" src="../.resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.source.html" class="el_package">org.apache.rampart</a> &gt; <span class="el_source">Rampart.java</span></div><h1>Rampart.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an &quot;AS IS&quot; 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.apache.rampart;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisDescription;
import org.apache.axis2.description.AxisModule;
import org.apache.axis2.modules.Module;
import org.apache.neethi.Assertion;
import org.apache.neethi.Policy;
import org.apache.rampart.policy.model.RampartConfig;
import org.apache.ws.secpolicy.SP11Constants;
import org.apache.ws.secpolicy.SP12Constants;

<span class="fc" id="L30">public class Rampart implements Module /* , ModulePolicyExtension */  {</span>

    public void init(ConfigurationContext configContext, AxisModule module)
            throws AxisFault {
<span class="fc" id="L34">    }</span>

    public void engageNotify(AxisDescription axisDescription) throws AxisFault {
        //Nothing to do here, since RampartMessageData will pick up the 
        //effective policy from the message context 
<span class="fc" id="L39">    }</span>

    public void shutdown(ConfigurationContext configurationContext) throws AxisFault {
        // at the moment, nothing needs to be done ..
<span class="fc" id="L43">    }</span>

//    public PolicyExtension getPolicyExtension() {
//        throw new UnsupportedOperationException(&quot;TODO&quot;);
//    }

    public void applyPolicy(Policy policy, AxisDescription axisDescription) throws AxisFault {
        //Do not do anything
<span class="nc" id="L51">    }</span>

    public boolean canSupportAssertion(Assertion assertion) {
<span class="nc bnc" id="L54" title="All 2 branches missed.">        if(assertion == null) {</span>
<span class="nc" id="L55">            return false;</span>
        }

<span class="nc" id="L58">        String ns = assertion.getName().getNamespaceURI();</span>

        // Rampart module can handle WS-SecurityPolicy 1.1 &amp; 1.2 and RampartConfig assertions 
<span class="nc bnc" id="L61" title="All 6 branches missed.">        if (SP11Constants.SP_NS.equals(ns) || SP12Constants.SP_NS.equals(ns) || RampartConfig.NS.equals(ns)) {</span>
<span class="nc" id="L62">            return true;</span>
        } else {
<span class="nc" id="L64">            return false;</span>
        }

    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.7.5.201505241946</span></div></body></html>