package crate.elasticsearch.action.restore.parser;
import crate.elasticsearch.action.dump.parser.DumpParser;
import crate.elasticsearch.action.import_.ImportContext;
import crate.elasticsearch.action.import_.parser.DirectoryParseElement;
import crate.elasticsearch.action.import_.parser.IImportParser;
import crate.elasticsearch.action.import_.parser.ImportParseElement;
import crate.elasticsearch.action.import_.parser.ImportParseException;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.collect.ImmutableMap;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
public class RestoreParser implements IImportParser {
private final ImmutableMap<String, ImportParseElement> elementParsers;
public static final String FILE_PATTERN = ".*_.*_.*\\.json\\.gz";
public RestoreParser() {
Map<String, ImportParseElement> elementParsers = new HashMap<String, ImportParseElement>();
elementParsers.put("directory", new DirectoryParseElement());
this.elementParsers = ImmutableMap.copyOf(elementParsers);
}
/**
* Main method of this class to parse given payload of _restore action
*
* @param context
* @param source
* @throws org.elasticsearch.search.SearchParseException
*/
public void parseSource(ImportContext context, BytesReference source) throws ImportParseException {
XContentParser parser = null;
this.setDefaults(context);
context.settings(true);
context.mappings(true);
try {
if (source != null && source.length() != 0) {
parser = XContentFactory.xContent(source).createParser(source);
XContentParser.Token token;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) {
String fieldName = parser.currentName();
parser.nextToken();
ImportParseElement element = elementParsers.get(fieldName);
if (element == null) {
throw new ImportParseException(context, "No parser for element [" + fieldName + "]");
}
element.parse(parser, context);
} else if (token == null) {
break;
}
}
}
if (context.directory() == null) {
context.directory(DumpParser.DEFAULT_DIR);
}
} catch (Exception e) {
String sSource = "_na_";
try {
sSource = XContentHelper.convertToJson(source, false);
} catch (Throwable e1) {
// ignore
}
throw new ImportParseException(context, "Failed to parse source [" + sSource + "]", e);
} finally {
if (parser != null) {
parser.close();
}
}
}
/**
* Set restore specific default values to the context like compression and file_pattern
*
* @param context
*/
private void setDefaults(ImportContext context) {
context.compression(true);
Pattern p = Pattern.compile(FILE_PATTERN);
context.file_pattern(p);
}
}