package com.revolsys.gis.esri.gdb.file.capi.type;
import java.util.WeakHashMap;
import com.revolsys.datatype.DataTypes;
import com.revolsys.gis.esri.gdb.file.capi.swig.Guid;
import com.revolsys.gis.esri.gdb.file.capi.swig.Row;
import com.revolsys.record.Record;
import com.revolsys.record.io.format.esri.gdb.xml.model.Field;
import com.revolsys.util.Booleans;
public class GuidFieldDefinition extends AbstractFileGdbFieldDefinition {
private static final WeakHashMap<String, Guid> GUID_CACHE = new WeakHashMap<>();
public static void addGuid(final Guid guid) {
synchronized (GUID_CACHE) {
final String guidString = guid.toString();
if (!GUID_CACHE.containsKey(guidString)) {
GUID_CACHE.put(guidString, guid);
}
}
}
public static Guid getGuid(final String guidString) {
synchronized (GUID_CACHE) {
Guid guid = GUID_CACHE.get(guidString);
if (guid == null) {
guid = new Guid();
guid.FromString(guidString);
GUID_CACHE.put(guidString, guid);
}
return guid;
}
}
public GuidFieldDefinition(final Field field) {
this(field.getName(), field.getLength(),
Booleans.getBoolean(field.getRequired()) || !field.isIsNullable());
}
public GuidFieldDefinition(final String name, final int length, final boolean required) {
super(name, DataTypes.STRING, length, required);
}
@Override
public Object getValue(final Row row) {
final String name = getName();
if (getRecordStore().isNull(row, name)) {
return null;
} else {
synchronized (getSync()) {
final Guid guid = row.getGuid(name);
addGuid(guid);
return guid.toString();
}
}
}
@Override
public void setValue(final Record record, final Row row, final Object value) {
final String name = getName();
if (value == null) {
setNull(row);
} else {
final String guidString = value.toString();
final Guid guid = getGuid(guidString);
synchronized (getSync()) {
row.setGuid(name, guid);
}
}
}
}