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 }