Search code examples
alfrescocmisopencmis

Alfresco Java backed web-script lookup by cmis:objectId


I am writing my first java-backed webscript for Alfresco community edition. I am implementing document properties / preview service, and I take a parameter which is the cmis:objectId of the document in question. I'm having trouble getting started because I haven't been able to access the document based on the cmis id.

What is the best way to get a document (NodeRef?) based on the cmis:objectId when operating server-side in a web-script controller? I see Jeff Potts' great examples on how to implement web scripts, but the mixing of the Java API and CMIS concepts has me stuck. Should I just use the search service and find the object based on the cmis:objectId property? Any pointers appreciated.


Solution

  • Well, the answer is a little ugly, but hopefully this helps someone...

    A good way to look up the NodeRef using an 'opaque' objectId should be to use CMISServices, obtained from the registry in your java backed web script, i.e.

    docRef = registry.getCMISService().getLatestVersion(docIdStr, false);
    

    Unfortunately, there's a bug in the Alfresco code (or so it seems to me, admittedly a bit of a newbie). The alfresco CMISServicesImpl.getLatestVersion() uses a getObject() method under the covers. That method takes an objectId String as a parameter, but then strips off the version information at the end (i.e. the ";1.0" part of the objectId) and then checks to see if the remaining string is a valid NodeRef. In doing so, it checks it against this pattern (in NodeRef.java):

    private static final Pattern nodeRefPattern = Pattern.compile(".+://.+/.+");
    

    If the validation fails, you get a CMISInvalidArgumentException, with a message that xxxxx "is not an object ID".

    So, to make a long story short, when I call the web script using a parameter for the objectId like this:

    29ea5a16-12a8-497d-aad3-f43969e8a672;1.0
    

    I get the CMIS exception. But, if I call the method with an objectId parameter that looks like this:

    workspace://SpacesStore/29ea5a16-12a8-497d-aad3-f43969e8a672;1.0
    

    ... then, the "CMIS" lookup succeeds and I get my desired NodeRef back. Of course, all that the CMIS services are doing under the covers is stripping off the ";1.0" from the object ID, treating it as a NodeRef string, and doing the lookup using that.
    In other words, you can't do it the right way in 4.2. The best thing to do is as @Gagravarr says and tweak your own objectId string to turn it into a NodeRef. Hopefully it's fixed in 5.x.