/* * Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com> * * Licensed 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 com.obidea.semantika.expression.base; import java.util.List; import com.obidea.semantika.datatype.DataType; import com.obidea.semantika.util.Serializer; import com.obidea.semantika.util.StringUtils; /** * A utility class to assign the term its specification. Internal usage only. * * @noextend This class is not intended to be extended by clients. */ public final class TermUtils { private static final String EMPTY = ""; public static IVariable makeVariable(String name) { return new Variable(name, DataType.PLAIN_LITERAL); } public static IVariable makeTypedVariable(String name, String datatype) { return new Variable(name, datatype); } public static ILiteral makePlainLiteral(String value) { return new Literal(value, EMPTY, DataType.PLAIN_LITERAL); } public static ILiteral makePlainLiteral(String value, String lang) { return new Literal(value, lang, DataType.PLAIN_LITERAL); } public static ILiteral makeTypedLiteral(String value, String datatype) { return new Literal(value, EMPTY, datatype); } public static IUriReference makeUriReference(String value) { return new UriReference(value); } public static IFunction makeFunction(String name, List<? extends ITerm> parameters) { return new Function(name, parameters); } public static IFunction makeFunction(FunctionSymbol symbol, List<? extends ITerm> parameters) { return new Function(symbol, parameters); } public static IFunction makeAnd(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.And, t1, t2); } public static IFunction makeOr(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.Or, t1, t2); } public static IFunction makeNot(ITerm t) { return Function.createBuiltInFunction(BuiltInFunction.Not, t); } public static IFunction makeEqual(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.Equal, t1, t2); } public static IFunction makeNotEqual(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.NotEqual, t1, t2); } public static IFunction makeGreaterThan(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.GreaterThan, t1, t2); } public static IFunction makeGreaterThanAndEqualTo(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.GreaterThanEqual, t1, t2); } public static IFunction makeLessThan(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.LessThan, t1, t2); } public static IFunction makeLessThanAndEqualTo(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.LessThanEqual, t1, t2); } public static IFunction makeIsNull(ITerm t) { return Function.createBuiltInFunction(BuiltInFunction.IsNull, t); } public static IFunction makeIsNotNull(ITerm t) { return Function.createBuiltInFunction(BuiltInFunction.IsNotNull, t); } public static IFunction makeAdd(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.Add, t1, t2); } public static IFunction makeSubstract(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.Subtract, t1, t2); } public static IFunction makeMultiply(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.Multiply, t1, t2); } public static IFunction makeDivide(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.Divide, t1, t2); } public static IFunction makeConcat(ITerm t1, ITerm t2) { return Function.createBuiltInFunction(BuiltInFunction.Concat, t1, t2); } public static IFunction makeRegex(ITerm text, ITerm pattern, ITerm flag) { return Function.createBuiltInFunction(BuiltInFunction.Regex, text, pattern, flag); } public static IFunction makeLang(ITerm t) { return Function.createBuiltInFunction(BuiltInFunction.Lang, t); } public static IFunction makeStr(ITerm t) { return Function.createBuiltInFunction(BuiltInFunction.Str, t); } /* * Public utility methods */ public static boolean isVariable(ITerm term) { return (term instanceof IVariable) ? true : false; } public static boolean isLiteral(ITerm term) { return (term instanceof ILiteral) ? true : false; } public static boolean isUriReference(ITerm term) { return (term instanceof IUriReference) ? true : false; } public static boolean isFunction(ITerm term) { return (term instanceof IFunction) ? true : false; } public static ITerm copy(ITerm term) { return (ITerm) Serializer.copy(term); } public static IVariable copy(IVariable variable) { return (IVariable) Serializer.copy(variable); } public static ILiteral copy(ILiteral literal) { return (ILiteral) Serializer.copy(literal); } public static IUriReference copy(IUriReference uriReference) { return (IUriReference) Serializer.copy(uriReference); } public static IFunction copy(IFunction function) { return (IFunction) Serializer.copy(function); } public static IVariable asVariable(ITerm term) { return (IVariable) term; } public static IConstant asConstant(ITerm term) { return (IConstant) term; } public static ILiteral asLiteral(ITerm term) { return (ILiteral) term; } public static IUriReference asUriReference(ITerm term) { return (IUriReference) term; } public static IFunction asFunction(ITerm term) { return (IFunction) term; } /** * Prints out the string representation of the given <code>term</code>. * * @param term * the input term * @return the syntactic representation of the input term. */ public static String toString(ITerm term) { if (term == null) { return ""; //$NON-NLS-1$ } else { StringBuilder sb = new StringBuilder(); toString(term, sb); return sb.toString(); } } /** * Writes the string representation of the given <code>term</code> * to the <code>stringCache</code>. * * @param term * the input term * @param stringCache * the string cache */ public static void toString(ITerm term, StringBuilder stringCache) { if (term instanceof IVariable) { IVariable var = (IVariable) term; stringCache.append(var.getName()); //$NON-NLS-1$ } else if (term instanceof IConstant) { IConstant constant = (IConstant) term; if (constant instanceof ILiteral) { ILiteral literal = (ILiteral) constant; stringCache.append("\"").append(literal.getValue()); //$NON-NLS-1$ if (!StringUtils.isEmpty(literal.getLanguageTag())) { stringCache.append("@"); //$NON-NLS-1$ stringCache.append(literal.getLanguageTag()); } stringCache.append("\""); //$NON-NLS-1$ } else if (constant instanceof IUriReference) { IUriReference uriRef = (IUriReference) constant; stringCache.append(uriRef.toUri()); } else if (constant instanceof NullValue) { NullValue nullValue = (NullValue) constant; stringCache.append(nullValue.getLexicalValue()); } else { stringCache.append(constant.getLexicalValue()); } } else if (term instanceof IFunction) { IFunction fun = (IFunction) term; stringCache.append(fun.getName()); stringCache.append("("); //$NON-NLS-1$ boolean needComma = false; for (ITerm arg : fun.getParameters()) { if (needComma) { stringCache.append(","); //$NON-NLS-1$ } toString(arg, stringCache); needComma = true; } stringCache.append(")"); //$NON-NLS-1$ } } }