package com.revolsys.gis.esri.gdb.file.capi;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.JComponent;
import com.revolsys.gis.esri.gdb.file.FileGdbRecordStore;
import com.revolsys.identifier.Identifier;
import com.revolsys.logging.Logs;
import com.revolsys.record.code.CodeTable;
import com.revolsys.record.io.format.esri.gdb.xml.model.Domain;
import com.revolsys.util.CompareUtil;
public class FileGdbDomainCodeTable implements CodeTable {
private final Domain domain;
private final String name;
private final FileGdbRecordStore recordStore;
private JComponent swingEditor;
public FileGdbDomainCodeTable(final FileGdbRecordStore recordStore, final Domain domain) {
this.recordStore = recordStore;
this.domain = domain;
this.name = domain.getDomainName();
}
@Override
public FileGdbDomainCodeTable clone() {
try {
return (FileGdbDomainCodeTable)super.clone();
} catch (final CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
@Override
public int compare(final Object value1, final Object value2) {
if (value1 == null) {
if (value2 == null) {
return 0;
} else {
return 1;
}
} else if (value2 == null) {
return -1;
} else {
final Object codeValue1 = getValue(Identifier.newIdentifier(value1));
final Object codeValue2 = getValue(Identifier.newIdentifier(value2));
return CompareUtil.compare(codeValue1, codeValue2);
}
}
@Override
public Map<Identifier, List<Object>> getCodes() {
return this.domain.getCodes();
}
public Domain getDomain() {
return this.domain;
}
@Override
public List<String> getFieldNameAliases() {
return this.domain.getFieldNameAliases();
}
@Override
public Identifier getIdentifier(final List<Object> values, final boolean loadMissing) {
final Identifier id = this.domain.getIdentifier(values, loadMissing);
if (id == null) {
return newIdentifier((String)values.get(0));
}
return id;
}
@Override
public Identifier getIdentifier(final Map<String, ? extends Object> values) {
final Identifier id = this.domain.getIdentifier(values);
if (id == null) {
return newIdentifier(this.domain.getName(values));
}
return id;
}
@Override
public List<Identifier> getIdentifiers() {
return new ArrayList<>(getCodes().keySet());
}
@Override
public String getIdFieldName() {
return this.domain.getIdFieldName();
}
@Override
public Map<String, ? extends Object> getMap(final Identifier id) {
return this.domain.getMap(id);
}
@Override
public String getName() {
return this.name;
}
@Override
public JComponent getSwingEditor() {
return this.swingEditor;
}
@Override
@SuppressWarnings("unchecked")
public <V> V getValue(final Identifier id) {
return (V)this.domain.getValue(id);
}
@Override
public <V> V getValue(final Object id) {
return getValue(Identifier.newIdentifier(id));
}
@Override
public List<String> getValueFieldNames() {
return this.domain.getValueFieldNames();
}
@Override
public List<Object> getValues(final Identifier id) {
return this.domain.getValues(id);
}
@Override
public boolean isEmpty() {
return this.domain.isEmpty();
}
@Override
public boolean isLoaded() {
return true;
}
@Override
public boolean isLoading() {
return false;
}
private Identifier newIdentifier(final String name) {
synchronized (this.recordStore) {
final Identifier id = this.domain.newCodedValue(name);
this.recordStore.alterDomain(this.domain);
Logs.info(this, this.domain.getDomainName() + " created code " + id + "=" + name);
return id;
}
}
@Override
public void refresh() {
}
public void setSwingEditor(final JComponent swingEditor) {
this.swingEditor = swingEditor;
}
@Override
public String toString() {
return this.domain.toString();
}
}