package info.johtani.elasticsearch.action.admin.indices.extended.analyze; import org.elasticsearch.action.ActionResponse; import org.elasticsearch.common.Strings; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Streamable; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** */ public class ExtendedAnalyzeResponse extends ActionResponse implements ToXContent { private ExtendedAnalyzeTokenList analyzer; private List<CharFilteredText> charfilters; private ExtendedAnalyzeTokenList tokenizer; private List<ExtendedAnalyzeTokenList> tokenfilters; private boolean customAnalyzer = false; private boolean shortAttributeName = false; ExtendedAnalyzeResponse() { } public ExtendedAnalyzeResponse(boolean customAnalyzer, ExtendedAnalyzeTokenList analyzer, ExtendedAnalyzeTokenList tokenizer, List<ExtendedAnalyzeTokenList> tokenfilters, List<CharFilteredText> charfilters) { this.analyzer = analyzer; this.tokenizer = tokenizer; this.tokenfilters = tokenfilters; this.customAnalyzer = customAnalyzer; this.charfilters = charfilters; } public ExtendedAnalyzeTokenList analyzer() { return this.analyzer; } public ExtendedAnalyzeResponse analyzer(ExtendedAnalyzeTokenList analyzer) { this.analyzer = analyzer; return this; } public ExtendedAnalyzeTokenList tokenizer() { return this.tokenizer; } public ExtendedAnalyzeResponse tokenizer(ExtendedAnalyzeTokenList tokenizer) { this.tokenizer = tokenizer; return this; } public List<ExtendedAnalyzeTokenList> tokenfilters() { return this.tokenfilters; } public ExtendedAnalyzeResponse addTokenfilter(ExtendedAnalyzeTokenList tokenfilter) { if (tokenfilters == null) { tokenfilters = new ArrayList<>(); } tokenfilters.add(tokenfilter); return this; } public boolean customAnalyzer() { return this.customAnalyzer; } public ExtendedAnalyzeResponse customAnalyzer(boolean customAnalyzer) { this.customAnalyzer = customAnalyzer; return this; } public List<CharFilteredText> charfilters() { return this.charfilters; } public ExtendedAnalyzeResponse addCharfilter(CharFilteredText charfilter) { if (charfilters == null) { charfilters = new ArrayList<>(); } this.charfilters.add(charfilter); return this; } private XContentBuilder toXContentExtendedAnalyzeTokenList(XContentBuilder builder, ExtendedAnalyzeTokenList list) throws IOException { builder.startArray(list.name); for (ExtendedAnalyzeToken token : list.getTokens()) { builder.startObject(); builder.field("token", token.getTerm()); builder.field("start_offset", token.getStartOffset()); builder.field("end_offset", token.getEndOffset()); builder.field("type", token.getType()); builder.field("position", token.getPosition()); builder.field("extended_attributes", token.getExtendedAttributes()); builder.endObject(); } builder.endArray(); return builder; } @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.field("custom_analyzer", this.customAnalyzer); if (analyzer != null) { builder.startObject("analyzer"); toXContentExtendedAnalyzeTokenList(builder, analyzer); builder.endObject(); } if (charfilters != null && !charfilters.isEmpty()) { builder.startArray("charfilters"); for (CharFilteredText charfilter : charfilters) { builder.startObject(); builder.field("name", charfilter.getName()); builder.field("filtered_text", charfilter.getTexts()); builder.endObject(); } builder.endArray(); } if (tokenizer != null) { builder.startObject("tokenizer"); toXContentExtendedAnalyzeTokenList(builder, tokenizer); builder.endObject(); } if (tokenfilters != null && !tokenfilters.isEmpty()) { builder.startArray("tokenfilters"); for (ExtendedAnalyzeTokenList tokenfilter : tokenfilters) { builder.startObject(); toXContentExtendedAnalyzeTokenList(builder, tokenfilter); builder.endObject(); } builder.endArray(); } return builder; } @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); customAnalyzer = in.readBoolean(); if (!customAnalyzer) { analyzer = ExtendedAnalyzeTokenList.readExtendedAnalyzeTokenList(in); } else { tokenizer = ExtendedAnalyzeTokenList.readExtendedAnalyzeTokenList(in); int size = in.readVInt(); if (size > 0) { tokenfilters = new ArrayList<>(size); for (int i = 0; i < size; i++) { tokenfilters.add(ExtendedAnalyzeTokenList.readExtendedAnalyzeTokenList(in)); } } size = in.readVInt(); if (size > 0) { charfilters = new ArrayList<>(size); for (int i = 0; i < size; i++) { charfilters.add(CharFilteredText.readCharFilteredText(in)); } } } } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeBoolean(customAnalyzer); if (!customAnalyzer) { analyzer.writeTo(out); } else { tokenizer.writeTo(out); if (tokenfilters != null) { out.writeVInt(tokenfilters.size()); for (ExtendedAnalyzeTokenList tokenList : tokenfilters) { tokenList.writeTo(out); } } else { out.writeVInt(0); } if (charfilters != null) { out.writeVInt(charfilters.size()); for (CharFilteredText charfilter : charfilters) { charfilter.writeTo(out); } } else { out.writeVInt(0); } } } public static class ExtendedAnalyzeTokenList implements Streamable { private List<ExtendedAnalyzeToken> tokens; private String name; ExtendedAnalyzeTokenList() { } public ExtendedAnalyzeTokenList(String name, List<ExtendedAnalyzeToken> tokens) { this.name = name; this.tokens = tokens; } public static ExtendedAnalyzeTokenList readExtendedAnalyzeTokenList(StreamInput in) throws IOException { ExtendedAnalyzeTokenList list = new ExtendedAnalyzeTokenList(); list.readFrom(in); return list; } public String getName() { return this.name; } public List<ExtendedAnalyzeToken> getTokens() { return tokens; } @Override public void readFrom(StreamInput in) throws IOException { name = in.readString(); int size = in.readVInt(); tokens = new ArrayList<>(size); for (int i = 0; i < size; i++) { tokens.add(ExtendedAnalyzeToken.readExtendedAnalyzeToken(in)); } } @Override public void writeTo(StreamOutput out) throws IOException { out.writeString(name); out.writeVInt(tokens.size()); for (ExtendedAnalyzeToken token : tokens) { token.writeTo(out); } } } public static class ExtendedAnalyzeToken implements Streamable { private String term; private int startOffset; private int endOffset; private int position; private String type; private Map<String, Map<String, Object>> extendedAttributes; ExtendedAnalyzeToken() { } public ExtendedAnalyzeToken(String term, int position, int startOffset, int endOffset, String type, Map<String, Map<String, Object>> extendedAttributes) { this.term = term; this.position = position; this.startOffset = startOffset; this.endOffset = endOffset; this.type = type; this.extendedAttributes = extendedAttributes; } public static ExtendedAnalyzeToken readExtendedAnalyzeToken(StreamInput in) throws IOException { ExtendedAnalyzeToken analyzeToken = new ExtendedAnalyzeToken(); analyzeToken.readFrom(in); return analyzeToken; } public String getTerm() { return this.term; } public int getStartOffset() { return this.startOffset; } public int getEndOffset() { return this.endOffset; } public int getPosition() { return this.position; } public String getType() { return this.type; } public Map<String, Map<String, Object>> getExtendedAttributes() { return this.extendedAttributes; } @Override public void readFrom(StreamInput in) throws IOException { term = in.readString(); startOffset = in.readInt(); endOffset = in.readInt(); position = in.readVInt(); type = in.readOptionalString(); extendedAttributes = (Map<String, Map<String, Object>>) in.readGenericValue(); } @Override public void writeTo(StreamOutput out) throws IOException { out.writeString(term); out.writeInt(startOffset); out.writeInt(endOffset); out.writeVInt(position); out.writeOptionalString(type); out.writeGenericValue(extendedAttributes); } } public static class CharFilteredText implements Streamable { private String name; private List<String> texts; CharFilteredText() { } public CharFilteredText(String name, List<String> texts) { this.name = name; this.texts = texts; } public String getName() { return name; } public List<String> getTexts() { return texts; } public static CharFilteredText readCharFilteredText(StreamInput in) throws IOException { CharFilteredText text = new CharFilteredText(); text.readFrom(in); return text; } @Override public void readFrom(StreamInput in) throws IOException { name = in.readString(); texts = Arrays.asList(in.readStringArray()); } @Override public void writeTo(StreamOutput out) throws IOException { out.writeString(name); out.writeStringArray(texts.toArray(Strings.EMPTY_ARRAY)); } } }