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 }