From 9a666bd957c87f79813dcbff24709da60e4c823f Mon Sep 17 00:00:00 2001 From: Klaus Straubinger Date: Fri, 6 Mar 2015 15:41:50 +0100 Subject: [PATCH] [OLINGO-557] more function imports for technical service Change-Id: If789d9f289ebc71a4bc98df6998d319a355593ae Signed-off-by: Christian Amend --- .../tecsvc/client/FunctionImportITCase.java | 62 ++++++++++ .../server/tecsvc/data/DataProvider.java | 5 + .../server/tecsvc/data/FunctionData.java | 55 +++++++++ .../TechnicalPrimitiveComplexProcessor.java | 116 +++++++++++++----- .../tecsvc/provider/FunctionProvider.java | 6 +- .../tecsvc/provider/SchemaProvider.java | 2 + 6 files changed, 213 insertions(+), 33 deletions(-) diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java index 54ce6fa56..b2d5738c7 100644 --- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java @@ -22,14 +22,21 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.Collections; +import java.util.Iterator; import java.util.List; +import org.apache.commons.io.IOUtils; import org.apache.olingo.client.api.ODataClient; import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest; +import org.apache.olingo.client.api.communication.request.retrieve.ODataRawRequest; +import org.apache.olingo.client.api.communication.request.retrieve.ODataValueRequest; import org.apache.olingo.client.api.communication.response.ODataInvokeResponse; +import org.apache.olingo.client.api.communication.response.ODataRawResponse; +import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse; import org.apache.olingo.client.core.ODataClientFactory; import org.apache.olingo.commons.api.domain.ODataEntity; import org.apache.olingo.commons.api.domain.ODataEntitySet; +import org.apache.olingo.commons.api.domain.ODataPrimitiveValue; import org.apache.olingo.commons.api.domain.ODataProperty; import org.apache.olingo.commons.api.domain.ODataValue; import org.apache.olingo.commons.api.format.ODataFormat; @@ -82,6 +89,61 @@ public class FunctionImportITCase extends AbstractBaseTestITCase { assertEquals("2", property.getPrimitiveValue().toValue()); } + + @Test + public void countEntityCollection() throws Exception { + final ODataRawRequest request = getClient().getRetrieveRequestFactory() + .getRawRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI) + .appendOperationCallSegment("FICRTCollESMedia").count().build()); + final ODataRawResponse response = request.execute(); + assertEquals("4", IOUtils.toString(response.getRawResponse())); + } + + @Test + public void complexWithPath() throws Exception { + final ODataInvokeRequest request = getClient().getInvokeRequestFactory() + .getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI) + .appendOperationCallSegment("FICRTCTTwoPrim").appendPropertySegment("PropertyInt16").build(), + ODataProperty.class); + assertNotNull(request); + + final ODataInvokeResponse response = request.execute(); + assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode()); + + final ODataProperty property = response.getBody(); + assertNotNull(property); + assertEquals(16, property.getPrimitiveValue().toValue()); + } + + @Test + public void primitiveCollection() throws Exception { + final ODataInvokeRequest request = getClient().getInvokeRequestFactory() + .getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI) + .appendOperationCallSegment("FICRTCollString").build(), ODataProperty.class); + assertNotNull(request); + + final ODataInvokeResponse response = request.execute(); + assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode()); + + final ODataProperty property = response.getBody(); + assertNotNull(property); + assertNotNull(property.getCollectionValue()); + assertEquals(3, property.getCollectionValue().size()); + Iterator iterator = property.getCollectionValue().iterator(); + assertEquals("Employee1@company.example", iterator.next().asPrimitive().toValue()); + assertEquals("Employee2@company.example", iterator.next().asPrimitive().toValue()); + assertEquals("Employee3@company.example", iterator.next().asPrimitive().toValue()); + } + + @Test + public void primitiveValue() throws Exception { + final ODataValueRequest request = getClient().getRetrieveRequestFactory() + .getPropertyValueRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI) + .appendOperationCallSegment("FICRTString").appendValueSegment().build()); + final ODataRetrieveResponse response = request.execute(); + assertEquals("UFCRTString string value", response.getBody().toValue()); + } + @Override protected ODataClient getClient() { ODataClient odata = ODataClientFactory.getClient(); diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java index 9ef9e7b87..bc9b68fa2 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java @@ -408,6 +408,11 @@ public class DataProvider { return FunctionData.entityFunction(function.getName(), parameters, data); } + public Property readFunctionPrimitiveComplex(final EdmFunction function, final List parameters) + throws DataProviderException { + return FunctionData.primitiveComplexFunction(function.getName(), parameters, data); + } + public void setEdm(final Edm edm) { this.edm = edm; } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java index faa099b21..5e0c30bcf 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java @@ -18,12 +18,17 @@ */ package org.apache.olingo.server.tecsvc.data; +import java.util.Arrays; import java.util.List; import java.util.Map; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.EntitySet; +import org.apache.olingo.commons.api.data.Property; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.core.data.EntitySetImpl; +import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.tecsvc.data.DataProvider.DataProviderException; @@ -64,4 +69,54 @@ public class FunctionData { throw new DataProviderException("Function " + name + " is not yet implemented."); } } + + @SuppressWarnings("unchecked") + protected static Property primitiveComplexFunction(final String name, final List parameters, + final Map data) throws DataProviderException { + if (name.equals("UFNRTInt16")) { + return DataCreator.createPrimitive(name, 12345); + } else if (name.equals("UFCRTString")) { + return DataCreator.createPrimitive(name, "UFCRTString string value"); + } else if (name.equals("UFCRTCollString")) { + return data.get("ESCollAllPrim").getEntities().get(0).getProperty("CollPropertyString"); + } else if (name.equals("UFCRTCTTwoPrim")) { + return DataCreator.createComplex(name, + DataCreator.createPrimitive("PropertyInt16", 16), + DataCreator.createPrimitive("PropertyString", "UFCRTCTTwoPrim string value")); + } else if (name.equals("UFCRTCTTwoPrimParam")) { + try { + return DataCreator.createComplex(name, + DataCreator.createPrimitive("PropertyInt16", + EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int16).valueOfString( + getParameterText("ParameterInt16", parameters), + null, null, null, null, null, Short.class)), + DataCreator.createPrimitive("PropertyString", + EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String).valueOfString( + EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String).fromUriLiteral( + getParameterText("ParameterString", parameters)), + null, null, null, null, null, String.class))); + } catch (final EdmPrimitiveTypeException e) { + throw new DataProviderException("Error in function " + name + ".", e); + } + } else if (name.equals("UFCRTCollCTTwoPrim")) { + return DataCreator.createComplexCollection(name, + Arrays.asList(DataCreator.createPrimitive("PropertyInt16", 16), + DataCreator.createPrimitive("PropertyString", "Test123")), + Arrays.asList(DataCreator.createPrimitive("PropertyInt16", 17), + DataCreator.createPrimitive("PropertyString", "Test456")), + Arrays.asList(DataCreator.createPrimitive("PropertyInt16", 18), + DataCreator.createPrimitive("PropertyString", "Test678"))); + } else { + throw new DataProviderException("Function " + name + " is not yet implemented."); + } + } + + private static String getParameterText(final String name, final List parameters) { + for (final UriParameter parameter : parameters) { + if (parameter.getName().equals(name)) { + return parameter.getText(); + } + } + return null; + } } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java index bf1ffb52e..6d322d864 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Locale; import org.apache.olingo.commons.api.data.ContextURL; +import org.apache.olingo.commons.api.data.ContextURL.Builder; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.edm.EdmComplexType; @@ -31,7 +32,10 @@ import org.apache.olingo.commons.api.edm.EdmEntitySet; import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmProperty; +import org.apache.olingo.commons.api.edm.EdmReturnType; import org.apache.olingo.commons.api.edm.EdmStructuredType; +import org.apache.olingo.commons.api.edm.EdmType; +import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.commons.api.http.HttpHeader; @@ -61,6 +65,7 @@ import org.apache.olingo.server.api.uri.UriHelper; import org.apache.olingo.server.api.uri.UriInfo; import org.apache.olingo.server.api.uri.UriInfoResource; import org.apache.olingo.server.api.uri.UriResource; +import org.apache.olingo.server.api.uri.UriResourceFunction; import org.apache.olingo.server.api.uri.UriResourceKind; import org.apache.olingo.server.api.uri.UriResourceProperty; import org.apache.olingo.server.api.uri.queryoption.ExpandOption; @@ -203,7 +208,12 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor final List path = getPropertyPath(resourceParts, 0); final Entity entity = readEntity(uriInfo); - final Property property = getPropertyData(entity, path); + final Property property = + entity == null ? + getPropertyData(dataProvider.readFunctionPrimitiveComplex(((UriResourceFunction) resourceParts.get(0)) + .getFunction(), + ((UriResourceFunction) resourceParts.get(0)).getParameters()), path) : + getPropertyData(entity, path); if (property == null) { throw new ODataApplicationException("Nothing found.", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ROOT); @@ -211,38 +221,49 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor if (property.getValue() == null) { response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode()); } else { - final EdmProperty edmProperty = ((UriResourceProperty) resourceParts.get(resourceParts.size() - 1)) - .getProperty(); + final EdmProperty edmProperty = path.isEmpty() ? null : + ((UriResourceProperty) resourceParts.get(resourceParts.size() - 1)).getProperty(); + final EdmType type = edmProperty == null ? + ((UriResourceFunction) resourceParts.get(0)).getType() : + edmProperty.getType(); + final EdmReturnType returnType = resourceParts.get(0) instanceof UriResourceFunction ? + ((UriResourceFunction) resourceParts.get(0)).getFunction().getReturnType() : null; final ODataFormat format = ODataFormat.fromContentType(contentType); ODataSerializer serializer = odata.createSerializer(format); final ExpandOption expand = uriInfo.getExpandOption(); final SelectOption select = uriInfo.getSelectOption(); - final UriHelper helper = odata.createUriHelper(); final ContextURL contextURL = format == ODataFormat.JSON_NO_METADATA ? null : - ContextURL.with().entitySet(edmEntitySet) - .keyPath(helper.buildKeyPredicate(edmEntitySet.getEntityType(), entity)) - .navOrPropertyPath(buildPropertyPath(path)) - .selectList(edmProperty.isPrimitive() ? null : - helper.buildContextURLSelectList((EdmStructuredType) edmProperty.getType(), expand, select)) - .build(); + getContextUrl(edmEntitySet, entity, path, type, representationType, expand, select); switch (representationType) { case PRIMITIVE: - response.setContent(serializer.primitive((EdmPrimitiveType) edmProperty.getType(), property, - PrimitiveSerializerOptions.with().contextURL(contextURL).facetsFrom(edmProperty).build())); + response.setContent(serializer.primitive((EdmPrimitiveType) type, property, + PrimitiveSerializerOptions.with().contextURL(contextURL) + .nullable(edmProperty == null ? returnType.isNullable() : edmProperty.isNullable()) + .maxLength(edmProperty == null ? returnType.getMaxLength() : edmProperty.getMaxLength()) + .precision(edmProperty == null ? returnType.getPrecision() : edmProperty.getPrecision()) + .scale(edmProperty == null ? returnType.getScale() : edmProperty.getScale()) + .unicode(edmProperty == null ? null : edmProperty.isUnicode()) + .build())); break; case COMPLEX: - response.setContent(serializer.complex((EdmComplexType) edmProperty.getType(), property, + response.setContent(serializer.complex((EdmComplexType) type, property, ComplexSerializerOptions.with().contextURL(contextURL) .expand(expand).select(select) .build())); break; case COLLECTION_PRIMITIVE: - response.setContent(serializer.primitiveCollection((EdmPrimitiveType) edmProperty.getType(), property, - PrimitiveSerializerOptions.with().contextURL(contextURL).facetsFrom(edmProperty).build())); + response.setContent(serializer.primitiveCollection((EdmPrimitiveType) type, property, + PrimitiveSerializerOptions.with().contextURL(contextURL) + .nullable(edmProperty == null ? returnType.isNullable() : edmProperty.isNullable()) + .maxLength(edmProperty == null ? returnType.getMaxLength() : edmProperty.getMaxLength()) + .precision(edmProperty == null ? returnType.getPrecision() : edmProperty.getPrecision()) + .scale(edmProperty == null ? returnType.getScale() : edmProperty.getScale()) + .unicode(edmProperty == null ? null : edmProperty.isUnicode()) + .build())); break; case COLLECTION_COMPLEX: - response.setContent(serializer.complexCollection((EdmComplexType) edmProperty.getType(), property, + response.setContent(serializer.complexCollection((EdmComplexType) type, property, ComplexSerializerOptions.with().contextURL(contextURL) .expand(expand).select(select) .build())); @@ -277,22 +298,25 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor } } - private Property getPropertyData(final Entity entity, final List path) - throws ODataApplicationException { - Property property = entity.getProperty(path.get(0)); - for (final String name : path.subList(1, path.size())) { - if (property != null && (property.isComplex() || property.isComplex())) { - final List complex = property.asComplex().getValue(); - property = null; + private Property getPropertyData(final Entity entity, final List path) { + return getPropertyData(entity.getProperty(path.get(0)), path.subList(1, path.size())); + } + + private Property getPropertyData(final Property property, final List path) { + Property result = property; + for (final String name : path) { + if (result != null && property.isComplex()) { + final List complex = result.asComplex().getValue(); + result = null; for (final Property innerProperty : complex) { if (innerProperty.getName().equals(name)) { - property = innerProperty; + result = innerProperty; break; } } } } - return property; + return result; } private List getPropertyPath(final List path, final int trailing) { @@ -313,6 +337,24 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor return result.toString(); } + private ContextURL getContextUrl(final EdmEntitySet entitySet, final Entity entity, final List path, + final EdmType type, final RepresentationType representationType, + final ExpandOption expand, final SelectOption select) throws SerializerException { + final UriHelper helper = odata.createUriHelper(); + Builder builder = ContextURL.with(); + builder = entitySet == null ? + representationType == RepresentationType.PRIMITIVE || representationType == RepresentationType.COMPLEX ? + builder.type(type) : + builder.type(type).asCollection() : + builder.entitySet(entitySet).keyPath(helper.buildKeyPredicate(entitySet.getEntityType(), entity)); + if (entitySet != null && !path.isEmpty()) { + builder = builder.navOrPropertyPath(buildPropertyPath(path)); + } + builder = builder.selectList(type.getKind() == EdmTypeKind.PRIMITIVE ? null : + helper.buildContextURLSelectList((EdmStructuredType) type, expand, select)); + return builder.build(); + } + @Override public void readPrimitiveValue(final ODataRequest request, ODataResponse response, final UriInfo uriInfo, final ContentType contentType) throws ODataApplicationException, SerializerException { @@ -324,19 +366,33 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor final List resourceParts = resource.getUriResourceParts(); final List path = getPropertyPath(resourceParts, 1); - final Property property = getPropertyData(readEntity(uriInfo), path); + final Entity entity = readEntity(uriInfo); + final Property property = entity == null ? + dataProvider.readFunctionPrimitiveComplex(((UriResourceFunction) resourceParts.get(0)).getFunction(), + ((UriResourceFunction) resourceParts.get(0)).getParameters()) : + getPropertyData(entity, path); if (property == null || property.getValue() == null) { response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode()); } else { - final EdmProperty edmProperty = ((UriResourceProperty) resourceParts.get(resourceParts.size() - 2)) - .getProperty(); - final EdmPrimitiveType type = (EdmPrimitiveType) edmProperty.getType(); + final EdmProperty edmProperty = path.isEmpty() ? null : + ((UriResourceProperty) resourceParts.get(resourceParts.size() - 2)).getProperty(); + final EdmPrimitiveType type = (EdmPrimitiveType) (edmProperty == null ? + ((UriResourceFunction) resourceParts.get(0)).getType() : + edmProperty.getType()); + final EdmReturnType returnType = resourceParts.get(0) instanceof UriResourceFunction ? + ((UriResourceFunction) resourceParts.get(0)).getFunction().getReturnType() : null; final FixedFormatSerializer serializer = odata.createFixedFormatSerializer(); response.setContent(type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Binary) ? serializer.binary((byte[]) property.getValue()) : serializer.primitiveValue(type, property.getValue(), - PrimitiveValueSerializerOptions.with().facetsFrom(edmProperty).build())); + PrimitiveValueSerializerOptions.with() + .nullable(edmProperty == null ? returnType.isNullable() : edmProperty.isNullable()) + .maxLength(edmProperty == null ? returnType.getMaxLength() : edmProperty.getMaxLength()) + .precision(edmProperty == null ? returnType.getPrecision() : edmProperty.getPrecision()) + .scale(edmProperty == null ? returnType.getScale() : edmProperty.getScale()) + .unicode(edmProperty == null ? null : edmProperty.isUnicode()) + .build())); response.setHeader(HttpHeader.CONTENT_TYPE, contentType.toContentTypeString()); response.setStatusCode(HttpStatusCode.OK.getStatusCode()); } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/FunctionProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/FunctionProvider.java index 1892e4e2d..058807db0 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/FunctionProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/FunctionProvider.java @@ -253,7 +253,7 @@ public class FunctionProvider { } else if (functionName.equals(nameUFCRTCollETTwoKeyNavParam)) { return Arrays.asList( new Function() - .setName("UFCRTESTwoKeyNavParam") + .setName(functionName.getName()) .setParameters(Collections.singletonList( new Parameter() .setName("ParameterInt16") @@ -375,7 +375,7 @@ public class FunctionProvider { } else if (functionName.equals(nameUFCRTCollETMixPrimCollCompTwoParam)) { return Arrays.asList( new Function() - .setName("UFNRTESMixPrimCollCompTwoParam") + .setName(functionName.getName()) .setParameters(Arrays.asList( new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(false), new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false))) @@ -400,7 +400,7 @@ public class FunctionProvider { } else if (functionName.equals(nameUFCRTESMixPrimCollCompTwoParam)) { return Arrays.asList( new Function() - .setName("UFCRTESMixPrimCollCompTwoParam") + .setName(functionName.getName()) .setParameters(Arrays.asList( new Parameter().setName("ParameterString").setType(PropertyProvider.nameString).setNullable(false), new Parameter().setName("ParameterInt16").setType(PropertyProvider.nameInt16).setNullable(false) diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java index c0bb6c120..4c3652961 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java @@ -127,6 +127,7 @@ public class SchemaProvider { functions.addAll(prov.getFunctions(FunctionProvider.nameUFNRTInt16)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETKeyNav)); + functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETTwoKeyNav)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETTwoKeyNavParam)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETTwoKeyNavParamCTTwoPrim)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTStringTwoParam)); @@ -140,6 +141,7 @@ public class SchemaProvider { functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCTTwoPrim)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollCTTwoPrim)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETMedia)); + functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollETMedia)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTCollETMixPrimCollCompTwoParam)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTETAllPrimTwoParam)); functions.addAll(prov.getFunctions(FunctionProvider.nameUFCRTESMixPrimCollCompTwoParam));