package org.fastcatsearch.http.action.management.collections;
import java.io.File;
import java.lang.reflect.Constructor;
import java.util.List;
import org.fastcatsearch.datasource.SourceModifier;
import org.fastcatsearch.datasource.reader.SingleSourceReader;
import org.fastcatsearch.http.ActionAuthority;
import org.fastcatsearch.http.ActionAuthorityLevel;
import org.fastcatsearch.http.ActionMapping;
import org.fastcatsearch.http.action.ActionRequest;
import org.fastcatsearch.http.action.ActionResponse;
import org.fastcatsearch.http.action.AuthAction;
import org.fastcatsearch.ir.IRService;
import org.fastcatsearch.ir.config.CollectionContext;
import org.fastcatsearch.ir.config.DataSourceConfig;
import org.fastcatsearch.ir.config.SingleSourceConfig;
import org.fastcatsearch.ir.settings.FieldSetting;
import org.fastcatsearch.ir.settings.SchemaInvalidateException;
import org.fastcatsearch.ir.settings.SchemaSetting;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.settings.SettingFileNames;
import org.fastcatsearch.util.DynamicClassLoader;
import org.fastcatsearch.util.FilePaths;
import org.fastcatsearch.util.JAXBConfigs;
import org.fastcatsearch.util.ResponseWriter;
/**
* 스키마 자동생성 action
* */
@ActionMapping(value = "/management/collections/schema/auto-create", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.WRITABLE)
public class CreateCollectionAutoSchemaAction extends AuthAction {
@Override
public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception {
String collectionId = request.getParameter("collectionId");
boolean isSuccess = true;
String errorMessage = "";
try {
IRService irService = ServiceManager.getInstance().getService(IRService.class);
CollectionContext collectionContext = irService.collectionContext(collectionId);
FilePaths collectionFilePaths = collectionContext.collectionFilePaths();
File collectionDir = collectionFilePaths.file();
File schemaFile = null;
SchemaSetting schemaSetting = null;
DataSourceConfig dataSourceConfig = collectionContext.dataSourceConfig();
List<SingleSourceConfig> sourceConfigs = dataSourceConfig.getFullIndexingSourceConfig();
if (sourceConfigs.size() > 0) {
SingleSourceConfig config = sourceConfigs.get(0);
config.getSourceReader();
try {
Class<?> readerClass = DynamicClassLoader.loadClass(config.getSourceReader());
Constructor<?> constructor = readerClass.getConstructor(String.class, File.class, SingleSourceConfig.class, SourceModifier.class, String.class);
SingleSourceReader<?> sreader = (SingleSourceReader<?>) constructor.newInstance("", null, config, null, null);
SchemaSetting tempSchema = sreader.getAutoGeneratedSchemaSetting();
if (tempSchema != null) {
schemaSetting = tempSchema;
List<FieldSetting> fieldSettingList = tempSchema.getFieldSettingList();
if (logger.isTraceEnabled()) {
logger.trace("- field setting list -");
for (FieldSetting fs : fieldSettingList) {
logger.trace("fs:{}[{}]/{}", fs.getId(), fs.getName(), fs.getSize());
}
}
schemaFile = new File(collectionDir, SettingFileNames.workSchema);
collectionContext.setWorkSchemaSetting(schemaSetting);
JAXBConfigs.writeConfig(schemaFile, schemaSetting, SchemaSetting.class);
}
} finally {
}
}
// 일단 json object를 schema validation체크수행한다.
schemaSetting.isValid();
schemaFile = new File(collectionDir, SettingFileNames.workSchema);
// 저장한다.
JAXBConfigs.writeConfig(schemaFile, schemaSetting, SchemaSetting.class);
collectionContext.setWorkSchemaSetting(schemaSetting);
} catch (SchemaInvalidateException e) {
// 스키마 오류의 각종 정보를 추출하여 호출자에 전달해 준다.
logger.error("", e);
isSuccess = false;
errorMessage = e.getMessage();
} catch (Exception e) {
logger.error("", e);
isSuccess = false;
errorMessage = e.getMessage();
}
ResponseWriter responseWriter = getDefaultResponseWriter(response.getWriter());
responseWriter.object();
responseWriter.key("success").value(isSuccess);
if (errorMessage != null) {
responseWriter.key("errorMessage").value(errorMessage);
}
responseWriter.endObject();
responseWriter.done();
}
}