/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002,2008 Oracle. All rights reserved.
*
* $Id: FieldInfo.java,v 1.1 2008/02/07 17:12:27 mark Exp $
*/
package com.sleepycat.persist.impl;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.sleepycat.persist.raw.RawField;
/**
* A field definition used by ComplexFormat and CompositeKeyFormat.
*
*
Note that the equals(), compareTo() and hashCode() methods only use the
* name field in this class. Comparing two FieldInfo objects is only done when
* both are declared in the same class, so comparing the field name is
* sufficient.
*
* @author Mark Hayes
*/
class FieldInfo implements RawField, Serializable, Comparable {
private static final long serialVersionUID = 2062721100372306296L;
/**
* Returns a list of all non-transient non-static fields that are declared
* in the given class.
*/
static List getInstanceFields(Class cls) {
Field[] declaredFields = cls.getDeclaredFields();
List fields =
new ArrayList(declaredFields.length);
for (Field field : declaredFields) {
int mods = field.getModifiers();
if (!Modifier.isTransient(mods) && !Modifier.isStatic(mods)) {
fields.add(new FieldInfo(field));
}
}
return fields;
}
static FieldInfo getField(List fields, String fieldName) {
int i = getFieldIndex(fields, fieldName);
if (i >= 0) {
return fields.get(i);
} else {
return null;
}
}
static int getFieldIndex(List fields, String fieldName) {
for (int i = 0; i < fields.size(); i += 1) {
FieldInfo field = fields.get(i);
if (fieldName.equals(field.getName())) {
return i;
}
}
return -1;
}
private String name;
private String className;
private Format format;
private transient Class cls;
private FieldInfo(Field field) {
name = field.getName();
cls = field.getType();
className = cls.getName();
}
void collectRelatedFormats(Catalog catalog,
Map newFormats) {
format = catalog.createFormat(cls, newFormats);
}
void migrateFromBeta(Map formatMap) {
if (format == null) {
format = formatMap.get(className);
if (format == null) {
throw new IllegalStateException(className);
}
}
}
void initialize(Catalog catalog, int initVersion) {
}
Class getFieldClass() {
if (cls == null) {
try {
cls = SimpleCatalog.classForName(className);
} catch (ClassNotFoundException e) {
throw new IllegalStateException(e);
}
}
return cls;
}
String getClassName() {
return className;
}
public String getName() {
return name;
}
public Format getType() {
return format;
}
public int compareTo(FieldInfo o) {
return name.compareTo(o.name);
}
@Override
public boolean equals(Object other) {
if (other instanceof FieldInfo) {
FieldInfo o = (FieldInfo) other;
return name.equals(o.name);
} else {
return false;
}
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public String toString() {
return "[Field name: " + name + " class: " + className + ']';
}
}