DSpace/DSpace — pull request #666 by ctu-developers (2014-09-29 17:51:30+00:00)
Title: New REST api with CRUD operations.

New REST api with CRUD operations over community, collections, items, bitstreams.

- Developed from version of 31.10.2013, commit 9a626efd9c6f1b375bd90e705694c2061b6c1e5f
- We used Oracle database, version 11g
- All code is formatted with convention of DSpace, except line break, which was setted to 130
- Every method is commented by JavaDoc
- Many changes where done by DRY principle and by book [REST API design rulebook. (2012). Sebastopol, CA: O'Reilly. ISBN: ISBN 978-1-449-31050-9] recommendation

Changes:
* Slash has been removed from list of entities. Reason: This is not right logic of Rest API, by the book.
* Every method is logged. Logged is start and end.
* Changes about context:
- Removed global context in all resources. It was replaced by method for creating context, which is in superclass Resource.
- Autocommit was removed. - We do not want to has operation half-completed. And in case of exception, we want to do rollback of changes. So, every method is fully transactional.
- User can be logged into context. - It is needed for create, update and delete entities.
- Added context exception for exception caused by creation of context. We wanted to have separated SQLExceptions from creation of context and exceptions caused by operation over entities.
* Added logging:
- Logging is provided by token.
- Added class TokenHolder, which holds every information about logged users, created tokens and create tokens.
- Added class User, which has used only for login method.
- Tokens are generated by UUID generator from Java library.
* Writing statistics
- Method pulled up to superclass.
- Moved condition for writing to pulled up class.
- Method is generalized. Parameters are: TypeOfObject, DSpaceObject, Action and other variables for usageEvent.
* Processing Exceptions
- Added method for processing exceptions in superclass.
* Added language support in class MetadataEntry.
* Added getter and setter for subcommunities in Community class. - Bad name (subCommunity2) is because there was problem with parsing XML. (It was throwing exception with message: There is variable with name subCommunity)
* Added superclass Resource.
- It is class for all *Resource classes.
- Provide creating context, exception processing, metadata key splitting, type of action in string and getting logged user from TokenHolder.
- MySplit is there because split from Java library was useable enough.
* All CREATE methods returns created object

* Changes in /Resource/
- Added method for finding entity.
Added check if user has permission to do action with entity or if entity exists. Note: Every resource has method for reading, creating and deleting entities, which are in objects. (Bitstreams in item, collection in community and so on) - Reason: Sometimes is easier to change only type of request from POST to GET. Second reason is better URI structure. Third reason is described in book[rest2012]. Fourth reason, deletion has check if entity is in that entity.

* Changes in /CommunityResource/
- Removed method for returning community in HTML. - It is unusable in Rest API.
- Based on previous changes, changed method for getting community and communities.
- Added method:
- get top community
- get collections of community
- get subcommunity of community
- create top community
- create collection in community
- create subcommunity in community
- update community
- delete community
- delete collection in community
- delete subcommunity in community

* Changes in /CollectionResouce/
- Removed method for returning community in HTML. - It is unusable in Rest API.
- Based on previous changes, changed method for getting collections and collection.
- Added methods:
- get items in collection
- create item in collection
- update collection
- delete collection
- delete item in collection
* Added method for searching collection by name

* Changes in /ItemResource/
- Based on previous changes, changed method for getting item.
- Added methods:
- get items
- There is bug. It sometimes throw SQLException with message: Closed list iteration.
- get item metadata
- get item bitstreams
- add metadata to item
- create bitstream
- It create only bitstream without metadata. Reason: It can be send only InputStream. It can be solved by sending URI in bitstream class and server download file.
- Added parameters in methods for creating of bitstream (direct setting of name of file and its description)
class for policy.
- update metadata of item
- delete item
- delete metadata of item - Maybe unusable.
- delete bitstream in item
- find item by metadata entry
- There was problem with using DSpace API method, so we must write own finding.

* Changes in BitstreamResource
- Based on previous changes, changed method for getting bitstream.
- Change request method at bitstream retrieving to POST. - Reason: In book was wrote, every method which not returning entity must be post. Post is used for creating and for calling methods which are not for returning entity.
- Added methods:
- get bitstreams
- update bitstream
- update bitstream data
- There was must be programmed by editing database, because DSpace API has no method for updating bitstream data.
- delete bitstream
- CRUD operation of policy of bitstreams (per bitstream in item). Added

* Changes in RestIndex
- Updated method which return information about Rest API.
- Added method for testing if Rest API is running.
- Added method for logging and logout.