/*
* Copyright (c) 2013 Websquared, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v2.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* swsong - initial API and implementation
*/
package org.fastcatsearch.datasource.reader;
import org.fastcatsearch.datasource.SourceModifier;
import org.fastcatsearch.ir.common.IRException;
import org.fastcatsearch.ir.config.DataSourceConfig;
import org.fastcatsearch.ir.config.SingleSourceConfig;
import org.fastcatsearch.ir.settings.SchemaSetting;
import org.fastcatsearch.util.DynamicClassLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.Map;
public class DefaultDataSourceReaderFactory {
private static Logger logger = LoggerFactory.getLogger(DefaultDataSourceReaderFactory.class);
public static AbstractDataSourceReader<Map<String, Object>> createFullIndexingSourceReader(String collectionId, File filePath, SchemaSetting schemaSetting, DataSourceConfig dataSourceConfig) throws IRException {
AbstractDataSourceReader<Map<String, Object>> dataSourceReader = new DefaultDataSourceReader(schemaSetting);
logger.debug("dataSourceConfig > {}", dataSourceConfig);
if (dataSourceConfig != null && dataSourceConfig.getFullIndexingSourceConfig() != null) {
for (SingleSourceConfig singleSourceConfig : dataSourceConfig.getFullIndexingSourceConfig()) {
if(!singleSourceConfig.isActive()){
continue;
}
SingleSourceReader<Map<String, Object>> sourceReader = createSingleSourceReader(collectionId, filePath, singleSourceConfig, null);
dataSourceReader.addSourceReader(sourceReader);
}
} else {
logger.error("No data source config!");
}
dataSourceReader.init();
return dataSourceReader;
}
public static AbstractDataSourceReader<Map<String, Object>> createAddIndexingSourceReader(String collectionId, File filePath, SchemaSetting schemaSetting, DataSourceConfig dataSourceConfig, String lastIndexTime) throws IRException {
AbstractDataSourceReader<Map<String, Object>> dataSourceReader = new DefaultDataSourceReader(schemaSetting);
logger.debug("dataSourceConfig > {}", dataSourceConfig);
if (dataSourceConfig != null && dataSourceConfig.getAddIndexingSourceConfig() != null) {
for (SingleSourceConfig singleSourceConfig : dataSourceConfig.getAddIndexingSourceConfig()) {
if(!singleSourceConfig.isActive()){
continue;
}
SingleSourceReader<Map<String, Object>> sourceReader = createSingleSourceReader(collectionId, filePath, singleSourceConfig, lastIndexTime);
dataSourceReader.addSourceReader(sourceReader);
}
} else {
logger.error("No data source config!");
}
dataSourceReader.init();
return dataSourceReader;
}
private static SingleSourceReader<Map<String, Object>> createSingleSourceReader(String collectionId, File filePath, SingleSourceConfig singleSourceConfig, String lastIndexTime) throws IRException {
String sourceReaderType = singleSourceConfig.getSourceReader();
String sourceModifierType = singleSourceConfig.getSourceModifier();
SourceModifier<Map<String, Object>> sourceModifier = null;
if (sourceModifierType != null && sourceModifierType.length() > 0) {
sourceModifier = DynamicClassLoader.loadObject(sourceModifierType, SourceModifier.class);
if(sourceModifier == null) {
logger.error("Cannot find source modifier : {}", sourceModifierType);
}
}
SingleSourceReader<Map<String, Object>> sourceReader = null;
try {
sourceReader = DynamicClassLoader.loadObject(sourceReaderType, SingleSourceReader.class,
new Class[]{ String.class, File.class, SingleSourceConfig.class, SourceModifier.class, String.class},
new Object[]{collectionId, filePath, singleSourceConfig, sourceModifier, lastIndexTime});
} catch (Exception e) {
throw new IRException(e);
}
logger.debug("Loading sourceReader : {} >> {}, modifier:{} / lastIndexTime:{}", sourceReaderType, sourceReader, sourceModifier, lastIndexTime);
// dataSourceReader가 null일 수 있다.
if (sourceReader == null) {
throw new IRException("Cannot find source reader. Make sure the class is in classpath or constructor signature is valid. reader = " + sourceReaderType);
} else {
return sourceReader;
}
}
}