<?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>Rahas.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.rahas</a> &gt; <span class="el_source">Rahas.java</span></div><h1>Rahas.java</h1><pre class="source lang-java linenums">/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.rahas;

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.opensaml.xml.ConfigurationException;

<span class="fc" id="L30">public class Rahas implements Module {</span>

    public void init(ConfigurationContext configContext, AxisModule module)
            throws AxisFault {
        // Set up OpenSAML to use a DOM aware Axiom implementation
        // Axiom Parser pool is also set within the RampartSAMLBootstrap class.

        try {
<span class="fc" id="L38">            RampartSAMLBootstrap.bootstrap();</span>

            // Initialize XML security
<span class="fc" id="L41">            org.apache.xml.security.Init.init();</span>
<span class="nc" id="L42">        } catch (ConfigurationException ex) {</span>
<span class="nc" id="L43">            throw new AxisFault(&quot;Failed to bootstrap OpenSAML&quot;, ex);</span>
<span class="fc" id="L44">        }</span>
<span class="fc" id="L45">    }</span>

    public void engageNotify(AxisDescription axisDescription) throws AxisFault {
<span class="fc" id="L48">    }</span>

    public boolean canSupportAssertion(Assertion assertion) {
<span class="nc" id="L51">        return false;</span>
    }

    public void applyPolicy(Policy policy, AxisDescription axisDescription)
            throws AxisFault {
<span class="nc" id="L56">    }</span>

    public void shutdown(ConfigurationContext configurationContext)
            throws AxisFault {
<span class="fc" id="L60">    }</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>