package org.fastcatsearch.transport.vo;
import java.io.IOException;
import javax.xml.bind.JAXBException;
import org.fastcatsearch.common.io.Streamable;
import org.fastcatsearch.env.Environment;
import org.fastcatsearch.ir.config.CollectionConfig;
import org.fastcatsearch.ir.config.CollectionContext;
import org.fastcatsearch.ir.config.CollectionIndexStatus;
import org.fastcatsearch.ir.config.DataInfo;
import org.fastcatsearch.ir.config.DataSourceConfig;
import org.fastcatsearch.ir.config.IndexConfig;
import org.fastcatsearch.ir.config.IndexingScheduleConfig;
import org.fastcatsearch.ir.io.DataInput;
import org.fastcatsearch.ir.io.DataOutput;
import org.fastcatsearch.ir.settings.Schema;
import org.fastcatsearch.ir.settings.SchemaSetting;
import org.fastcatsearch.util.FilePaths;
import org.fastcatsearch.util.JAXBConfigs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StreamableCollectionContext implements Streamable {
private static Logger logger = LoggerFactory.getLogger(StreamableCollectionContext.class);
private Environment environment;
private CollectionContext collectionContext;
public StreamableCollectionContext(){
}
public StreamableCollectionContext(CollectionContext collectionContext) {
this.collectionContext = collectionContext;
}
public StreamableCollectionContext(Environment environment) {
this.environment = environment;
}
@Override
public void readFrom(DataInput input) throws IOException {
try {
String collectionId = input.readString();
SchemaSetting schemaSetting = JAXBConfigs.readFrom(input, SchemaSetting.class);
Schema schema = new Schema(schemaSetting);
CollectionConfig collectionConfig = JAXBConfigs.readFrom(input, CollectionConfig.class);
IndexConfig indexConfig = JAXBConfigs.readFrom(input, IndexConfig.class);
DataSourceConfig dataSourceConfig = JAXBConfigs.readFrom(input, DataSourceConfig.class);
CollectionIndexStatus collectionStatus = JAXBConfigs.readFrom(input, CollectionIndexStatus.class);
DataInfo dataInfo = JAXBConfigs.readFrom(input, DataInfo.class);
IndexingScheduleConfig indexingScheduleConfig = JAXBConfigs.readFrom(input, IndexingScheduleConfig.class);
//collectionFilePaths는 현 node에 적합하도록 새로 생성한다.
FilePaths collectionFilePaths = environment.filePaths().collectionFilePaths(collectionId);
this.collectionContext = new CollectionContext(collectionId, collectionFilePaths);
collectionContext.init(schema, null, collectionConfig, indexConfig, dataSourceConfig, collectionStatus, dataInfo, indexingScheduleConfig);
} catch (JAXBException e) {
throw new IOException(e);
}
}
@Override
public void writeTo(DataOutput output) throws IOException {
//collectionFilePaths 과 workSchema는 전송하지 않는다.
output.writeString(collectionContext.collectionId());
try{
JAXBConfigs.writeTo(output, collectionContext.schema().schemaSetting(), SchemaSetting.class);
JAXBConfigs.writeTo(output, collectionContext.collectionConfig(), CollectionConfig.class);
JAXBConfigs.writeTo(output, collectionContext.indexConfig(), IndexConfig.class);
JAXBConfigs.writeTo(output, collectionContext.dataSourceConfig(), DataSourceConfig.class);
JAXBConfigs.writeTo(output, collectionContext.indexStatus(), CollectionIndexStatus.class);
JAXBConfigs.writeTo(output, collectionContext.dataInfo(), DataInfo.class);
JAXBConfigs.writeTo(output, collectionContext.indexingScheduleConfig(), IndexingScheduleConfig.class);
} catch (JAXBException e) {
throw new IOException(e);
}
}
public CollectionContext collectionContext(){
return collectionContext;
}
}