<?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>ShiroAopModule.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.aop</a> &gt; <span class="el_source">ShiroAopModule.java</span></div><h1>ShiroAopModule.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.aop;

import com.google.inject.AbstractModule;
import com.google.inject.matcher.AbstractMatcher;
import com.google.inject.matcher.Matchers;
import org.apache.shiro.aop.AnnotationMethodInterceptor;
import org.apache.shiro.aop.AnnotationResolver;
import org.apache.shiro.aop.DefaultAnnotationResolver;
import org.apache.shiro.authz.aop.*;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * Install this module to enable Shiro AOP functionality in Guice.  You may extend it to add your own Shiro
 * interceptors, override the default ones, or provide a specific {@link org.apache.shiro.aop.AnnotationResolver}.
 */
<span class="fc" id="L36">public class ShiroAopModule extends AbstractModule {</span>
    @Override
    protected final void configure() {
<span class="fc" id="L39">        AnnotationResolver resolver = createAnnotationResolver();</span>
<span class="fc" id="L40">        configureDefaultInterceptors(resolver);</span>
<span class="fc" id="L41">        configureInterceptors(resolver);</span>
<span class="fc" id="L42">    }</span>

    protected final void bindShiroInterceptor(final AnnotationMethodInterceptor methodInterceptor) {
<span class="fc" id="L45">        bindInterceptor(Matchers.any(), new AbstractMatcher&lt;Method&gt;() {</span>
            public boolean matches(Method method) {
<span class="fc" id="L47">                Class&lt;? extends Annotation&gt; annotation = methodInterceptor.getHandler().getAnnotationClass();</span>
<span class="fc bfc" id="L48" title="All 2 branches covered.">                return method.getAnnotation(annotation) != null</span>
<span class="pc bpc" id="L49" title="1 of 2 branches missed.">                        || method.getDeclaringClass().getAnnotation(annotation) != null;</span>
            }
        }, new AopAllianceMethodInterceptorAdapter(methodInterceptor));
<span class="fc" id="L52">    }</span>

    protected AnnotationResolver createAnnotationResolver() {
<span class="fc" id="L55">        return new DefaultAnnotationResolver();</span>
    }

    protected void configureDefaultInterceptors(AnnotationResolver resolver) {
<span class="fc" id="L59">        bindShiroInterceptor(new RoleAnnotationMethodInterceptor(resolver));</span>
<span class="fc" id="L60">        bindShiroInterceptor(new PermissionAnnotationMethodInterceptor(resolver));</span>
<span class="fc" id="L61">        bindShiroInterceptor(new AuthenticatedAnnotationMethodInterceptor(resolver));</span>
<span class="fc" id="L62">        bindShiroInterceptor(new UserAnnotationMethodInterceptor(resolver));</span>
<span class="fc" id="L63">        bindShiroInterceptor(new GuestAnnotationMethodInterceptor(resolver));</span>
<span class="fc" id="L64">    }</span>

    protected void configureInterceptors(AnnotationResolver resolver) {

<span class="nc" id="L68">    }</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>