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.core.session;
21
22 import java.util.Set;
23
24 /**
25 * Stores the user-defined attributes which is provided per {@link IoSession}.
26 * All user-defined attribute accesses in {@link IoSession} are forwarded to
27 * the instance of {@link IoSessionAttributeMap}.
28 *
29 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
30 */
31 public interface IoSessionAttributeMap {
32
33 /**
34 * @return the value of user defined attribute associated with the
35 * specified key. If there's no such attribute, the specified default
36 * value is associated with the specified key, and the default value is
37 * returned. This method is same with the following code except that the
38 * operation is performed atomically.
39 * <pre>
40 * if (containsAttribute(key)) {
41 * return getAttribute(key);
42 * } else {
43 * setAttribute(key, defaultValue);
44 * return defaultValue;
45 * }
46 * </pre>
47 *
48 * @param session the session for which we want to get an attribute
49 * @param key The key we are looking for
50 * @param defaultValue The default returned value if the attribute is not found
51 */
52 Object getAttribute(IoSession session, Object key, Object defaultValue);
53
54 /**
55 * Sets a user-defined attribute.
56 *
57 * @param session the session for which we want to set an attribute
58 * @param key the key of the attribute
59 * @param value the value of the attribute
60 * @return The old value of the attribute. <tt>null</tt> if it is new.
61 */
62 Object setAttribute(IoSession session, Object key, Object value);
63
64 /**
65 * Sets a user defined attribute if the attribute with the specified key
66 * is not set yet. This method is same with the following code except
67 * that the operation is performed atomically.
68 * <pre>
69 * if (containsAttribute(key)) {
70 * return getAttribute(key);
71 * } else {
72 * return setAttribute(key, value);
73 * }
74 * </pre>
75 *
76 * @param session the session for which we want to set an attribute
77 * @param key The key we are looking for
78 * @param value The value to inject
79 * @return The previous attribute
80 */
81 Object setAttributeIfAbsent(IoSession session, Object key, Object value);
82
83 /**
84 * Removes a user-defined attribute with the specified key.
85 *
86 * @return The old value of the attribute. <tt>null</tt> if not found.
87 * @param session the session for which we want to remove an attribute
88 * @param key The key we are looking for
89 */
90 Object removeAttribute(IoSession session, Object key);
91
92 /**
93 * Removes a user defined attribute with the specified key if the current
94 * attribute value is equal to the specified value. This method is same
95 * with the following code except that the operation is performed
96 * atomically.
97 * <pre>
98 * if (containsAttribute(key) && getAttribute(key).equals(value)) {
99 * removeAttribute(key);
100 * return true;
101 * } else {
102 * return false;
103 * }
104 * </pre>
105 *
106 * @param session the session for which we want to remove a value
107 * @param key The key we are looking for
108 * @param value The value to remove
109 * @return <tt>true</tt> if the value has been removed, <tt>false</tt> if the key was
110 * not found of the value not removed
111 */
112 boolean removeAttribute(IoSession session, Object key, Object value);
113
114 /**
115 * Replaces a user defined attribute with the specified key if the
116 * value of the attribute is equals to the specified old value.
117 * This method is same with the following code except that the operation
118 * is performed atomically.
119 * <pre>
120 * if (containsAttribute(key) && getAttribute(key).equals(oldValue)) {
121 * setAttribute(key, newValue);
122 * return true;
123 * } else {
124 * return false;
125 * }
126 * </pre>
127 *
128 * @param session the session for which we want to replace an attribute
129 * @param key The key we are looking for
130 * @param oldValue The old value to replace
131 * @param newValue The new value to set
132 * @return <tt>true</tt> if the value has been replaced, <tt>false</tt> if the key was
133 * not found of the value not replaced
134 */
135 boolean replaceAttribute(IoSession session, Object key, Object oldValue, Object newValue);
136
137 /**
138 * @return <tt>true</tt> if this session contains the attribute with
139 * the specified <tt>key</tt>.
140 *
141 * @param session the session for which wa want to check if an attribute is present
142 * @param key The key we are looking for
143 */
144 boolean containsAttribute(IoSession session, Object key);
145
146 /**
147 * @return the set of keys of all user-defined attributes.
148 *
149 * @param session the session for which we want the set of attributes
150 */
151 Set<Object> getAttributeKeys(IoSession session);
152
153 /**
154 * Disposes any releases associated with the specified session.
155 * This method is invoked on disconnection.
156 *
157 * @param session the session to be disposed
158 * @throws Exception If the session can't be disposed
159 */
160 void dispose(IoSession session) throws Exception;
161 }