<?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>SAMLAssertionHandlerFactory.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="right"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.html" class="el_package">org.apache.rampart.saml</a> &gt; <span class="el_source">SAMLAssertionHandlerFactory.java</span></div><h1>SAMLAssertionHandlerFactory.java</h1><pre class="source lang-java linenums">/*
 * Copyright (c) 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.saml;

/**
 * Creates SAML assertion handlers based on assertion type.
 */
<span class="nc" id="L22">public class SAMLAssertionHandlerFactory {</span>

    public static SAMLAssertionHandler createAssertionHandler(Object samlAssertion) {

<span class="nc bnc" id="L26" title="All 2 branches missed.">        if (samlAssertion instanceof org.opensaml.saml2.core.Assertion) {</span>
<span class="nc" id="L27">            SAMLAssertionHandler saml2AssertionHandler</span>
                    = new SAML2AssertionHandler((org.opensaml.saml2.core.Assertion) samlAssertion);

<span class="nc" id="L30">            return saml2AssertionHandler;</span>
        } else {
<span class="nc" id="L32">            SAML1AssertionHandler saml1AssertionHandler</span>
                    = new SAML1AssertionHandler((org.opensaml.saml1.core.Assertion) samlAssertion);
<span class="nc" id="L34">            return saml1AssertionHandler;</span>
        }
    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.6.1.201212231917</span></div></body></html>