// Copyright 2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gwtorm.client;

import java.io.Serializable;

/**
 * Abstract key type using a single string value.
 * <p>
 * Applications should subclass this type to create their own entity-specific
 * key classes.
 * 
 * @param <P> the parent key type. Use {@link Key} if no parent key is needed.
 */
public abstract class StringKey<P extends Key<?>> implements Key<P>,
    Serializable {
  /**
   * @return name of the entity instance.
   */
  public abstract String get();

  /**
   * @return the parent key instance; null if this is a root level key.
   */
  public P getParentKey() {
    return null;
  }

  @Override
  public int hashCode() {
    int hc = get() != null ? get().hashCode() : 0;
    if (getParentKey() != null) {
      hc *= 31;
      hc += getParentKey().hashCode();
    }
    return hc;
  }

  @Override
  public boolean equals(final Object b) {
    if (b == null || get() == null || b.getClass() != getClass()) {
      return false;
    }

    final StringKey<P> q = cast(b);
    if (get().equals(q.get())) {
      if (getParentKey() != null) {
        return getParentKey().equals(q.getParentKey());
      }
      return true;
    }

    return false;
  }

  @Override
  public String toString() {
    final StringBuffer r = new StringBuffer();
    r.append(getClass().getName());
    r.append('[');
    if (getParentKey() != null) {
      r.append(getParentKey().toString());
      r.append(", ");
    }
    r.append(get());
    r.append(']');
    return r.toString();
  }

  @SuppressWarnings("unchecked")
  private static <A extends Key<?>> StringKey<A> cast(final Object b) {
    return (StringKey<A>) b;
  }
}
