package org.fastcatsearch.util;
import java.io.File;
import java.util.ArrayList;
import javax.xml.bind.JAXBException;
import org.fastcatsearch.env.Path;
import org.fastcatsearch.ir.common.SettingException;
import org.fastcatsearch.ir.config.CollectionConfig;
import org.fastcatsearch.ir.config.CollectionContext;
import org.fastcatsearch.ir.config.CollectionIndexStatus;
import org.fastcatsearch.ir.config.CollectionsConfig.Collection;
import org.fastcatsearch.ir.config.DataInfo;
import org.fastcatsearch.ir.config.DataInfo.RevisionInfo;
import org.fastcatsearch.ir.config.DataInfo.SegmentInfo;
import org.fastcatsearch.ir.config.DataSourceConfig;
import org.fastcatsearch.ir.config.IndexConfig;
import org.fastcatsearch.ir.config.IndexingScheduleConfig;
import org.fastcatsearch.ir.config.IndexingScheduleConfig.IndexingSchedule;
import org.fastcatsearch.ir.config.SingleSourceConfig;
import org.fastcatsearch.ir.settings.Schema;
import org.fastcatsearch.ir.settings.SchemaSetting;
import org.fastcatsearch.settings.SettingFileNames;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CollectionContextUtil {
private static final Logger logger = LoggerFactory.getLogger(CollectionContextUtil.class);
public static CollectionContext create(CollectionConfig collectionConfig, FilePaths collectionFilePaths) throws SettingException {
try {
Path collectionDir = new Path(collectionFilePaths.file());
//collection config.xml
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.collectionConfig), collectionConfig, CollectionConfig.class);
//schema.xml
SchemaSetting schemaSetting = new SchemaSetting();
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.schema), schemaSetting, SchemaSetting.class);
//default index-config.xml
IndexConfig indexConfig = IndexConfig.defaultConfig;
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.indexConfig), IndexConfig.defaultConfig, IndexConfig.class);
//datasource.xml
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setFullIndexingSourceConfig(new ArrayList<SingleSourceConfig>());
dataSourceConfig.setAddIndexingSourceConfig(new ArrayList<SingleSourceConfig>());
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.datasourceConfig), dataSourceConfig, DataSourceConfig.class);
//status.xml
CollectionIndexStatus collectionStatus = new CollectionIndexStatus();
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.indexStatus), collectionStatus, CollectionIndexStatus.class);
//info.xml
int dataSequence = collectionStatus.getSequence();
FilePaths indexFilePaths = collectionFilePaths.dataPaths().indexFilePaths(dataSequence);
if (!indexFilePaths.file().exists()) {
indexFilePaths.file().mkdirs();
}
DataInfo dataInfo = new DataInfo();
JAXBConfigs.writeConfig(indexFilePaths.file(SettingFileNames.dataInfo), dataInfo, DataInfo.class);
//schedule.xml
IndexingScheduleConfig indexingScheduleConfig = new IndexingScheduleConfig();
indexingScheduleConfig.setFullIndexingSchedule(IndexingSchedule.DefaultIndexingSchedule);
indexingScheduleConfig.setAddIndexingSchedule(IndexingSchedule.DefaultIndexingSchedule);
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.scheduleConfig), indexingScheduleConfig, IndexingScheduleConfig.class);
Schema schema = new Schema(schemaSetting);
CollectionContext collectionContext = new CollectionContext(collectionFilePaths.getId(), collectionFilePaths);
collectionContext.init(schema, null, collectionConfig, indexConfig, dataSourceConfig, collectionStatus, dataInfo, indexingScheduleConfig);
return collectionContext;
} catch (Exception e) {
throw new SettingException("CollectionContext 로드중 에러발생", e);
}
}
public static boolean writeConfigFile(Object configObject, FilePaths collectionFilePaths) {
if(!collectionFilePaths.file().exists()) {
collectionFilePaths.file().mkdirs();
}
Path collectionDir = new Path(collectionFilePaths.file());
try {
if (configObject instanceof CollectionConfig) {
CollectionConfig collectionConfig = (CollectionConfig) configObject;
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.collectionConfig), collectionConfig, CollectionConfig.class);
}else if (configObject instanceof DataSourceConfig) {
DataSourceConfig dataSourceConfig = (DataSourceConfig) configObject;
JAXBConfigs.writeConfig(collectionDir.file(SettingFileNames.datasourceConfig), dataSourceConfig, DataSourceConfig.class);
}
} catch (JAXBException e) {
logger.error("", e);
return false;
}
return true;
}
public static CollectionContext load(Collection collection, FilePaths collectionFilePaths) throws SettingException {
try {
String collectionId = collection.getId();
Path collectionPath = new Path(collectionFilePaths.file());
File schemaFile = collectionPath.file(SettingFileNames.schema);
SchemaSetting schemaSetting = JAXBConfigs.readConfig(schemaFile, SchemaSetting.class);
File workSchemaFile = collectionPath.file(SettingFileNames.workSchema);
SchemaSetting workSchemaSetting = JAXBConfigs.readConfig(workSchemaFile, SchemaSetting.class);
CollectionConfig collectionConfig = JAXBConfigs.readConfig(collectionPath.file(SettingFileNames.collectionConfig), CollectionConfig.class);
IndexConfig indexConfig = JAXBConfigs.readConfig(collectionPath.file(SettingFileNames.indexConfig), IndexConfig.class);
File dataSourceConfigFile = collectionPath.file(SettingFileNames.datasourceConfig);
DataSourceConfig dataSourceConfig = null;
if (dataSourceConfigFile.exists()) {
dataSourceConfig = JAXBConfigs.readConfig(dataSourceConfigFile, DataSourceConfig.class);
} else {
dataSourceConfig = new DataSourceConfig();
}
File indexStatusFile = collectionPath.file(SettingFileNames.indexStatus);
CollectionIndexStatus collectionStatus = JAXBConfigs.readConfig(indexStatusFile, CollectionIndexStatus.class);
int dataSequence = collectionStatus.getSequence();
FilePaths indexFilePaths = collectionFilePaths.dataPaths().indexFilePaths(dataSequence);
if (!indexFilePaths.file().exists()) {
indexFilePaths.file().mkdirs();
}
File dataInfoFile = indexFilePaths.file(SettingFileNames.dataInfo);
logger.debug("load dataInfoFile > {}", dataInfoFile.getAbsolutePath());
DataInfo dataInfo = null;
if(dataInfoFile.exists()){
dataInfo = JAXBConfigs.readConfig(dataInfoFile, DataInfo.class);
}else{
dataInfo = new DataInfo();
JAXBConfigs.writeConfig(dataInfoFile, dataInfo, DataInfo.class);
}
File scheduleConfigFile = collectionPath.file(SettingFileNames.scheduleConfig);
IndexingScheduleConfig indexingScheduleConfig = null;
if (scheduleConfigFile.exists()) {
indexingScheduleConfig = JAXBConfigs.readConfig(scheduleConfigFile, IndexingScheduleConfig.class);
} else {
indexingScheduleConfig = new IndexingScheduleConfig();
}
Schema schema = new Schema(schemaSetting);
CollectionContext collectionContext = new CollectionContext(collection.getId(), collectionFilePaths);
collectionContext.init(schema, workSchemaSetting, collectionConfig, indexConfig, dataSourceConfig, collectionStatus, dataInfo, indexingScheduleConfig);
return collectionContext;
} catch (Exception e) {
throw new SettingException("CollectionContext 로드중 에러발생", e);
}
}
public static void write(CollectionContext collectionContext) throws SettingException {
try {
FilePaths collectionFilePaths = collectionContext.collectionFilePaths();
Schema schema = collectionContext.schema();
SchemaSetting workSchemaSetting = collectionContext.workSchemaSetting();
IndexConfig indexConfig = collectionContext.indexConfig();
CollectionConfig collectionConfig = collectionContext.collectionConfig();
CollectionIndexStatus collectionStatus = collectionContext.indexStatus();
DataSourceConfig dataSourceConfig = collectionContext.dataSourceConfig();
DataInfo dataInfo = collectionContext.dataInfo();
IndexingScheduleConfig indexingScheduleConfig = collectionContext.indexingScheduleConfig();
File collectionDir = collectionFilePaths.file();
if (schema != null && schema.schemaSetting() != null) {
SchemaSetting schemaSetting = schema.schemaSetting();
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.schema), schemaSetting, SchemaSetting.class);
}
if (workSchemaSetting != null) {
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.workSchema), workSchemaSetting, SchemaSetting.class);
}
if(indexConfig != null){
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.indexConfig), indexConfig, IndexConfig.class);
}
if (collectionConfig != null) {
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.collectionConfig), collectionConfig, CollectionConfig.class);
}
if (collectionStatus != null) {
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.indexStatus), collectionStatus, CollectionIndexStatus.class);
}
if (dataSourceConfig != null) {
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.datasourceConfig), dataSourceConfig, DataSourceConfig.class);
}
int dataSequence = collectionStatus.getSequence();
FilePaths indexFilePaths = collectionFilePaths.dataPaths().indexFilePaths(dataSequence);
if (!indexFilePaths.file().exists()) {
indexFilePaths.file().mkdirs();
}
if (dataInfo != null) {
JAXBConfigs.writeConfig(indexFilePaths.file(SettingFileNames.dataInfo), dataInfo, DataInfo.class);
}
if (indexingScheduleConfig != null) {
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.scheduleConfig), indexingScheduleConfig, IndexingScheduleConfig.class);
}
} catch (Exception e) {
throw new SettingException("CollectionContext 저장중 에러발생", e);
}
}
/**
* status.xml 저장.
* data#//info.xml 저장.
* data#/{revision}/revision.xml 저장.
*
* */
public static void saveCollectionAfterIndexing(CollectionContext collectionContext) throws SettingException {
FilePaths collectionFilePaths = collectionContext.collectionFilePaths();
FilePaths dataFilePaths = collectionFilePaths.dataPaths();
File collectionDir = collectionFilePaths.file();
try {
Schema schema = collectionContext.schema();
if (schema != null && schema.schemaSetting() != null) {
SchemaSetting schemaSetting = schema.schemaSetting();
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.schema), schemaSetting, SchemaSetting.class);
}
IndexConfig indexConfig = collectionContext.indexConfig();
if(indexConfig != null){
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.indexConfig), indexConfig, IndexConfig.class);
}
CollectionConfig collectionConfig = collectionContext.collectionConfig();
if (collectionConfig != null) {
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.collectionConfig), collectionConfig, CollectionConfig.class);
}
CollectionIndexStatus collectionStatus = collectionContext.indexStatus();
if (collectionStatus != null) {
JAXBConfigs.writeConfig(collectionFilePaths.file(SettingFileNames.indexStatus), collectionStatus, CollectionIndexStatus.class);
}
DataSourceConfig dataSourceConfig = collectionContext.dataSourceConfig();
if (dataSourceConfig != null) {
JAXBConfigs.writeConfig(new File(collectionDir, SettingFileNames.datasourceConfig), dataSourceConfig, DataSourceConfig.class);
}
DataInfo dataInfo = collectionContext.dataInfo();
if (dataInfo != null) {
File indexDir = dataFilePaths.indexDirFile(collectionContext.getIndexSequence());
indexDir.mkdirs();
logger.debug("Save DataInfo >> {}", dataInfo);
JAXBConfigs.writeConfig(new File(indexDir, SettingFileNames.dataInfo), dataInfo, DataInfo.class);
//리비전 xml을 각 리비전 디렉토리에 백업용을 남겨둔다.
SegmentInfo lastSegmentInfo = dataInfo.getLastSegmentInfo();
if(lastSegmentInfo != null) {
File revisionDir = dataFilePaths.revisionFile(collectionContext.getIndexSequence(), lastSegmentInfo.getId(), lastSegmentInfo.getRevision());
RevisionInfo revisionInfo = lastSegmentInfo.getRevisionInfo();
if (revisionInfo != null) {
logger.debug("Save RevisionInfo >> {}, {}", revisionDir.getAbsolutePath(), revisionInfo);
JAXBConfigs.writeConfig(new File(revisionDir, SettingFileNames.revisionInfo), revisionInfo, RevisionInfo.class);
}
}
}
File workSchemaFile = collectionFilePaths.file(SettingFileNames.workSchema);
if (workSchemaFile.exists()) {
workSchemaFile.delete();
}
} catch (JAXBException e) {
throw new SettingException("색인후 CollectionContext 저장중 에러발생", e);
}
}
}