public EdmFunction getFunction() { return this.uriResourceFunction.getFunction(); }
private void handleFunctionDispatching(final ODataRequest request, final ODataResponse response, final UriResourceFunction uriResourceFunction) throws ODataApplicationException, ODataLibraryException { EdmFunction function = uriResourceFunction.getFunction(); if (function == null) { function = uriResourceFunction.getFunctionImport().getUnboundFunctions().get(0); } final EdmReturnType returnType = function.getReturnType(); switch (returnType.getType().getKind()) { case ENTITY: handleEntityDispatching(request, response, returnType.isCollection() && uriResourceFunction.getKeyPredicates().isEmpty(), false); break; case PRIMITIVE: handlePrimitiveDispatching(request, response, returnType.isCollection()); break; case COMPLEX: handleComplexDispatching(request, response, returnType.isCollection()); break; default: throw new ODataHandlerException(NOT_IMPLEMENTED_MESSAGE, ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED); } }
public EdmFunction getFunction() { return this.uriResourceFunction.getFunction(); }
private void handleFunctionDispatching(final ODataRequest request, final ODataResponse response, final UriResourceFunction uriResourceFunction) throws ODataApplicationException, ODataLibraryException { EdmFunction function = uriResourceFunction.getFunction(); if (function == null) { function = uriResourceFunction.getFunctionImport().getUnboundFunctions().get(0); } final EdmReturnType returnType = function.getReturnType(); switch (returnType.getType().getKind()) { case ENTITY: handleEntityDispatching(request, response, returnType.isCollection() && uriResourceFunction.getKeyPredicates().isEmpty(), false); break; case PRIMITIVE: handlePrimitiveDispatching(request, response, returnType.isCollection()); break; case COMPLEX: handleComplexDispatching(request, response, returnType.isCollection()); break; default: throw new ODataHandlerException(NOT_IMPLEMENTED_MESSAGE, ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED); } }
@Override public void visit(UriResourceFunction info) { visitOperation(info.getFunction()); }
public static Set<String> getSelectedPropertyNames(final List<SelectItem> selectItems) { Set<String> selected = new HashSet<String>(); for (final SelectItem item : selectItems) { final UriResource resource = item.getResourcePath().getUriResourceParts().get(0); if (resource instanceof UriResourceProperty) { selected.add(((UriResourceProperty) resource).getProperty().getName()); } else if (resource instanceof UriResourceNavigation) { selected.add(((UriResourceNavigation) resource).getProperty().getName()); } else if (resource instanceof UriResourceAction) { selected.add(((UriResourceAction) resource).getAction().getName()); } else if (resource instanceof UriResourceFunction) { selected.add(((UriResourceFunction) resource).getFunction().getName()); } } return selected; }
public static Set<String> getSelectedPropertyNames(final List<SelectItem> selectItems) { Set<String> selected = new HashSet<String>(); for (final SelectItem item : selectItems) { final UriResource resource = item.getResourcePath().getUriResourceParts().get(0); if (resource instanceof UriResourceProperty) { selected.add(((UriResourceProperty) resource).getProperty().getName()); } else if (resource instanceof UriResourceNavigation) { selected.add(((UriResourceNavigation) resource).getProperty().getName()); } else if (resource instanceof UriResourceAction) { selected.add(((UriResourceAction) resource).getAction().getName()); } else if (resource instanceof UriResourceFunction) { selected.add(((UriResourceFunction) resource).getFunction().getName()); } } return selected; }
@SuppressWarnings("unchecked") @Override public <T> List<T> executeFunctionQuery(final List<UriResource> uriResourceParts, final JPADataBaseFunction jpaFunction, final Class<T> resultClass, final EntityManager em) throws ODataApplicationException { final UriResourceFunction uriResourceFunction = (UriResourceFunction) uriResourceParts.get(uriResourceParts.size() - 1); final String queryString = generateQueryString(jpaFunction); final Query functionQuery = em.createNativeQuery(queryString, resultClass); int count = 1; try { for (final JPAParameter parameter : jpaFunction.getParameter()) { final UriParameter uriParameter = findParameterByExternalName(parameter, uriResourceFunction.getParameters()); final Object value = getValue(uriResourceFunction.getFunction(), parameter, uriParameter.getText()); functionQuery.setParameter(count, value); count += 1; } } catch (ODataJPAModelException e) { throw new ODataJPAProcessorException(e, HttpStatusCode.INTERNAL_SERVER_ERROR); } return functionQuery.getResultList(); }
@SuppressWarnings("unchecked") @Override public <T> java.util.List<T> executeFunctionQuery(final List<UriResource> uriResourceParts, final JPADataBaseFunction jpaFunction, final Class<T> resultClass, final EntityManager em) throws ODataApplicationException { final UriResourceFunction uriResourceFunction = (UriResourceFunction) uriResourceParts.get(uriResourceParts.size() - 1); final String queryString = generateQueryString(jpaFunction); final Query functionQuery = em.createNativeQuery(queryString, resultClass); int count = 1; try { for (final JPAParameter parameter : jpaFunction.getParameter()) { final UriParameter uriParameter = findParameterByExternalName(parameter, uriResourceFunction.getParameters()); final Object value = getValue(uriResourceFunction.getFunction(), parameter, uriParameter.getText()); functionQuery.setParameter(count, value); count += 1; } } catch (ODataJPAModelException e) { throw new ODataJPAProcessorException(e, HttpStatusCode.INTERNAL_SERVER_ERROR); } return functionQuery.getResultList(); }
@SuppressWarnings("unchecked") @Override public <T> List<T> executeFunctionQuery(final List<UriResource> uriResourceParts, final JPADataBaseFunction jpaFunction, final Class<T> resultClass, final EntityManager em) throws ODataApplicationException { final String queryString = generateQueryString(jpaFunction); final Query functionQuery = em.createNativeQuery(queryString, resultClass); final UriResourceFunction uriResourceFunction = (UriResourceFunction) uriResourceParts.get(uriResourceParts.size() - 1); int count = 1; try { if (jpaFunction.isBound()) { // TODO Compound key final Object value = ((UriResourceEntitySet) uriResourceParts.get(0)).getKeyPredicates().get(0).getText(); functionQuery.setParameter(count, value); count += 1; } for (int i = count - 1; i < jpaFunction.getParameter().size(); i++) { final JPAParameter parameter = jpaFunction.getParameter().get(i); final UriParameter uriParameter = findParameterByExternalName(parameter, uriResourceFunction.getParameters()); final Object value = getValue(uriResourceFunction.getFunction(), parameter, uriParameter.getText()); functionQuery.setParameter(count, value); count += 1; } } catch (ODataJPAModelException e) { throw new ODataJPAProcessorException(e, HttpStatusCode.INTERNAL_SERVER_ERROR); } return functionQuery.getResultList(); }
JPAParameter jpaParameter = jpaFunction.getParameter(declairedParameter.getName()); if (jpaParameter.getName().equals(providedParameter.getName())) { parameter.add(getValue(uriResourceFunction.getFunction(), jpaParameter, providedParameter.getText())); break;
@Override public void retrieveData(final ODataRequest request, final ODataResponse response, final ContentType responseFormat) throws ODataApplicationException, ODataLibraryException { Object result = null; final UriResourceFunction uriResourceFunction = (UriResourceFunction) uriInfo.getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 1); final JPAFunction jpaFunction = sd.getFunction(uriResourceFunction.getFunction()); if (jpaFunction.getFunctionType() == EdmFunctionType.JavaClass) { result = processJavaFunction(uriResourceFunction, (JPAJavaFunction) jpaFunction, em); } else if (jpaFunction.getFunctionType() == EdmFunctionType.UserDefinedFunction) result = processJavaUDF(uriInfo.getUriResourceParts(), (JPADataBaseFunction) jpaFunction); final EdmType returnType = uriResourceFunction.getFunction().getReturnType().getType(); final Annotatable annotatable = convertResult(result, returnType, jpaFunction); serializeResult(returnType, response, responseFormat, annotatable); }
private EdmTypeKind determineReturnEdmTypeKind(final UriResourcePartTyped operation) { if (operation instanceof UriResourceFunction) return ((UriResourceFunction) operation).getFunction().getReturnType().getType().getKind(); else return ((UriResourceAction) operation).getAction().getReturnType().getType().getKind(); }
private UriType getUriTypeForFunction(final UriResource lastPathSegment) throws UriValidationException { final UriResourceFunction uriFunction = (UriResourceFunction) lastPathSegment; final boolean isCollection = uriFunction.isCollection(); final EdmTypeKind typeKind = uriFunction.getFunction().getReturnType().getType().getKind(); UriType uriType; switch (typeKind) { case ENTITY: uriType = isCollection ? UriType.entitySet : UriType.entity; break; case PRIMITIVE: case ENUM: case DEFINITION: uriType = isCollection ? UriType.propertyPrimitiveCollection : UriType.propertyPrimitive; break; case COMPLEX: uriType = isCollection ? UriType.propertyComplexCollection : UriType.propertyComplex; break; default: throw new UriValidationException("Unsupported function return type: " + typeKind, UriValidationException.MessageKeys.UNSUPPORTED_FUNCTION_RETURN_TYPE, typeKind.toString()); } return uriType; }
private UriType getUriTypeForFunction(final UriResource lastPathSegment) throws UriValidationException { final UriResourceFunction uriFunction = (UriResourceFunction) lastPathSegment; final boolean isCollection = uriFunction.isCollection(); final EdmTypeKind typeKind = uriFunction.getFunction().getReturnType().getType().getKind(); UriType uriType; switch (typeKind) { case ENTITY: uriType = isCollection ? UriType.entitySet : UriType.entity; break; case PRIMITIVE: case ENUM: case DEFINITION: uriType = isCollection ? UriType.propertyPrimitiveCollection : UriType.propertyPrimitive; break; case COMPLEX: uriType = isCollection ? UriType.propertyComplexCollection : UriType.propertyComplex; break; default: throw new UriValidationException("Unsupported function return type: " + typeKind, UriValidationException.MessageKeys.UNSUPPORTED_FUNCTION_RETURN_TYPE, typeKind.toString()); } return uriType; }
private UriType getUriTypeForValue(final UriResource secondLastPathSegment) throws UriValidationException { UriType uriType; switch (secondLastPathSegment.getKind()) { case primitiveProperty: uriType = UriType.propertyPrimitiveValue; break; case entitySet: case navigationProperty: case singleton: uriType = UriType.mediaStream; break; case function: UriResourceFunction uriFunction = (UriResourceFunction) secondLastPathSegment; final EdmFunction function = uriFunction.getFunction(); uriType = function.getReturnType().getType().getKind() == EdmTypeKind.ENTITY ? UriType.mediaStream : UriType.propertyPrimitiveValue; break; default: throw new UriValidationException( "Unexpected kind in path segment before $value: " + secondLastPathSegment.getKind(), UriValidationException.MessageKeys.UNALLOWED_KIND_BEFORE_VALUE, secondLastPathSegment.toString()); } return uriType; }
private UriType getUriTypeForValue(final UriResource secondLastPathSegment) throws UriValidationException { UriType uriType; switch (secondLastPathSegment.getKind()) { case primitiveProperty: uriType = UriType.propertyPrimitiveValue; break; case entitySet: case navigationProperty: case singleton: uriType = UriType.mediaStream; break; case function: UriResourceFunction uriFunction = (UriResourceFunction) secondLastPathSegment; final EdmFunction function = uriFunction.getFunction(); uriType = function.getReturnType().getType().getKind() == EdmTypeKind.ENTITY ? UriType.mediaStream : UriType.propertyPrimitiveValue; break; default: throw new UriValidationException( "Unexpected kind in path segment before $value: " + secondLastPathSegment.getKind(), UriValidationException.MessageKeys.UNALLOWED_KIND_BEFORE_VALUE, secondLastPathSegment.toString()); } return uriType; }
private void requireMediaResourceInCaseOfEntity(UriResource resource) throws UriParserSemanticException { // If the resource is an entity or navigatio if (resource instanceof UriResourceEntitySet && !((UriResourceEntitySet) resource).getEntityType().hasStream() || resource instanceof UriResourceNavigation && !((EdmEntityType) ((UriResourceNavigation) resource).getType()).hasStream()) { throw new UriParserSemanticException("$value on entity is only allowed on media resources.", UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE, resource.getSegmentValue()); } // Functions can also deliver an entity. In this case we have to check if the returned entity is a media resource if (resource instanceof UriResourceFunction) { EdmType returnType = ((UriResourceFunction) resource).getFunction().getReturnType().getType(); //Collection check is above so not needed here if (returnType instanceof EdmEntityType && !((EdmEntityType) returnType).hasStream()) { throw new UriParserSemanticException("$value on returned entity is only allowed on media resources.", UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE, resource.getSegmentValue()); } } }
private void requireMediaResourceInCaseOfEntity(UriResource resource) throws UriParserSemanticException { // If the resource is an entity or navigatio if (resource instanceof UriResourceEntitySet && !((UriResourceEntitySet) resource).getEntityType().hasStream() || resource instanceof UriResourceNavigation && !((EdmEntityType) ((UriResourceNavigation) resource).getType()).hasStream()) { throw new UriParserSemanticException("$value on entity is only allowed on media resources.", UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE, resource.getSegmentValue()); } // Functions can also deliver an entity. In this case we have to check if the returned entity is a media resource if (resource instanceof UriResourceFunction) { EdmType returnType = ((UriResourceFunction) resource).getFunction().getReturnType().getType(); //Collection check is above so not needed here if (returnType instanceof EdmEntityType && !((EdmEntityType) returnType).hasStream()) { throw new UriParserSemanticException("$value on returned entity is only allowed on media resources.", UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE, resource.getSegmentValue()); } } }
@Override public JPAOperator visitMember(final Member member) throws ExpressionVisitException, ODataApplicationException { final int handle = debugger.startRuntimeMeasurement(this, "visitMember"); if (getLambdaType(member.getResourcePath()) == UriResourceKind.lambdaAny) { debugger.stopRuntimeMeasurement(handle); return new JPALambdaAnyOperation(this.jpaComplier, member); } else if (getLambdaType(member.getResourcePath()) == UriResourceKind.lambdaAll) { debugger.stopRuntimeMeasurement(handle); return new JPALambdaAllOperation(this.jpaComplier, member); } else if (isAggregation(member.getResourcePath())) { debugger.stopRuntimeMeasurement(handle); return new JPAAggregationOperationImp(jpaComplier.getRoot(), jpaComplier.getConverter()); } else if (isCustomFunction(member.getResourcePath())) { final UriResource resource = member.getResourcePath().getUriResourceParts().get(0); final JPADataBaseFunction jpaFunction = (JPADataBaseFunction) this.jpaComplier.getSd().getFunction( ((UriResourceFunction) resource).getFunction()); final List<UriParameter> odataParams = ((UriResourceFunction) resource).getParameters(); debugger.stopRuntimeMeasurement(handle); return new JPAFunctionOperator(this, odataParams, jpaFunction); } debugger.stopRuntimeMeasurement(handle); return new JPAMemberOperator(this.jpaComplier.getJpaEntityType(), this.jpaComplier.getRoot(), member, jpaComplier .getAssoziation()); }