<?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>AbstractInjectionProvider.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 :: Support :: Guice</a> &gt; <a href="index.source.html" class="el_package">org.apache.shiro.guice.web</a> &gt; <span class="el_source">AbstractInjectionProvider.java</span></div><h1>AbstractInjectionProvider.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.guice.web;

import java.lang.reflect.Constructor;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.ProvisionException;
import com.google.inject.spi.Dependency;
import com.google.inject.spi.InjectionPoint;
import com.google.inject.spi.ProviderWithDependencies;

class AbstractInjectionProvider&lt;T&gt; implements ProviderWithDependencies&lt;T&gt; {
    private Key&lt;T&gt; key;

    @Inject
    Injector injector;

    private InjectionPoint constructorInjectionPoint;
    private Set&lt;Dependency&lt;?&gt;&gt; dependencies;

<span class="fc" id="L43">    public AbstractInjectionProvider(Key&lt;T&gt; key) {</span>
<span class="fc" id="L44">        this.key = key;</span>
<span class="fc" id="L45">        constructorInjectionPoint = InjectionPoint.forConstructorOf(key.getTypeLiteral());</span>

<span class="fc" id="L47">        Set&lt;Dependency&lt;?&gt;&gt; dependencyBuilder = new HashSet&lt;Dependency&lt;?&gt;&gt;();</span>
<span class="fc" id="L48">        dependencyBuilder.addAll(constructorInjectionPoint.getDependencies());</span>
<span class="fc bfc" id="L49" title="All 2 branches covered.">        for (InjectionPoint injectionPoint : InjectionPoint.forInstanceMethodsAndFields(key.getTypeLiteral())) {</span>
<span class="fc" id="L50">            dependencyBuilder.addAll(injectionPoint.getDependencies());</span>
<span class="fc" id="L51">        }</span>
<span class="fc" id="L52">        this.dependencies = Collections.unmodifiableSet(dependencyBuilder);</span>
<span class="fc" id="L53">    }</span>

    public T get() {
<span class="fc" id="L56">        Constructor&lt;T&gt; constructor = getConstructor();</span>
<span class="fc" id="L57">        Object[] params = new Object[constructor.getParameterTypes().length];</span>
<span class="fc bfc" id="L58" title="All 2 branches covered.">        for (Dependency&lt;?&gt; dependency : constructorInjectionPoint.getDependencies()) {</span>
<span class="fc" id="L59">            params[dependency.getParameterIndex()] = injector.getInstance(dependency.getKey());</span>
<span class="fc" id="L60">        }</span>
        T t;
        try {
<span class="fc" id="L63">            t = constructor.newInstance(params);</span>
<span class="nc" id="L64">        } catch (Exception e) {</span>
<span class="nc" id="L65">            throw new ProvisionException(&quot;Could not instantiate &quot; + key + &quot;&quot;, e);</span>
<span class="fc" id="L66">        }</span>
<span class="fc" id="L67">        injector.injectMembers(t);</span>
<span class="fc" id="L68">        return postProcess(t);</span>
    }

    @SuppressWarnings({&quot;unchecked&quot;})
    private Constructor&lt;T&gt; getConstructor() {
<span class="fc" id="L73">        return (Constructor&lt;T&gt;) constructorInjectionPoint.getMember();</span>
    }

    protected T postProcess(T t) {
        // do nothing by default
<span class="fc" id="L78">        return t;</span>
    }

    public Set&lt;Dependency&lt;?&gt;&gt; getDependencies() {
<span class="fc" id="L82">        return dependencies;</span>
    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.3.201901230119</span></div></body></html>