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 }