private void sendResults( final DataRequest request, final ODataSQLBuilder visitor, final BaseResponse queryResponse, EntitySetResponse response) throws ODataApplicationException, SerializerException { if (request.getPreference(ODATA_MAXPAGESIZE) != null) { response.writeHeader( PREFERENCE_APPLIED, ODATA_MAXPAGESIZE + "=" + request.getPreference(ODATA_MAXPAGESIZE)); // $NON-NLS-1$ } EntityCollectionResponse result = (EntityCollectionResponse) queryResponse; if (result.getNextToken() != null) { try { String nextUri = request.getODataRequest().getRawBaseUri() + request.getODataRequest().getRawODataPath() + "?" + buildNextToken( request.getODataRequest().getRawQueryPath(), result.getNextToken()); result.setNext(new URI(nextUri)); } catch (URISyntaxException e) { throw new ODataApplicationException(e.getMessage(), 500, Locale.getDefault(), e); } catch (MalformedURLException e) { throw new ODataApplicationException(e.getMessage(), 500, Locale.getDefault(), e); } } response.writeReadEntitySet(visitor.getContext().getEdmEntityType(), result); }
@Test public void getPrevHref() { EntityPager pager = new EntityPager(0, 15, 30l, null); EntityCollectionResponse response = new EntityCollectionResponse(pager, null, "/test", entityMetaData, permissionService); assertNull(response.getPrevHref()); pager = new EntityPager(15, 15, 30l, null); response = new EntityCollectionResponse(pager, null, "/test", entityMetaData, permissionService); assertEquals(response.getPrevHref(), "/test?start=0&num=15"); pager = new EntityPager(30, 15, 30l, null); response = new EntityCollectionResponse(pager, null, "/test", entityMetaData, permissionService); assertEquals(response.getPrevHref(), "/test?start=15&num=15"); }
@Test public void getNextHref() { EntityPager pager = new EntityPager(0, 10, 25l, null); EntityCollectionResponse response = new EntityCollectionResponse(pager, null, "/test", entityMetaData, permissionService); assertEquals(response.getNextHref(), "/test?start=10&num=10"); pager = new EntityPager(10, 10, 25l, null); response = new EntityCollectionResponse(pager, null, "/test", entityMetaData, permissionService); assertEquals(response.getNextHref(), "/test?start=20&num=10"); pager = new EntityPager(0, 25, 25l, null); response = new EntityCollectionResponse(pager, null, "/test", entityMetaData, permissionService); assertNull(response.getNextHref()); }
@Override public void upsertEntity( DataRequest request, Entity entity, boolean merge, String entityETag, EntityResponse response) throws ODataLibraryException, ODataApplicationException { final ODataSQLBuilder visitor = new ODataSQLBuilder( this.odata, getClient().getMetadataStore(), this.prepared, true, request.getODataRequest().getRawBaseUri(), this.serviceMetadata, this.nameGenerator); visitor.visit(request.getUriInfo()); final EntityCollectionResponse queryResponse; try { Query query = visitor.selectQuery(); queryResponse = (EntityCollectionResponse) executeQuery(request, request.isCountRequest(), visitor, query); } catch (Exception e) { throw new ODataApplicationException( e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.getDefault(), e); } if (!queryResponse.getEntities().isEmpty()) { updateEntity(request, entity, merge, entityETag, response); } else { createEntity(request, entity, response); } }
@Override public void createEntity(DataRequest request, Entity entity, EntityResponse response) throws ODataLibraryException, ODataApplicationException { EdmEntityType entityType = request.getEntitySet().getEntityType(); String txn; try { txn = getClient().startTransaction(); } catch (SQLException e) { throw new ODataApplicationException( e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.getDefault(), e); } boolean success = false; try { List<ExpandNode> expands = new ArrayList<TeiidServiceHandler.ExpandNode>(); UpdateResponse updateResponse = performDeepInsert( request.getODataRequest().getRawBaseUri(), request.getUriInfo(), entityType, entity, expands); if (updateResponse != null && updateResponse.getUpdateCount() == 1) { ODataSQLBuilder visitor = new ODataSQLBuilder( this.odata, getClient().getMetadataStore(), true, false, request.getODataRequest().getRawBaseUri(), this.serviceMetadata, this.nameGenerator); Query query = visitor.selectWithEntityKey( entityType, entity, updateResponse.getGeneratedKeys(), expands); LogManager.logDetail( LogConstants.CTX_ODATA, null, "created entity = ", entityType.getName(), " with key=", query.getCriteria().toString()); // $NON-NLS-1$ //$NON-NLS-2$ EntityCollectionResponse result = new EntityCollectionResponse( request.getODataRequest().getRawBaseUri(), visitor.getContext()); getClient().executeSQL(query, visitor.getParameters(), false, null, null, null, 1, result); if (!result.getEntities().isEmpty()) { entity = result.getEntities().get(0); String location = EntityResponse.buildLocation( request.getODataRequest().getRawBaseUri(), entity, request.getEntitySet().getName(), entityType); entity.setId(new URI(location)); } response.writeCreatedEntity(request.getEntitySet(), entity); } else { response.writeNotModified(); } getClient().commit(txn); success = true; } catch (SQLException e) { throw new ODataApplicationException( e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.getDefault(), e); } catch (URISyntaxException e) { throw new ODataApplicationException( e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.getDefault(), e); } catch (TeiidException e) { throw new ODataApplicationException( e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.getDefault(), e); } catch (EdmPrimitiveTypeException e) { throw new ODataApplicationException( e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.getDefault(), e); } finally { if (!success) { try { getClient().rollback(txn); } catch (SQLException e1) { // ignore } } } }