Page History
Warning | ||
---|---|---|
| ||
As of DSpace 6.0, the Lightweight Network Interface (LNI) is no longer provided with DSpace out-of-the-box. However, the codebase is still available (in an unmaintained state) at https://github.com/DSpace/dspace-lni If LNI is of importance to you or your institution, please get it touch, and we can work to provide you the "keys" to this old codebase. |
Warning |
---|
NOTE: This page was copied from the old MoinMoin wiki and contains many markup artifacts and incorrect translations. Consult the the original page preserved here if you need precise answers about URI syntax, identifiers, etc. |
...
Some example URIs:
Code Block |
---|
Site http://uni.edu/dspace/dav
Lookup http://uni.edu/dspace/dav/lookup/handle/1721.1/46
http://uni.edu/dspace/dav/lookup/handle/1721.1%2F46
http://uni.edu/dspace/dav/lookup/bitstream-handle/13/1721.1%2F46
Community http://uni.edu/dspace/dav/dso_1721.1$46
Collection http://uni.edu/dspace/dav/dso_1721.1$3549
Item http://uni.edu/dspace/dav/dso_1721.1$5543
http://uni.edu/dspace/dav/dso_1721.1$3549/dso_1721.1$5543
Bitstream http://uni.edu/dspace/dav/dso_1721.1$5543/bitstream_13
Bitstream http://uni.edu/dspace/dav/dso_1721.1$5543/bitstream_13.pdf
|
...
For example, the first URI visits all of the collections and communities in the whole Site, while the second only shows Collections under a given Community (avoiding sub-Communities):
Code Block |
---|
http://uni.edu/dspace/dav/?type=COMMUNITY&type=COLLECTION
http://uni.edu/dspace/dav/dso_1721.1$3549?type=collection
|
...
Some examples of GET requests:
Code Block |
---|
GET /dspace/dav/dso_1721.1$5543?package=METS&dmd=MODS
GET /dspace/dav/dso_1721.1$5543/bitstream_13
GET /dspace/dav/dso_1721.1$5543/bitstream_13.pdf
|
...
For example, to add a new item to the Collection at handle 1721.1/3549
, we observe the following request and response:
Code Block |
---|
Request: PUT /dspace/dav/dso_1721.1$3549?package=OCW-IMSCP
....package contents in body...
Response: HTTP/1.1 201 OK
Location: http://uni.edu/dspace/dav/dso_1721.1$F5549
....other headers....
|
...
The client makes inquiries about properties with the `PROPFIND` method, and the query itself is defined by the `propfind` XML element supplied
in the request body. For example, this query gets the `displayname` WebDAV property,
`dspace:type` (DSpace object type), and `getlastmodified` (the WebDAV last-modified time):
Code Block |
---|
<propfind xmlns="DAV:">
<prop xmlns:dspace="http://www.dspace.org/xmlns/dspace">
<displayname/>
<getlastmodified/>
<dspace:type/>
</prop>
</propfind>
|
The result of a `PROPFIND` is a multistatus}}element, which contains the status (success/failure) of the query of each property on each resource, and the property values in `propstat` elements. This example returns successfully for the {{"displayname"
and `dspace:type` properties, and fails to access the "getlastmodified"
property:
Code Block |
---|
<multistatus xmlns="DAV:">
<response>
<href>/dspace/dav/dso_1721.1$5543</href>
<propstat xmlns:dspace="http://www.dspace.org/xmlns/dspace">
<prop>
<displayname>Zen and the Art of Java Maintenance</displayname>
<dspace:type>
<dspace:item/>
</dspace:type>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
<propstat>
<prop>
<getlastmodified/>
</prop>
<status>HTTP/1.1 403 Forbidden<status>
<responsedescription>
You do not have the right to read getlastmodified.
</responsedescription>
</propstat>
</response>
</multistatus>
|
...
Here is an example that changes (or adds) the `displayname` property and removes `dspace:license`:
Code Block |
---|
<propertyupdate xmlns="DAV:" xmlns:dspace="http://www.dspace.org/xmlns/dspace">
<set>
<prop>
<displayname>Zen and the Art of Java Maintenance</displayname>
</prop>
</set>
<remove>
<prop>
<dspace:license>
</prop>
</remove>
</propertyupdate>
|
...
The `logo` attribute's value is a bitstream of an image. It is represented by the `dspace:bitstream` XML element, which gives the choice of encoding the bitstream as either a link (to an external resource) or inline base64-encoded data. The inline encoding should only be used for small (a few Kb) images. This example shows both alternatives:
Code Block |
---|
<!-- link to external resource -->
<dspace:bitstream>
<dspace:link href="http://dspace.myuniv.edu/dspace/dav/retrieve_54321" />
</dspace:bitstream>
<!-- inline encoding -->
<dspace:bitstream>
<dspace:content contenttype="image/gif" contentlength="299" contentencoding="base64">
...text of base64-encoded data...
</dspace:content>
</dspace:bitstream>
|
...
Note |
---|
Every feature of the LNI is available through WebDAV (HTTP); this API is provided for callers who prefer to use SOAP RPCs where possible. |
Code Block |
---|
public class org.dspace.app.dav.client.LNISoapServlet {
/**
*** Returns Resource URI for the DSpace Object whose persistent
*** identifier (i.e. Handle) is "handle". Optionally add Persistent ID
*** (sequence ID) of a bitstream under the Item, if a URI to a bitstream
*** is desired, otherwise bitstreamPID should be null.
*** This does the same thing as the /lookup URI.
***/
public String lookup(String handle, String bitstreamPID)
throws java.rmi.RemoteException, org.dspace.app.dav.client.LNIRemoteException
/**
*** Same as PROPFIND WebDAV method. "uri" may be relative to DSpace LNI
*** prefix, or absolute; "propfind" is the propfind element, and depth is
*** the content of the "Depth:" header. Depth should be 0, 1, or the
*** constant org.dspace.app.dav.client.LNIClientUtils.INFINITY (-1).
*** Types is a comma-separated list of DSpace item types to which to
*** restrict the query (see "type" option of PROPFIND method). May be null.
*** Returns the multistatus document from the method's response.
***/
public String propfind(String uri, Document propfind, int depth, String types)
throws java.rmi.RemoteException, org.dspace.app.dav.client.LNIRemoteException
/**
*** Same as PROPPATCH WebDAV method. "uri" may be relative to DSpace
*** LNI prefix, or absolute; "propertyupdate" is the propertyupdate
*** element. Returns the multistatus document from the method's response.
***/
public String proppatch(String uri, String propertyupdate)
throws java.rmi.RemoteException, org.dspace.app.dav.client.LNIRemoteException
/**
*** Executes COPY method; "uri" and "destination_uri" may be relative
*** to DSpace LNI prefix, or absolute.
*** The depth and 'keepProperties' parameters correspond to
*** parameters on the actual COPY WebDAV method, but DSpace ignores them
*** at this time.
*** The overwrite option will allow the copy to overwrite an existing
*** resource if necessary.
***
*** Returns the HTTP status code.
***/
public int copy(String uri, String destination_uri, int depth,
boolean overwrite, boolean keepProperties)
throws java.rmi.RemoteException, org.dspace.app.dav.client.LNIRemoteException
}
public class org.dspace.app.dav.client.LNIClientUtils {
/** Depth of infinity in SOAP propfind() */
public final static int INFINITY = -1;
/**
*** Make up a URL to access a WebDAV resource, given the SOAP "endpoint" URL
*** and a relative URI such as is returned by lookup(). Clients should
*** use this to obtain URLs to make HTTP GET and PUT requests.
*** Packager may be null for a resource such as a Bitstream that does
*** not require a packager.
***/
public static URL makeDAVURL(String endpoint, String davURI, String packager);
throws MalformedURLException
/** alternate version that does not require packager. */
public static URL makeDAVURL(String endpoint, String davURI);
throws MalformedURLException
/**
*** Translates a WebDAV URL, such as would be returned by the PUT
*** method, into a resource URI relative to the DAV root which can
*** be passed to the SOAP methods. Inverse of makeDAVURL.
***/
public static String makeLNIURI(String endpoint, String davURL)
throws MalformedURLException
}
|
...
Here is an example of how a client would create a session and issue a `propfind` call with the LNI. It assumes the SOAP interface is built upon Apache's Axis SOAP implementation.
Code Block |
---|
// DSpace credentials are either user/password in the URL, or X.509
// client cert supplied with https: connection.
String endpoint = "http://user:password@dspace.uni.edu/dspace/lni/DSpaceLNI";
// get Axis locator
LniSoapServletServiceLocator locator = new LniSoapServletServiceLocator();
// create client endpoint
LniSoapServle] lni = locator.getDSpaceLNI(new java.net.URL(endpoint));
// get resource URI for known handle:
String handle = "1234.56/789";
String resourceUri = lni.lookup(handle, null);
// get its properties..
String result = lni.propfind(resourceUri,
"<propfind xmlns=\"DAV:\"><allprop /></propfind>", 1);
// ..now parse and display the XML in "result"..
|
...
Here is the document to send with the propfind
request:
Code Block |
---|
<propfind xmlns="DAV:">
<prop xmlns:dspace="http://www.dspace.org/xmlns/dspace">
<DAV:current_user_privilege_set />
</prop>
</propfind>
|
...