Setting a ResourcePolicy via REST API?

390 views
Skip to first unread message

Holly Becker

unread,
Jul 11, 2016, 6:46:18 PM7/11/16
to DSpace Technical Support
Hello all,

I'm trying to post bitstream policies to the REST API, and having trouble finding what the correct format for the ResourcePolicy is.  The documentation [1] says a ResourcePolicy is  [{"id":317127,"action":"READ","epersonId":-1,"groupId":0,"resourceId":47166,"resourceType":"bitstream","rpDescription":null,"rpName":null,"rpType":"TYPE_INHERITED","startDate":null,"endDate":null}]  This looks like the policies returned by /rest/bitstreams/?expand=policies  However, when I post that policy or policies that look similar I get a 500 server error [3] on a local install of DSpace 5.

On demo.dspace.org none of the bitstreams have policies, even when I add one in the GUI, and I get a 500 when querying https://demo.dspace.org/rest/bitstreams/?expand=policies When posting a policy, I get different behavior on demo.dspace.org.  It gives a 400 error, but the same exception. [2]

Can someone point me towards more detailed documentation, or provide an explanation of what a ResourcePolicy is supposed to look like?  Is there a better or different way to set bitstream policies through the REST API or SWORD2 API?

Thanks,
-Holly Becker
Archivematica developer

[1] https://wiki.duraspace.org/display/DSDOC5x/REST+API

[2] To reproduce
curl -X POST https://demo.dspace.org/rest/bitstreams/ea41e143-0b2c-447a-a46d-681282c6ff9a/policy --data '[{"id":317127,"action":"READ","epersonId":-1,"groupId":0,"resourceId":47166,"resourceType":"bitstream","rpDescription":null,"rpName":null,"rpType":"TYPE_INHERITED","startDate":null,"endDate":null}]' -u 'dspacede...@gmail.com:dspace' -H 'Content-type: application/json' -k
Response:
Can not deserialize instance of org.dspace.rest.common.ResourcePolicy out of START_ARRAY token
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@43a44ac9; line: 1, column: 1]

Or (in Python2, requires 'requests' library):
import requests
url = 'https://demo.dspace.org/rest/bitstreams/ea41e143-0b2c-447a-a46d-681282c6ff9a/policy'
json_body = [{"id":317127,"action":"READ","epersonId":-1,"groupId":0,"resourceId":47166,"resourceType":"bitstream","rpDescription":None,"rpName":None,"rpType":"TYPE_INHERITED","startDate":None,"endDate":None}]
auth = ('dspacede...@gmail.com', 'dspace')
response = requests.post(url, json=json_body, auth=auth, verify=False)
print response  # <Response [400]>
print response.content  # 'Can not deserialize instance of org.dspace.rest.common.ResourcePolicy out of START_ARRAY token\n at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@32229b7e; line: 1, column: 1]'

[3] Traceback from DSpace 5 server (catalina.out)


Jul 11, 2016 6:13:58 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of org.dspace.rest.common.ResourcePolicy out of START_ARRAY token
 at [Source: org.apache.catalina.connector.CoyoteInputStream@4c4b6dda; line: 1, column: 1]
        at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
        at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219)
        at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212)
        at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromArray(BeanDeserializer.java:869)
        at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:597)
        at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2695)
        at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308)
        at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419)
        at com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139)
        at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:490)
        at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
        at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:86)
        at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
        at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
        at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
        at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
        at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
        at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
        at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

Evgeni Dimitrov

unread,
Jul 12, 2016, 10:38:40 AM7/12/16
to DSpace Technical Support
I think with curl you should do something like this:

curl -X GET -H "Content-Type: application/json" -H "rest-dspace-token: d4020530-ce01-471d-a474-5fb0cea04661" http://localhost:8080/rest/items/2

Holly Becker

unread,
Aug 4, 2016, 4:58:58 PM8/4/16
to DSpace Technical Support
Hi,

That endpoint gives me item information, but doesn't include anything about bitstreams or policies.  Can you clarify your suggestion?

Thanks,
-Holly

Evgeni Dimitrov

unread,
Aug 5, 2016, 5:37:55 AM8/5/16
to DSpace Technical Support
I mean that the documentation says

POST /bitstreams/{bitstream id}/policy

and in what you have
the "ea41e143-0b2c-447a-a46d-681282c6ff9a" looks more like "rest-dspace-token" than "bitstream id"

Holly Becker

unread,
Aug 5, 2016, 1:35:53 PM8/5/16
to DSpace Technical Support
Thanks for the clarification.

The bitstream ID I got from checking https://demo.dspace.org/rest/bitstreams/ and looking at the "link" and "uuid" properties of the bitstreams returned.  https://demo.dspace.org/rest/bitstreams/ea41e143-0b2c-447a-a46d-681282c6ff9a returns bitstream information, so I don't think that's the problem.

What I'm looking for is a description of what a POSTed ResourcePolicy looks like, or otherwise how to set policies on a bitstream through the REST API (or SWORD2 API).

Cheers,
-Holly

Evgeni Dimitrov

unread,
Aug 6, 2016, 5:42:00 AM8/6/16
to DSpace Technical Support
Well, sorry for the "noise" :)

For me (with DSpace 5.4) it looks like this:

curl -X GET  http://localhost:8080/rest/bitstreams/303399

Good luck.

Creel, James Silas

unread,
Aug 8, 2016, 3:04:46 PM8/8/16
to Holly Becker, DSpace Technical Support

Dear Holly,

 

We have had success updating the bitstream policies at the bitstream endpoint rather than the policy endpoint.  You can just embed the policy JSON in the bistream JSON as for example:

 

{"id":235,"name":"dissertation_0.pdf.txt","handle":null,"type":"bitstream","link":"/rest/bitstreams/235","expand":["parent","policies","all"],"bundleName":"TEXT","description":"ocr_text","format":"Text","mimeType":"text/plain","sizeBytes":43,"parentObject":null,"retrieveLink":"/bitstreams/235/retrieve","checkSum":{"value":"2b0144d81300a4a8c4f2a2a891280a84","checkSumAlgorithm":"MD5"},"sequenceId":-1,"policies":[{"action":"READ","groupId":"5","rpType":"TYPE_CUSTOM"}]}

 

That worked on my localhost at the /rest/bitstreams/{bitstream id} endpoint.

 

Best of luck,

 

James

--
You received this message because you are subscribed to the Google Groups "DSpace Technical Support" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dspace-tech...@googlegroups.com.
To post to this group, send email to dspac...@googlegroups.com.
Visit this group at https://groups.google.com/group/dspace-tech.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages