private void checkNotNull(ElementSymbol param, Object value) throws TeiidComponentException, QueryMetadataException, QueryValidatorException { if (metadata.elementSupports(param.getMetadataID(), SupportConstants.Element.NULL)) { return; } if (metadata.isVariadic(param.getMetadataID())) { if (value instanceof ArrayImpl) { ArrayImpl av = (ArrayImpl) value; for (Object o : av.getValues()) { if (o == null) { throw new QueryValidatorException( QueryPlugin.Event.TEIID30164, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30164, param)); } } } } else if (value == null) { throw new QueryValidatorException( QueryPlugin.Event.TEIID30164, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30164, param)); } }
/** * Invoke the function described in the function descriptor, using the values provided. Return the * result of the function. * * @param values Values that should match 1-to-1 with the types described in the function * descriptor * @param context * @param functionTarget TODO * @param fd Function descriptor describing the name and types of the arguments * @return Result of invoking the function */ public Object invokeFunction(Object[] values, CommandContext context, Object functionTarget) throws FunctionExecutionException, BlockedException { if (!isNullDependent()) { for (int i = requiresContext ? 1 : 0; i < values.length; i++) { if (values[i] == null) { return null; } } } // If descriptor is missing invokable method, find this VM's descriptor // give name and types from fd if (invocationMethod == null) { throw new FunctionExecutionException( QueryPlugin.Event.TEIID30382, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30382, getFullName())); } // Invoke the method and return the result try { if (hasWrappedArgs) { for (int i = 0; i < values.length; i++) { Object val = values[i]; if (val != null && types[i] == DataTypeManager.DefaultDataClasses.VARBINARY) { values[i] = ((BinaryType) val).getBytesDirect(); } } } if (method.isVarArgs()) { if (calledWithVarArgArrayParam) { ArrayImpl av = (ArrayImpl) values[values.length - 1]; if (av != null) { Object[] vals = av.getValues(); values[values.length - 1] = vals; if (hasWrappedArgs && types[types.length - 1] == DataTypeManager.DefaultDataClasses.VARBINARY) { vals = Arrays.copyOf(vals, vals.length); for (int i = 0; i < vals.length; i++) { if (vals[i] != null) { vals[i] = ((BinaryType) vals[i]).getBytesDirect(); } } values[values.length - 1] = vals; } Class<?> arrayType = invocationMethod.getParameterTypes()[types.length - 1]; if (arrayType.getComponentType() != Object.class && vals.getClass() != arrayType) { Object varArgs = Array.newInstance(arrayType.getComponentType(), vals.length); for (int i = 0; i < vals.length; i++) { Array.set(varArgs, i, vals[i]); } values[values.length - 1] = varArgs; } } } else { int i = invocationMethod.getParameterTypes().length; Object[] newValues = Arrays.copyOf(values, i); Object varArgs = null; if (invocationMethod.getParameterTypes()[i - 1].getComponentType() != Object.class) { int varArgCount = values.length - i + 1; varArgs = Array.newInstance( invocationMethod.getParameterTypes()[i - 1].getComponentType(), varArgCount); for (int j = 0; j < varArgCount; j++) { Array.set(varArgs, j, values[i - 1 + j]); } } else { varArgs = Arrays.copyOfRange(values, i - 1, values.length); } newValues[i - 1] = varArgs; values = newValues; } } Object result = invocationMethod.invoke(functionTarget, values); if (context != null && getDeterministic().ordinal() <= Determinism.USER_DETERMINISTIC.ordinal()) { context.setDeterminismLevel(getDeterministic()); } return importValue(result, getReturnType()); } catch (ArithmeticException e) { throw new FunctionExecutionException( QueryPlugin.Event.TEIID30384, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30384, getFullName())); } catch (InvocationTargetException e) { if (e.getTargetException() instanceof BlockedException) { throw (BlockedException) e.getTargetException(); } throw new FunctionExecutionException( QueryPlugin.Event.TEIID30384, e.getTargetException(), QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30384, getFullName())); } catch (IllegalAccessException e) { throw new FunctionExecutionException( QueryPlugin.Event.TEIID30385, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30385, method.toString())); } catch (TransformationException e) { throw new FunctionExecutionException(e); } }