All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.fluentxml4j.internal.query.FromNodeImpl Maven / Gradle / Ivy

package com.github.fluentxml4j.internal.query;

import com.github.fluentxml4j.FluentXmlProcessingException;
import com.github.fluentxml4j.namespace.ImmutableNamespaceContext;
import com.github.fluentxml4j.query.QueryFromNode;
import com.github.fluentxml4j.query.SelectMultipleFromNode;
import com.github.fluentxml4j.query.XPathConfigurer;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.namespace.NamespaceContext;
import javax.xml.xpath.XPathExpression;
import java.util.Optional;
import java.util.function.Function;

class FromNodeImpl implements QueryFromNode
{
	private FluentXPathContext context;
	private Node baseNode;

	private NamespaceContext namespaceContext;

	FromNodeImpl(Node baseNode, FluentXPathContext context)
	{
		this.baseNode = baseNode;
		this.context = context;
		this.namespaceContext = new ImmutableNamespaceContext();
	}

	@Override
	public QueryFromNode withNamespaceContext(NamespaceContext namespaceContext)
	{
		this.namespaceContext = namespaceContext;
		return this;
	}

	@Override
	public QueryFromNode withNamespaceMappings(String... namespaceMappings)
	{
		checkImmutableNamespaceContext();

		this.namespaceContext = ((ImmutableNamespaceContext) this.namespaceContext).withMappings(namespaceMappings);
		return this;
	}

	private void checkImmutableNamespaceContext()
	{
		if (!(this.namespaceContext instanceof ImmutableNamespaceContext))
		{
			throw new IllegalStateException("Customized namespace cannot be customized.");
		}
	}

	@Override
	public QueryFromNode withNamespaceMapping(String prefix, String namespaceURI)
	{
		return withNamespaceMappings(prefix, namespaceURI);
	}

	@Override
	public QueryFromNode withXPath(XPathConfigurer xPathConfigurer)
	{
		this.context.setxPathConfigurer(xPathConfigurer);
		return this;
	}

	@Override
	public SelectMultipleFromNode selectStrings(String xPathQuery)
	{
		XPathExpression xPathExpression = this.context.compile(xPathQuery, this.namespaceContext);
		return new SelectMultipleFromNodeImpl<>(baseNode, xPathExpression, ToStringConverter::toString);
	}

	@Override
	public SelectMultipleFromNode selectNodes(String xPathQuery)
	{
		XPathExpression xPathExpression = this.context.compile(xPathQuery, this.namespaceContext);
		return new SelectMultipleFromNodeImpl<>(baseNode, xPathExpression, Function.identity());
	}

	@Override
	public SelectMultipleFromNode selectElements(String xPathQuery)
	{
		XPathExpression xPathExpression = this.context.compile(xPathQuery, this.namespaceContext);
		return new SelectMultipleFromNodeImpl<>(baseNode, xPathExpression, ToElementConverter::toElement);
	}

	@Override
	public Optional selectString(String xPathQuery)
	{
		return selectUniqueNode(xPathQuery, ToStringConverter::toString);
	}

	@Override
	public Optional selectElement(String xPathQuery)
	{
		return selectUniqueNode(xPathQuery, ToElementConverter::toElement);
	}

	@Override
	public Optional selectNode(String xPathQuery)
	{
		return selectUniqueNode(xPathQuery, Function.identity());
	}

	@Override
	public Optional selectInteger(String xPathQuery)
	{
		return selectUniqueNode(xPathQuery, ToIntegerConverter::toInteger);
	}

	@Override
	public Optional selectBoolean(String xPathQuery)
	{
		return selectUniqueNode(xPathQuery, ToBooleanConverter::toBoolean);
	}

	@Override
	public SelectMultipleFromNode selectIntegers(String xPathQuery)
	{
		XPathExpression xPathExpression = this.context.compile(xPathQuery, this.namespaceContext);
		return new SelectMultipleFromNodeImpl<>(baseNode, xPathExpression, ToIntegerConverter::toInteger);
	}

	@Override
	public SelectMultipleFromNode selectBooleans(String xPathQuery)
	{
		XPathExpression xPathExpression = this.context.compile(xPathQuery, this.namespaceContext);
		return new SelectMultipleFromNodeImpl<>(baseNode, xPathExpression, ToBooleanConverter::toBoolean);
	}

	private  Optional selectUniqueNode(String xPathQuery, Function converter)
	{
		NodeList nodeList = selectNodes(xPathQuery).asNodeList();
		int length = nodeList.getLength();
		if (length == 0)
		{
			return Optional.empty();
		}
		else if (length > 1)
		{
			throw new FluentXmlProcessingException("Non unique result.");
		}
		else
		{
			return Optional.ofNullable(converter.apply(nodeList.item(0)));
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy