package crate.elasticsearch.action.export; import crate.elasticsearch.export.Output; import crate.elasticsearch.export.OutputCommand; import crate.elasticsearch.export.OutputFile; import org.elasticsearch.cache.recycler.CacheRecycler; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.index.engine.Engine; import org.elasticsearch.index.service.IndexService; import org.elasticsearch.index.shard.service.IndexShard; import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.SearchShardTarget; import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.ShardSearchRequest; import java.io.File; import java.util.ArrayList; import java.util.List; /** * Container class for export specific informations. */ public class ExportContext extends SearchContext { private static final String VAR_SHARD = "${shard}"; private static final String VAR_INDEX = "${index}"; private static final String VAR_CLUSTER = "${cluster}"; private List<String> outputCmdArray; private String outputCmd; private String outputFile; private boolean forceOverride = false; private boolean compression; private String nodePath; private boolean mappings = false; private boolean settings = false; public ExportContext(long id, ShardSearchRequest request, SearchShardTarget shardTarget, Engine.Searcher engineSearcher, IndexService indexService, IndexShard indexShard, ScriptService scriptService, CacheRecycler cacheRecycler, String nodePath) { super(id, request, shardTarget, engineSearcher, indexService, indexShard, scriptService, cacheRecycler); this.nodePath = nodePath; } public List<String> outputCmdArray() { return outputCmdArray; } public void outputCmdArray(List<String> outputCmdArray) { this.outputCmdArray = applyVars(outputCmdArray); } public String outputCmd() { return outputCmd; } public void outputCmd(String outputCmd) { this.outputCmd = applyVars(outputCmd); } public String outputFile() { return outputFile; } public void outputFile(String outputFile) { outputFile = applyVars(outputFile); File outFile = new File(outputFile); if (!outFile.isAbsolute() && nodePath != null) { outputFile = new File(nodePath, outputFile).getAbsolutePath(); } this.outputFile = outputFile; } public boolean mappings() { return mappings; } public void mappings(boolean mappings) { this.mappings = mappings; } public boolean settings() { return settings; } public void settings(boolean settings) { this.settings = settings; } public String nodePath() { return nodePath; } public boolean forceOverride() { return forceOverride; } public void forceOverride(boolean forceOverride) { this.forceOverride = forceOverride; } public void compression(boolean compression) { this.compression = compression; } public boolean compression() { return this.compression; } /** * Replaces variable placeholder with actual value in all elements of templateArray * * @param templateArray * @return */ private List<String> applyVars(List<String> templateArray) { List<String> ret = new ArrayList<String>(); for (String part : templateArray) { ret.add(applyVars(part)); } return ret; } /** * Replaces variable placeholder with actual value * * @param template * @return */ private String applyVars(String template) { template = template.replace(VAR_SHARD, String.valueOf(indexShard().shardId().getId())); template = template.replace(VAR_INDEX, indexShard().shardId().getIndex()); template = template.replace(VAR_CLUSTER, clusterName()); return template; } /** * Method to retrieve name of cluster * * @return name of cluster */ private String clusterName() { return ClusterName.clusterNameFromSettings(this.indexShard().indexSettings()).value(); } public Output createOutput() { if (outputFile()!=null){ return new OutputFile(outputFile(), forceOverride(), compression); } else { if (outputCmd()!=null){ return new OutputCommand(outputCmd(), compression); } else { return new OutputCommand(outputCmdArray(), compression); } } } }