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

it.uniroma2.art.coda.pearl.model.ConverterMapArgument Maven / Gradle / Ivy

There is a newer version: 2.0.2
Show newest version
package it.uniroma2.art.coda.pearl.model;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Literal;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.rio.helpers.NTriplesUtil;

/**
 * A map used as an additional argument in the context of a {@link ConverterMention}. A map argument is
 * considered constant (i.e. {@link #isConstant()} == true), only if its values are themselves
 * constants.
 */
public class ConverterMapArgument extends ConverterArgumentExpression {

	private Map map;

	/**
	 * Constructs an argument based on the provided map of argument expressions.
	 * 
	 * @param map
	 */
	public ConverterMapArgument(Map map) {
		this.map = map;
	}

	@Override
	public Class getArgumentType() {
		return Map.class;
	}

	@Override
	public boolean isConstant() {
		for (ConverterArgumentExpression v : map.values()) {
			if (!v.isConstant())
				return false;
		}

		return true;
	}

	/**
	 * Returns the underlying map of converter expressions
	 * 
	 * @return
	 */
	public Map getMap() {
		return map;
	}

	@Override
	public Object getGroundObject() {
		if (!isConstant())
			throw new UnsupportedOperationException();

		return map.entrySet().stream()
				.collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().getGroundObject()));
	}

	/**
	 * Factory method that constructs a map argument based on a map, the value of which are (constant) RDF
	 * nodes.
	 * 
	 * @param args
	 * @return
	 */
	public static ConverterMapArgument fromNodesMap(Map args) {
		Map temp = new HashMap();

		for (Entry entry : args.entrySet()) {
			Value value = entry.getValue();
			ConverterArgumentExpression valueExpr = null;

			if (value instanceof IRI) {
				valueExpr = new ConverterRDFURIArgument(((IRI) value).stringValue());
			} else if (value instanceof Literal) {
				valueExpr = new ConverterRDFLiteralArgument(NTriplesUtil.toNTriplesString((Literal) value));
			}

			if (valueExpr != null) {
				temp.put(entry.getKey(), valueExpr);
			}
		}

		return new ConverterMapArgument(temp);
	}

	@Override
	public String toString() {
		String text = "{";
		boolean first = true;
		for (String key : map.keySet()) {
			if (!first) {
				text += ",";
			}
			first = false;
			ConverterArgumentExpression converterArgumentExpression = map.get(key);
			text += key + "=" + converterArgumentExpression.toString();
		}

		text += "}";

		return text;
	}

	@Override
	public int hashCode() {
		return map.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null)
			return false;
		if (this == obj)
			return true;
		if (obj.getClass() != this.getClass())
			return false;
		ConverterMapArgument other = (ConverterMapArgument) obj;
		return map.equals(other.map);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy