package org.fastcatsearch.http.action.management.collections; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.fastcatsearch.cluster.ClusterUtils; import org.fastcatsearch.cluster.NodeService; import org.fastcatsearch.datasource.reader.SingleSourceReader; import org.fastcatsearch.datasource.reader.SourceReaderParameter; 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.job.management.UpdateDataSourceConfigJob; import org.fastcatsearch.service.ServiceManager; import org.fastcatsearch.settings.SettingFileNames; import org.fastcatsearch.util.DynamicClassLoader; import org.fastcatsearch.util.JAXBConfigs; import org.fastcatsearch.util.ResponseWriter; @ActionMapping(value = "/management/collections/update-datasource", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.WRITABLE) public class UpdateCollectionDatasourceAction extends AuthAction { @Override public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception { boolean isSuccess = false; String message = ""; try { String collectionId = request.getParameter("collectionId"); int sourceIndex = request.getIntParameter("sourceIndex",-1); String indexType = request.getParameter("indexType"); String name = request.getParameter("name"); boolean active = "true".equals(request.getParameter("active")); String readerClass = request.getParameter("readerClass"); String modifierClass = request.getParameter("modifierClass"); String mode = request.getParameter("mode"); //각 SingleSourceReader 에서 정의된 parameterList 를 가져와서 key를 얻는다. SingleSourceReader singleSourceReader = DynamicClassLoader.loadObject(readerClass, SingleSourceReader.class); List<SourceReaderParameter> parameterList = singleSourceReader.getParameterList(); Map<String,String> properties = new HashMap<String,String>(); for(SourceReaderParameter parameter : parameterList) { String key = parameter.getId(); String value = request.getParameter(key); logger.debug("SingleSourceReader parameters {} : {}", key, value); properties.put(key, value); } IRService irService = ServiceManager.getInstance().getService(IRService.class); CollectionContext collectionContext = irService.collectionContext(collectionId); DataSourceConfig dataSourceConfig = collectionContext.dataSourceConfig(); File dataSourceConfigFile = collectionContext.collectionFilePaths().file(SettingFileNames.datasourceConfig); List<SingleSourceConfig> configList = null; SingleSourceConfig config = null; if("full".equals(indexType)) { configList = dataSourceConfig.getFullIndexingSourceConfig(); } else if("add".equals(indexType)) { configList = dataSourceConfig.getAddIndexingSourceConfig(); } if("delete".equals(mode)) { if(configList != null && sourceIndex != -1){ configList.remove(sourceIndex); isSuccess = true; }else{ isSuccess = false; message = "Cannot find config to delete. sourceIndex[" + sourceIndex + "] configList size[" + (configList == null ? 0 : configList.size()) + "]"; } } else { if (configList == null) { configList = new ArrayList<SingleSourceConfig>(); if ("full".equals(indexType)) { dataSourceConfig.setFullIndexingSourceConfig(configList); } else if ("add".equals(indexType)) { dataSourceConfig.setAddIndexingSourceConfig(configList); } } if(sourceIndex == -1 || configList.size() == 0) { config = new SingleSourceConfig(); configList.add(config); } else if(sourceIndex < configList.size()) { config = configList.get(sourceIndex); } else { message = "Invalid request. sourceIndex[" + sourceIndex + "] configList size[" + (configList == null ? 0 : configList.size()) + "]"; isSuccess = false; } if (config != null) { config.setName(name); config.setActive(active); config.setSourceReader(readerClass); config.setSourceModifier(modifierClass); config.setProperties(properties); isSuccess = true; }else{ isSuccess = false; } } if(isSuccess) { JAXBConfigs.writeConfig(dataSourceConfigFile, dataSourceConfig, DataSourceConfig.class); Set<String> nodeIdSet = collectionContext.collectionConfig().getCollectionNodeIDSet(); UpdateDataSourceConfigJob updateDataSourceConfigJob = new UpdateDataSourceConfigJob(collectionId, dataSourceConfig); NodeService nodeService = ServiceManager.getInstance().getService(NodeService.class); ClusterUtils.sendJobToNodeIdSet(updateDataSourceConfigJob, nodeService, nodeIdSet, false); } } catch (Exception e) { logger.error("",e); isSuccess = false; } finally { ResponseWriter responseWriter = getDefaultResponseWriter(response.getWriter()); responseWriter.object(); responseWriter.key("success").value(isSuccess); responseWriter.key("message").value(message); responseWriter.endObject(); responseWriter.done(); } } }