/*
* Licensed to David Pilato (the "Author") under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Author licenses this
* file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package fr.pilato.elasticsearch.crawler.fs.meta.settings;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import fr.pilato.elasticsearch.crawler.fs.util.FsCrawlerUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class Elasticsearch {
public Elasticsearch() {
}
private Elasticsearch(List<Node> nodes, String index, String type, int bulkSize, TimeValue flushInterval,
String username, String password, String pipeline) {
this.nodes = nodes;
this.index = index;
this.type = type;
this.bulkSize = bulkSize;
this.flushInterval = flushInterval;
this.username = username;
this.password = password;
this.pipeline = pipeline;
}
public static Builder builder() {
return new Builder();
}
// Using here a method instead of a constant as sadly FSCrawlerValidator can modify this object
// TODO fix that: a validator should not modify the original object but return a modified copy
public static Elasticsearch DEFAULT() {
return Elasticsearch.builder()
.addNode(Node.DEFAULT)
.build();
}
public static class Node {
public enum Scheme {
HTTP,
HTTPS;
public static Scheme parse(String value) {
return valueOf(value.toUpperCase(Locale.ROOT));
}
public String toLowerCase() {
return this.toString().toLowerCase(Locale.ROOT);
}
}
public static final Node DEFAULT = Node.builder().setHost("127.0.0.1").setPort(9200).setScheme(Scheme.HTTP).build();
public Node() {
}
private Node(String host, int port, Scheme scheme) {
this.host = host;
this.port = port;
this.active = false;
this.scheme = scheme;
}
private String host;
private int port;
private boolean active;
private Scheme scheme;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public boolean active() {
return active;
}
public void active(boolean active) {
this.active = active;
}
public Scheme getScheme() {
return scheme;
}
public void setScheme(Scheme scheme) {
this.scheme = scheme;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private String host;
private int port;
private Scheme scheme = Scheme.HTTP;
public Builder setHost(String host) {
this.host = host;
return this;
}
public Builder setPort(int port) {
this.port = port;
return this;
}
public Builder setScheme(Scheme scheme) {
this.scheme = scheme;
return this;
}
public Node build() {
return new Node(host, port, scheme);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Node node = (Node) o;
if (port != node.port) return false;
return !(host != null ? !host.equals(node.host) : node.host != null);
}
@Override
public int hashCode() {
int result = host != null ? host.hashCode() : 0;
result = 31 * result + port;
return result;
}
@Override
public String toString() {
String sb = "Node{" + "active=" + active +
", host='" + host + '\'' +
", port=" + port +
", scheme=" + scheme +
'}';
return sb;
}
}
private List<Node> nodes;
private String index;
private String type = FsCrawlerUtil.INDEX_TYPE_DOC;
private int bulkSize = 100;
private TimeValue flushInterval = TimeValue.timeValueSeconds(5);
private String username;
@JsonIgnore
private String password;
private String pipeline;
public List<Node> getNodes() {
return nodes;
}
public String getIndex() {
return index;
}
public void setIndex(String index) {
this.index = index;
}
public String getType() {
return type;
}
public int getBulkSize() {
return bulkSize;
}
public TimeValue getFlushInterval() {
return flushInterval;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
public String getPipeline() {
return pipeline;
}
public void setPipeline(String pipeline) {
this.pipeline = pipeline;
}
public static class Builder {
private List<Node> nodes;
private String index;
private String type = FsCrawlerUtil.INDEX_TYPE_DOC;
private int bulkSize = 100;
private TimeValue flushInterval = TimeValue.timeValueSeconds(5);
private String username = null;
private String password = null;
private String pipeline = null;
public Builder setNodes(List<Node> nodes) {
this.nodes = nodes;
return this;
}
public Builder addNode(Node node) {
if (this.nodes == null) {
this.nodes = new ArrayList<>();
}
this.nodes.add(node);
return this;
}
public Builder setIndex(String index) {
this.index = index;
return this;
}
public Builder setType(String type) {
this.type = type;
return this;
}
public Builder setBulkSize(int bulkSize) {
this.bulkSize = bulkSize;
return this;
}
public Builder setFlushInterval(TimeValue flushInterval) {
this.flushInterval = flushInterval;
return this;
}
public Builder setUsername(String username) {
this.username = username;
return this;
}
public Builder setPassword(String password) {
this.password = password;
return this;
}
public Builder setPipeline(String pipeline) {
this.pipeline = pipeline;
return this;
}
public Elasticsearch build() {
return new Elasticsearch(nodes, index, type, bulkSize, flushInterval, username, password, pipeline);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Elasticsearch that = (Elasticsearch) o;
if (bulkSize != that.bulkSize) return false;
if (nodes != null ? !nodes.equals(that.nodes) : that.nodes != null) return false;
if (index != null ? !index.equals(that.index) : that.index != null) return false;
if (type != null ? !type.equals(that.type) : that.type != null) return false;
if (username != null ? !username.equals(that.username) : that.username != null) return false;
// We can't really test the password as it may be obfuscated
if (pipeline != null ? !pipeline.equals(that.pipeline) : that.pipeline != null) return false;
return !(flushInterval != null ? !flushInterval.equals(that.flushInterval) : that.flushInterval != null);
}
@Override
public int hashCode() {
int result = nodes != null ? nodes.hashCode() : 0;
result = 31 * result + (index != null ? index.hashCode() : 0);
result = 31 * result + (type != null ? type.hashCode() : 0);
result = 31 * result + (username != null ? username.hashCode() : 0);
result = 31 * result + (password != null ? password.hashCode() : 0);
result = 31 * result + (pipeline != null ? pipeline.hashCode() : 0);
result = 31 * result + bulkSize;
result = 31 * result + (flushInterval != null ? flushInterval.hashCode() : 0);
return result;
}
}