package eu.play_project.play_platformservices.api;
import java.io.Serializable;
import java.util.List;
public class BdplQuery implements Serializable {
private static final long serialVersionUID = 100L;
private final QueryDetails queryDetails;
private final String bdplQuery;
private final String eleQuery;
private final QueryTemplate constructTemplate;
private final List<HistoricalQuery> historicalQueries;
public BdplQuery(Builder builder) {
this.queryDetails = builder.queryDetails;
this.bdplQuery = builder.bdplQuery;
this.eleQuery = builder.eleQuery;
this.constructTemplate = builder.constructTemplate;
this.historicalQueries = builder.historicalQueries;
}
public static Builder builder() {
return new Builder();
}
/**
* This builder can be made to build a {@linkplain BdplQuery} <b>without</b>
* checking consistency. This means that there is no checking whether all
* setters were invoked (with not null values) before building. Useful e.g.
* in UnitTests where inconsistent {@linkplain BdplQuery} are acceptable.
*
* @param validating
* whether to check all setters were called (with not null
* values) before building
*/
public static Builder nonValidatingBuilder() {
return new Builder(false);
}
public QueryDetails getDetails() {
return queryDetails;
}
public String getBdpl() {
return bdplQuery;
}
public String getEleQuery() {
return eleQuery;
}
public QueryTemplate getConstructTemplate() {
if(constructTemplate == null){
throw new RuntimeException("No construct template found.");
}else{
return constructTemplate;
}
}
public List<HistoricalQuery> getHistoricalQueries() {
return historicalQueries;
}
@Override
public String toString() {
return getBdpl();
}
public static class Builder {
private boolean validating;
public Builder() {
new Builder(true);
}
public Builder (boolean validating) {
this.validating = validating;
}
private QueryDetails queryDetails;
private String bdplQuery;
private String eleQuery;
private QueryTemplate constructTemplate;
private List<HistoricalQuery> historicalQueries;
public Builder details(QueryDetails queryDetails) {
this.queryDetails = queryDetails;
return this;
}
public Builder bdpl(String bdplQuery) {
this.bdplQuery = bdplQuery;
return this;
}
public Builder historicalQueries(List<HistoricalQuery> historicalQueries) {
this.historicalQueries = historicalQueries;
return this;
}
public Builder ele(String eleQuery) {
this.eleQuery = eleQuery;
return this;
}
/**
* Set template for historical queries with placeholder for shared variables.
*/
public Builder constructTemplate(QueryTemplate constructTemplate) {
this.constructTemplate = constructTemplate;
return this;
}
public BdplQuery build() {
if (validating) {
validate();
}
return new BdplQuery(this);
}
private void validate() {
if (queryDetails == null) {
throw new IllegalStateException("queryDetails was not set on builder.");
}
if (bdplQuery == null) {
throw new IllegalStateException("bdplQuery was not set on builder.");
}
if (eleQuery == null) {
throw new IllegalStateException("eleQuery was not set on builder.");
}
if (constructTemplate == null) {
throw new IllegalStateException("constructTemplate was not set on builder.");
}
if (historicalQueries == null) {
throw new IllegalStateException("historicalQueries was not set on builder.");
}
}
}
}