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(); } }