<?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>BeanEvent.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 :: Test Coverage</a> &gt; <a href="../index.html" class="el_bundle">shiro-config-ogdl</a> &gt; <a href="index.source.html" class="el_package">org.apache.shiro.config.event</a> &gt; <span class="el_source">BeanEvent.java</span></div><h1>BeanEvent.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.config.event;

import org.apache.shiro.event.Event;

import java.util.Map;

/**
 * @since 1.3
 */
public abstract class BeanEvent extends Event {

    private String beanName;
    private Object bean;
    private final Map&lt;String, Object&gt; beanContext;

    public BeanEvent(final String beanName, final Object bean, final Map&lt;String, Object&gt; beanContext) {
<span class="fc" id="L35">        super(bean);</span>
<span class="fc" id="L36">        this.beanName = beanName;</span>
<span class="fc" id="L37">        this.bean = bean;</span>
<span class="fc" id="L38">        this.beanContext = beanContext;</span>
<span class="fc" id="L39">    }</span>

    public String getBeanName() {
<span class="fc" id="L42">        return beanName;</span>
    }

    public Object getBean() {
<span class="fc" id="L46">        return bean;</span>
    }

    public Map&lt;String, Object&gt; getBeanContext() {
<span class="fc" id="L50">        return beanContext;</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>