blob: 08c90e08f89d73019b077dfc829c6d3cdd928006 [file] [log] [blame]
// 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 integer 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.
*/
@SuppressWarnings("serial")
public abstract class IntKey<P extends Key<?>> implements Key<P>, Serializable {
/** @return id of the entity instance. */
public abstract int get();
/** @param newValue the new value of this key. */
protected abstract void set(int newValue);
/** @return the parent key instance; null if this is a root level key. */
@Override
public P getParentKey() {
return null;
}
@Override
public int hashCode() {
int hc = get();
if (getParentKey() != null) {
hc *= 31;
hc += getParentKey().hashCode();
}
return hc;
}
@Override
public boolean equals(final Object b) {
if (b == null || b.getClass() != getClass()) {
return false;
}
final IntKey<P> q = cast(b);
return get() == q.get() && KeyUtil.eq(getParentKey(), q.getParentKey());
}
@Override
public String toString() {
final StringBuffer r = new StringBuffer();
if (getParentKey() != null) {
r.append(getParentKey().toString());
r.append(',');
}
r.append(get());
return r.toString();
}
@Override
public void fromString(final String in) {
set(Integer.parseInt(KeyUtil.parseFromString(getParentKey(), in)));
}
@SuppressWarnings("unchecked")
private static <A extends Key<?>> IntKey<A> cast(final Object b) {
return (IntKey<A>) b;
}
}