View Javadoc

    1   /*
    2    *  Licensed to the Apache Software Foundation (ASF) under one
    3    *  or more contributor license agreements.  See the NOTICE file
    4    *  distributed with this work for additional information
    5    *  regarding copyright ownership.  The ASF licenses this file
    6    *  to you under the Apache License, Version 2.0 (the
    7    *  "License"); you may not use this file except in compliance
    8    *  with the License.  You may obtain a copy of the License at
    9    *
    10   *    http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   *  Unless required by applicable law or agreed to in writing,
    13   *  software distributed under the License is distributed on an
    14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    15   *  KIND, either express or implied.  See the License for the
    16   *  specific language governing permissions and limitations
    17   *  under the License.
    18   *
    19   */
    20  package org.apache.mina.filter.util;
    21
    22  import java.util.Map;
    23  import java.util.Set;
    24  import java.util.concurrent.ConcurrentHashMap;
    25
    26  import org.apache.mina.core.filterchain.IoFilter;
    27  import org.apache.mina.core.filterchain.IoFilterAdapter;
    28  import org.apache.mina.core.session.IoSession;
    29
    30  /**
    31   * An {@link IoFilter} that sets initial attributes when a new
    32   * {@link IoSession} is created.  By default, the attribute map is empty when
    33   * an {@link IoSession} is newly created.  Inserting this filter will make
    34   * the pre-configured attributes available after this filter executes the
    35   * <tt>sessionCreated</tt> event.
    36   *
    37   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
    38   * @org.apache.xbean.XBean
    39   */
    40  public class SessionAttributeInitializingFilter extends IoFilterAdapter {
    41      private final Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();
    42
    43      /**
    44       * Creates a new instance with no default attributes.  You can set
    45       * the additional attributes by calling methods such as
    46       * {@link #setAttribute(String, Object)} and {@link #setAttributes(Map)}.
    47       */
    48      public SessionAttributeInitializingFilter() {
    49          // Do nothing
    50      }
    51
    52      /**
    53       * Creates a new instance with the specified default attributes.  You can
    54       * set the additional attributes by calling methods such as
    55       * {@link #setAttribute(String, Object)} and {@link #setAttributes(Map)}.
    56       */
    57      public SessionAttributeInitializingFilter(Map<String, ? extends Object> attributes) {
    58          setAttributes(attributes);
    59      }
    60
    61      /**
    62       * Returns the value of user-defined attribute.
    63       *
    64       * @param key the key of the attribute
    65       * @return <tt>null</tt> if there is no attribute with the specified key
    66       */
    67      public Object getAttribute(String key) {
    68          return attributes.get(key);
    69      }
    70
    71      /**
    72       * Sets a user-defined attribute.
    73       *
    74       * @param key the key of the attribute
    75       * @param value the value of the attribute
    76       * @return The old value of the attribute.  <tt>null</tt> if it is new.
    77       */
    78      public Object setAttribute(String key, Object value) {
    79          if (value == null) {
    80              return removeAttribute(key);
    81          }
    82
    83          return attributes.put(key, value);
    84      }
    85
    86      /**
    87       * Sets a user defined attribute without a value.  This is useful when
    88       * you just want to put a 'mark' attribute.  Its value is set to
    89       * {@link Boolean#TRUE}.
    90       *
    91       * @param key the key of the attribute
    92       * @return The old value of the attribute.  <tt>null</tt> if it is new.
    93       */
    94      public Object setAttribute(String key) {
    95          return attributes.put(key, Boolean.TRUE);
    96      }
    97
    98      /**
    99       * Removes a user-defined attribute with the specified key.
    100      *
    101      * @return The old value of the attribute.  <tt>null</tt> if not found.
    102      */
    103     public Object removeAttribute(String key) {
    104         return attributes.remove(key);
    105     }
    106
    107     /**
    108      * Returns <tt>true</tt> if this session contains the attribute with
    109      * the specified <tt>key</tt>.
    110      */
    111     boolean containsAttribute(String key) {
    112         return attributes.containsKey(key);
    113     }
    114
    115     /**
    116      * Returns the set of keys of all user-defined attributes.
    117      */
    118     public Set<String> getAttributeKeys() {
    119         return attributes.keySet();
    120     }
    121
    122     /**
    123      * Sets the attribute map.  The specified attributes are copied into the
    124      * underlying map, so modifying the specified attributes parameter after
    125      * the call won't change the internal state.
    126      */
    127     public void setAttributes(Map<String, ? extends Object> attributes) {
    128         if (attributes == null) {
    129             attributes = new ConcurrentHashMap<String, Object>();
    130         }
    131
    132         this.attributes.clear();
    133         this.attributes.putAll(attributes);
    134     }
    135
    136     /**
    137      * Puts all pre-configured attributes into the actual session attribute
    138      * map and forward the event to the next filter.
    139      */
    140     @Override
    141     public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {
    142         for (Map.Entry<String, Object> e : attributes.entrySet()) {
    143             session.setAttribute(e.getKey(), e.getValue());
    144         }
    145
    146         nextFilter.sessionCreated(session);
    147     }
    148 }