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 }