package com.revolsys.record;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.revolsys.record.schema.FieldDefinition;
import com.revolsys.record.schema.RecordDefinition;
public abstract class AbstractRecord implements Record, Cloneable {
@Override
public Record clone() {
try {
final AbstractRecord record = (AbstractRecord)super.clone();
record.setState(RecordState.NEW);
return record;
} catch (final CloneNotSupportedException e) {
throw new RuntimeException("Unable to clone", e);
}
}
@Override
public boolean equals(final Object o) {
return this == o;
}
@Override
public int hashCode() {
return System.identityHashCode(this);
}
protected void initValues(final Map<String, ? extends Object> record) {
if (record != null) {
final List<FieldDefinition> fields = getFieldDefinitions();
for (final FieldDefinition fieldDefintion : fields) {
final String name = fieldDefintion.getName();
final Object value = record.get(name);
fieldDefintion.setValue(this, value);
}
}
}
protected abstract boolean setValue(FieldDefinition fieldDefinition, Object value);
@Override
public final boolean setValue(final int fieldIndex, final Object value) {
final FieldDefinition fieldDefinition = getFieldDefinition(fieldIndex);
if (fieldDefinition == null) {
return false;
} else {
return setValue(fieldDefinition, value);
}
}
@Override
public void setValues(final Iterable<? extends Object> values) {
if (values != null) {
final Iterator<? extends Object> iterator = values.iterator();
final RecordDefinition recordDefinition = getRecordDefinition();
for (final FieldDefinition fieldDefinition : recordDefinition.getFields()) {
if (iterator.hasNext()) {
final Object value = iterator.next();
setValue(fieldDefinition, value);
} else {
return;
}
}
}
}
@Override
public void setValues(final Object... values) {
if (values != null) {
int i = 0;
final RecordDefinition recordDefinition = getRecordDefinition();
for (final FieldDefinition fieldDefinition : recordDefinition.getFields()) {
if (i < values.length) {
final Object value = values[i];
setValue(fieldDefinition, value);
i++;
} else {
return;
}
}
}
}
/**
* Return a String representation of the record. There is no guarantee as to
* the format of this string.
*
* @return The string value.
*/
@Override
public String toString() {
final Record record = this;
return Record.toString(record);
}
@SuppressWarnings("incomplete-switch")
protected void updateState() {
switch (getState()) {
case PERSISTED:
setState(RecordState.MODIFIED);
break;
case DELETED:
throw new IllegalStateException("Cannot modify an object which has been deleted");
}
}
}