StandardQueryElementCollection.java

/*******************************************************************************
 * Copyright (c) 2018 Eclipse RDF4J contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *******************************************************************************/

package org.eclipse.rdf4j.sparqlbuilder.core;

import java.util.Collection;
import java.util.Optional;
import java.util.function.Function;

/**
 * A {@link QueryElementCollection} that follows a more standard way of converting to a query string
 *
 * @param <T> the type of {@link QueryElement}s in the collection
 */
public abstract class StandardQueryElementCollection<T extends QueryElement> extends QueryElementCollection<T> {
	private Optional<String> operatorName = Optional.empty();
	private Function<String, String> wrapperMethod = Function.identity();

	private boolean printBodyIfEmpty = false;
	private boolean printNameIfEmpty = true;

	protected StandardQueryElementCollection() {
	}

	protected StandardQueryElementCollection(String delimeter) {
		super(delimeter);
	}

	protected StandardQueryElementCollection(String operatorName, String delimeter) {
		super(delimeter);
		setOperatorName(operatorName);
	}

	protected StandardQueryElementCollection(String delimeter, Collection<T> collection) {
		super(delimeter, collection);
	}

	protected StandardQueryElementCollection(String operatorName, Function<String, String> wrapperMethod) {
		super();
		setOperatorName(operatorName);
		setWrapperMethod(wrapperMethod);
	}

	protected StandardQueryElementCollection(String operatorName, String delimiter, Collection<T> collection) {
		super(delimiter, collection);
		setOperatorName(operatorName);
	}

	protected StandardQueryElementCollection(String operatorName, String delimiter,
			Function<String, String> wrapperMethod, Collection<T> collection) {
		super(delimiter, collection);
		setOperatorName(operatorName);
		setWrapperMethod(wrapperMethod);
	}

	protected void setOperatorName(String operatorName) {
		setOperatorName(operatorName, true);
	}

	protected void setOperatorName(String operatorName, boolean pad) {
		this.operatorName = Optional.of(operatorName + (pad ? " " : ""));
	}

	protected void setWrapperMethod(Function<String, String> wrapperMethod) {
		this.wrapperMethod = wrapperMethod;
	}

	protected void resetWrapperMethod() {
		this.wrapperMethod = Function.identity();
	}

	protected void printBodyIfEmpty(boolean printBodyIfEmpty) {
		this.printBodyIfEmpty = printBodyIfEmpty;
	}

	protected void printNameIfEmpty(boolean printNameIfEmpty) {
		this.printNameIfEmpty = printNameIfEmpty;
	}

	@Override
	public String getQueryString() {
		StringBuilder queryString = new StringBuilder();

		if (printNameIfEmpty || !isEmpty()) {
			operatorName.ifPresent(queryString::append);
		}
		if (printBodyIfEmpty || !isEmpty()) {
			queryString.append(wrapperMethod.apply(super.getQueryString()));
		}

		return queryString.toString();
	}
}