Hi,
I was trying to create an extension of dls API in Java. To achieve this I tried
the following code with the examples in the Java API cookbook as the guide :
Java code :
MANAGER CLASS EXTENDING RESOURCEMANAGER
static public class dlsManager extends ResourceManager {
static final public String NAME = "dlsQuery";
private XMLDocumentManager docMgr;
String uri = "/resourceExtension/demo2.xml";
public dlsManager(DatabaseClient client) {
super();
// a Resource Manager must be initialized by a Database Client
client.init(NAME, this);
// the Dictionary Manager delegates some services to a document manager
docMgr = client.newXMLDocumentManager();
}
public void createDoc()throws ResourceNotFoundException,
ForbiddenUserException, FailedRequestException {
StringBuilder builder = new StringBuilder();
builder.append("<?xml version='1.0' encoding='UTF-8'?>\n");
builder.append("<topLevel>\n");
builder.append("<level1>a</level1>");
builder.append("<level2>b</level2>");
builder.append("</topLevel>\n");
StringHandle writeHandle = new StringHandle();
writeHandle.set(builder.toString());
// delegate
docMgr.write(uri,writeHandle);
}
public void manageDoc()throws ResourceNotFoundException,
ForbiddenUserException, FailedRequestException {
RequestParameters params = new RequestParameters();
params.add("uri", uri);
XMLStreamReaderHandle readHandle = new XMLStreamReaderHandle();
ResourceServices services = getServices();
services.get(params, readHandle);
}
}
TO INSTALL THE RESOURCE EXTENSION
public static void installResourceExtensionShortcut(DatabaseClient client)
throws IOException {
// create a manager for resource extensions
ResourceExtensionsManager resourceMgr =
client.newServerConfigManager().newResourceExtensionsManager();
// specify metadata about the resource extension
ExtensionMetadata metadata = new ExtensionMetadata();
metadata.setTitle("dls services to manage docs");
metadata.setDescription("to support checkin/checkout");
metadata.setProvider("MarkLogic");
metadata.setVersion("0.1");
// acquire the resource extension source code
InputStream sourceStream = Util.openStream(
"scripts"+File.separator+dlsManager.NAME+".xqy");
if (sourceStream == null)
throw new IOException("Could not read example resource extension");
// write the resource extension to the database
resourceMgr.writeServicesAs(dlsManager.NAME, sourceStream, metadata,
new MethodParameters(MethodType.GET));
System.out.println("(Shortcut) Installed the resource extension on the server");
}
public static void installResourceExtensionStrongTyped(DatabaseClient client)
throws IOException {
// create a manager for resource extensions
ResourceExtensionsManager resourceMgr =
client.newServerConfigManager().newResourceExtensionsManager();
// specify metadata about the resource extension
ExtensionMetadata metadata = new ExtensionMetadata();
metadata.setTitle("dls services to manage docs");
metadata.setDescription("to support checkin/checkout");
metadata.setProvider("MarkLogic");
metadata.setVersion("0.1");
// acquire the resource extension source code
InputStream sourceStream = Util.openStream(
"scripts"+File.separator+dlsManager.NAME+".xqy");
if (sourceStream == null)
throw new IOException("Could not read example resource extension");
// create a handle on the extension source code
InputStreamHandle handle = new InputStreamHandle();
handle.set(sourceStream);
// write the resource extension to the database
resourceMgr.writeServices(dlsManager.NAME, handle, metadata,
new MethodParameters(MethodType.GET));
System.out.println("(Strong Typed) Installed the resource extension on the
server");
}
// use the resource manager
public static void useResource(String host, int port, String user, String
password, Authentication authType)
throws ResourceNotFoundException, ForbiddenUserException,
FailedRequestException {
// create the client
DatabaseClient client = DatabaseClientFactory.newClient(host, port, user,
password, authType);
dlsManager mgr = new dlsManager(client);
mgr.createDoc();
client.release();
client = DatabaseClientFactory.newClient(host, port, user, password, authType);
mgr = new dlsManager(client);
mgr.manageDoc();
client.release();
}
Xquery code(dlsQuery.xqy):
xquery version "1.0-ml";
(: Copyright 2011-2014 MarkLogic Corporation. All Rights Reserved. :)
module namespace dlsQuery = "http://marklogic.com/rest-api/resource/dlsQuery";
import module namespace dls = "http://marklogic.com/xdmp/dls"
at "/MarkLogic/dls.xqy";
declare option xdmp:update "true";
declare function dlsQuery:get(
$context as map:map,
$params as map:map
) as document-node()*
{
let $uri := map:get($params,"uri")
return
dls:document-manage($uri,
fn:false(),
"example of managed doc from resourceextension")
};
The result which I get on executing this is
(Shortcut) Installed the resource extension on the server
(Strong Typed) Installed the resource extension on the server
Exception in thread "main" com.marklogic.client.FailedRequestException: Local
message: failed to read resource at resources/dlsQuery: Internal Server Error.
Server Message: XDMP-UPDATEFUNCTIONFROMQUERY:
Q{http://marklogic.com/rest-api/resource/dlsQuery}get#2($context,
$service-params) -- Cannot apply an update function from a query. See the
MarkLogic server error log for further detail.
at
com.marklogic.client.impl.JerseyServices.checkStatus(JerseyServices.java:3738)
at
com.marklogic.client.impl.JerseyServices.getResource(JerseyServices.java:2798)
at
com.marklogic.client.impl.ResourceServicesImpl.get(ResourceServicesImpl.java:52)
at
com.marklogic.client.impl.ResourceServicesImpl.get(ResourceServicesImpl.java:48)
at demo.ResourceExtension$dlsManager.manageDoc(ResourceExtension.java:118)
I also referred to the blog at
http://blog.davidcassel.net/2011/10/queries-and-updates/? but to no avail. Can
anyone please suggest a solution to this? Any help would be appreciated.
Regards,
Devesh Tyagi
"This e-mail and any attachments transmitted with it are for the sole use of
the intended recipient(s) and may contain confidential , proprietary or
privileged information. If you are not the intended recipient, please contact
the sender by reply e-mail and destroy all copies of the original message. Any
unauthorized review, use, disclosure, dissemination, forwarding, printing or
copying of this e-mail or any action taken in reliance on this e-mail is
strictly prohibited and may be unlawful."
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general