package io.pcp.parfait.dxm;
import io.pcp.parfait.dxm.PcpMmvWriter.Store;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.Set;
class InstanceDomain implements PcpId, PcpOffset, MmvWritable {
private static final int INSTANCE_DOMAIN_LENGTH = 32;
private final String name;
private final int id;
private int offset;
private final Store<Instance> instanceStore;
private PcpString shortHelpText;
private PcpString longHelpText;
InstanceDomain(String name, int id, InstanceStoreFactory instanceStoreFactory) {
this.name = name;
this.id = id;
this.instanceStore = instanceStoreFactory.createNewInstanceStore(name, this);
}
Instance getInstance(String name) {
return instanceStore.byName(name);
}
@Override
public String toString() {
return name + " (" + id + ") " + instanceStore.all().toString();
}
public int getId() {
return id;
}
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
@Override
public int byteSize() {
return INSTANCE_DOMAIN_LENGTH;
}
private int getInstanceCount() {
return instanceStore.size();
}
private int getFirstInstanceOffset() {
return instanceStore.all().iterator().next().getOffset();
}
Collection<Instance> getInstances() {
return instanceStore.all();
}
void setHelpText(PcpString shortHelpText, PcpString longHelpText) {
this.shortHelpText = shortHelpText;
this.longHelpText = longHelpText;
}
@Override
public void writeToMmv(ByteBuffer byteBuffer) {
byteBuffer.position(offset);
writeInstanceDomainSection(byteBuffer);
for (Instance instance : getInstances()) {
instance.writeToMmv(byteBuffer);
}
}
private void writeInstanceDomainSection(ByteBuffer dataFileBuffer) {
dataFileBuffer.putInt(id);
dataFileBuffer.putInt(getInstanceCount());
dataFileBuffer.putLong(getFirstInstanceOffset());
dataFileBuffer.putLong(getStringOffset(shortHelpText));
dataFileBuffer.putLong(getStringOffset(longHelpText));
}
private long getStringOffset(PcpString text) {
if (text == null) {
return 0;
}
return text.getOffset();
}
static final class InstanceDomainStore extends Store<InstanceDomain> {
private InstanceStoreFactory instanceStoreFactory;
InstanceDomainStore(IdentifierSourceSet identifierSources, InstanceStoreFactory instanceStoreFactory) {
super(identifierSources.instanceDomainSource());
this.instanceStoreFactory = instanceStoreFactory;
}
@Override
protected InstanceDomain newInstance(String name, Set<Integer> usedIds) {
return new InstanceDomain(name, identifierSource.calculateId(name, usedIds), instanceStoreFactory);
}
}
}