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.HashMap;
23  import java.util.Map;
24  import java.util.Set;
25  import java.util.concurrent.ConcurrentHashMap;
26  
27  import org.apache.mina.core.filterchain.IoFilter;
28  import org.apache.mina.core.filterchain.IoFilterAdapter;
29  import org.apache.mina.core.session.IoSession;
30  
31  /**
32   * An {@link IoFilter} that sets initial attributes when a new
33   * {@link IoSession} is created.  By default, the attribute map is empty when
34   * an {@link IoSession} is newly created.  Inserting this filter will make
35   * the pre-configured attributes available after this filter executes the
36   * <tt>sessionCreated</tt> event.
37   *
38   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
39   * @org.apache.xbean.XBean
40   */
41  public class SessionAttributeInitializingFilter extends IoFilterAdapter {
42      private final Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();
43  
44      /**
45       * Creates a new instance with no default attributes.  You can set
46       * the additional attributes by calling methods such as
47       * {@link #setAttribute(String, Object)} and {@link #setAttributes(Map)}.
48       */
49      public SessionAttributeInitializingFilter() {
50          // Do nothing
51      }
52  
53      /**
54       * Creates a new instance with the specified default attributes.  You can
55       * set the additional attributes by calling methods such as
56       * {@link #setAttribute(String, Object)} and {@link #setAttributes(Map)}.
57       */
58      public SessionAttributeInitializingFilter(
59              Map<String, ? extends Object> attributes) {
60          setAttributes(attributes);
61      }
62  
63      /**
64       * Returns the value of user-defined attribute.
65       *
66       * @param key the key of the attribute
67       * @return <tt>null</tt> if there is no attribute with the specified key
68       */
69      public Object getAttribute(String key) {
70          return attributes.get(key);
71      }
72  
73      /**
74       * Sets a user-defined attribute.
75       *
76       * @param key the key of the attribute
77       * @param value the value of the attribute
78       * @return The old value of the attribute.  <tt>null</tt> if it is new.
79       */
80      public Object setAttribute(String key, Object value) {
81          if (value == null) {
82              return removeAttribute(key);
83          }
84  
85          return attributes.put(key, value);
86      }
87  
88      /**
89       * Sets a user defined attribute without a value.  This is useful when
90       * you just want to put a 'mark' attribute.  Its value is set to
91       * {@link Boolean#TRUE}.
92       *
93       * @param key the key of the attribute
94       * @return The old value of the attribute.  <tt>null</tt> if it is new.
95       */
96      public Object setAttribute(String key) {
97          return attributes.put(key, Boolean.TRUE);
98      }
99  
100     /**
101      * Removes a user-defined attribute with the specified key.
102      *
103      * @return The old value of the attribute.  <tt>null</tt> if not found.
104      */
105     public Object removeAttribute(String key) {
106         return attributes.remove(key);
107     }
108 
109     /**
110      * Returns <tt>true</tt> if this session contains the attribute with
111      * the specified <tt>key</tt>.
112      */
113     boolean containsAttribute(String key) {
114         return attributes.containsKey(key);
115     }
116 
117     /**
118      * Returns the set of keys of all user-defined attributes.
119      */
120     public Set<String> getAttributeKeys() {
121         return attributes.keySet();
122     }
123 
124     /**
125      * Sets the attribute map.  The specified attributes are copied into the
126      * underlying map, so modifying the specified attributes parameter after
127      * the call won't change the internal state.
128      */
129     public void setAttributes(Map<String, ? extends Object> attributes) {
130         if (attributes == null) {
131             attributes = new HashMap<String, Object>();
132         }
133 
134         this.attributes.clear();
135         this.attributes.putAll(attributes);
136     }
137 
138     /**
139      * Puts all pre-configured attributes into the actual session attribute
140      * map and forward the event to the next filter.
141      */
142     @Override
143     public void sessionCreated(NextFilter nextFilter, IoSession session)
144             throws Exception {
145         for (Map.Entry<String, Object> e : attributes.entrySet()) {
146             session.setAttribute(e.getKey(), e.getValue());
147         }
148 
149         nextFilter.sessionCreated(session);
150     }
151 }