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(
58 Map<String, ? extends Object> attributes) {
59 setAttributes(attributes);
60 }
61
62 /**
63 * Returns the value of user-defined attribute.
64 *
65 * @param key the key of the attribute
66 * @return <tt>null</tt> if there is no attribute with the specified key
67 */
68 public Object getAttribute(String key) {
69 return attributes.get(key);
70 }
71
72 /**
73 * Sets a user-defined attribute.
74 *
75 * @param key the key of the attribute
76 * @param value the value of the attribute
77 * @return The old value of the attribute. <tt>null</tt> if it is new.
78 */
79 public Object setAttribute(String key, Object value) {
80 if (value == null) {
81 return removeAttribute(key);
82 }
83
84 return attributes.put(key, value);
85 }
86
87 /**
88 * Sets a user defined attribute without a value. This is useful when
89 * you just want to put a 'mark' attribute. Its value is set to
90 * {@link Boolean#TRUE}.
91 *
92 * @param key the key of the attribute
93 * @return The old value of the attribute. <tt>null</tt> if it is new.
94 */
95 public Object setAttribute(String key) {
96 return attributes.put(key, Boolean.TRUE);
97 }
98
99 /**
100 * Removes a user-defined attribute with the specified key.
101 *
102 * @return The old value of the attribute. <tt>null</tt> if not found.
103 */
104 public Object removeAttribute(String key) {
105 return attributes.remove(key);
106 }
107
108 /**
109 * Returns <tt>true</tt> if this session contains the attribute with
110 * the specified <tt>key</tt>.
111 */
112 boolean containsAttribute(String key) {
113 return attributes.containsKey(key);
114 }
115
116 /**
117 * Returns the set of keys of all user-defined attributes.
118 */
119 public Set<String> getAttributeKeys() {
120 return attributes.keySet();
121 }
122
123 /**
124 * Sets the attribute map. The specified attributes are copied into the
125 * underlying map, so modifying the specified attributes parameter after
126 * the call won't change the internal state.
127 */
128 public void setAttributes(Map<String, ? extends Object> attributes) {
129 if (attributes == null) {
130 attributes = new ConcurrentHashMap<String, Object>();
131 }
132
133 this.attributes.clear();
134 this.attributes.putAll(attributes);
135 }
136
137 /**
138 * Puts all pre-configured attributes into the actual session attribute
139 * map and forward the event to the next filter.
140 */
141 @Override
142 public void sessionCreated(NextFilter nextFilter, IoSession session)
143 throws Exception {
144 for (Map.Entry<String, Object> e : attributes.entrySet()) {
145 session.setAttribute(e.getKey(), e.getValue());
146 }
147
148 nextFilter.sessionCreated(session);
149 }
150 }