<?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="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>JndiObjectFactory.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Apache Shiro :: Core</a> &gt; <a href="index.source.html" class="el_package">org.apache.shiro.jndi</a> &gt; <span class="el_source">JndiObjectFactory.java</span></div><h1>JndiObjectFactory.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.shiro.jndi;

import org.apache.shiro.util.Factory;

import javax.naming.NamingException;

/**
 * A factory implementation intended to be used to look up objects in jndi.
 * @param &lt;T&gt;
 * @since 1.2
 */
<span class="fc" id="L30">public class JndiObjectFactory&lt;T&gt; extends JndiLocator implements Factory&lt;T&gt; {</span>

    private String resourceName;
    private Class&lt;? extends T&gt; requiredType;

    public T getInstance() {
        try {
<span class="fc bfc" id="L37" title="All 2 branches covered.">            if(requiredType != null) {</span>
<span class="fc" id="L38">                return requiredType.cast(this.lookup(resourceName, requiredType));</span>
            } else {
<span class="fc" id="L40">                return (T) this.lookup(resourceName);</span>
            }
<span class="fc" id="L42">        } catch (NamingException e) {</span>
<span class="fc bfc" id="L43" title="All 2 branches covered.">            final String typeName = requiredType != null ? requiredType.getName() : &quot;object&quot;;</span>
<span class="fc" id="L44">            throw new IllegalStateException(&quot;Unable to look up &quot; + typeName + &quot; with jndi name '&quot; + resourceName + &quot;'.&quot;, e);</span>
        }
    }

    public String getResourceName() {
<span class="nc" id="L49">        return resourceName;</span>
    }

    public void setResourceName(String resourceName) {
<span class="fc" id="L53">        this.resourceName = resourceName;</span>
<span class="fc" id="L54">    }</span>

    public Class&lt;? extends T&gt; getRequiredType() {
<span class="nc" id="L57">        return requiredType;</span>
    }

    public void setRequiredType(Class&lt;? extends T&gt; requiredType) {
<span class="fc" id="L61">        this.requiredType = requiredType;</span>
<span class="fc" id="L62">    }</span>
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.7.7.201606060606</span></div></body></html>