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.session;
21  
22  import static org.apache.mina.util.Assert.assertNotNull;
23  
24  import org.apache.mina.api.IoSession;
25  
26  /**
27   * Represents the Key for an attribute-value of an {@link IoSession}. A key
28   * consists of the Type of the referenced attribute value and a name.<br>
29   * <br>
30   * Two {@link AttributeKey}'s are equal if the have the same attribute-type and
31   * attribute-name.
32   * 
33   * @param <T> Type of the attribute-value this key is referring to
34   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
35   */
36  public final class AttributeKey<T> {
37      /** the {@link Class} of the referenced attribute-value */
38      private final Class<T> attributeType;
39  
40      /** the name of this key */
41      private final String attributeName;
42  
43      /** the cached hash code of this instance */
44      private final int hashCode;
45  
46      /**
47       * Creates a new {@link AttributeKey} with the given parameters. A
48       * {@link IllegalArgumentException} will be thrown if any parameter is
49       * <code>null</code>.
50       * 
51       * @param attributeType
52       *            type of the referenced attribute-value, must not be
53       *            <code>null</code>
54       * @param attributeName
55       *            name of this key, must not be <code>null</code>
56       * @exception IllegalArgumentException
57       *                if any parameter is <code>null</code>
58       * @see #createKey(Class, String)
59       */
60      public AttributeKey(Class<T> attributeType, String attributeName) {
61          this.attributeType = assertNotNull(attributeType, "attributeType");
62          this.attributeName = assertNotNull(attributeName, "attributeName");
63  
64          this.hashCode = createHashCode();
65      }
66  
67      /**
68       * Creates a new {@link AttributeKey} with the given parameters. A
69       * {@link IllegalArgumentException} will be thrown if any parameter is
70       * <code>null</code>. <br>
71       * This call is equal to {@link AttributeKey#AttributeKey(Class, String)}
72       * 
73       * @param attributeType
74       *            type of the referenced attribute-value, must not be
75       *            <code>null</code>
76       * @param attributeName
77       *            name of this key, must not be <code>null</code>
78       * @exception IllegalArgumentException
79       *                if any parameter is <code>null</code>
80       * @see #AttributeKey(Class, String)
81       */
82      public static <T> AttributeKey<T> createKey(Class<T> attributeType, String attributeName) {
83          return new AttributeKey<T>(attributeType, attributeName);
84      }
85  
86      /**
87       * Creates the hash code for this instance
88       * 
89       * @return
90       */
91      private int createHashCode() {
92          final int prime = 31;
93          int result = prime + attributeName.hashCode();
94          result = prime * result + attributeType.hashCode();
95  
96          return result;
97      }
98  
99      /**
100      * Returns the name of this key.
101      * 
102      * @return name of this key, never <code>null</code>
103      */
104     public String getName() {
105         return attributeName;
106     }
107 
108     /**
109      * Returns the type of this key.
110      * 
111      * @return type of this key, never <code>null</code>
112      */
113     public Class<T> getType() {
114         return attributeType;
115     }
116 
117     @Override
118     public int hashCode() {
119         return hashCode;
120     }
121 
122     @Override
123     public boolean equals(Object obj) {
124         if (this == obj) {
125             return true;
126         }
127 
128         if (obj == null) {
129             return false;
130         }
131 
132         if (getClass() != obj.getClass()) {
133             return false;
134         }
135 
136         AttributeKey<?> other = (AttributeKey<?>) obj;
137 
138         return hashCode == other.hashCode;
139     }
140 }