chemistry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Xian Zou (JIRA)" <>
Subject [jira] [Comment Edited] (CMIS-968) Broswer binding failed to check the property list for secondary type when update/create properties for secondary type
Date Wed, 27 Jan 2016 09:23:39 GMT


Xian Zou edited comment on CMIS-968 at 1/27/16 9:22 AM:

I debugged the program more and found the chemistry client (createDocument method in
does not send the secondary object type ids to server part.  Then I found the root cause is
we set the updatability of cmis:secondaryObjectTypeIds to READONLY. After change it to READWRITE,
we can get the correct result in browser binding.

But I still have a concern about the following code for the properties of secondary object
ArrayList<String> secondObjTypeIds = new ArrayList<String>();
properties.put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, secondObjTypeIds);

For the end user to develop the CMIS application, it does not make sense to set the secondary
object IDs, especially for update the property like cmis:rm_expirationDate. I still think
the check and validation can be in specific repository and CMIS browser binding does not check
the properties as other binding, e.g atompub.

was (Author: xzou):
I debugged the program more and found the chemistry client (createDocument method in
does not send the secondary object type ids to server part.  I would debug more for the issue.
In the meanwhile , please help to check whether my code to set secondary type ids in my previous
comment is correct.

> Broswer binding failed to check the property list for secondary type when update/create
properties for secondary type 
> ----------------------------------------------------------------------------------------------------------------------
>                 Key: CMIS-968
>                 URL:
>             Project: Chemistry
>          Issue Type: Bug
>          Components: opencmis-server
>    Affects Versions: OpenCMIS 0.13.0
>         Environment: Windows2008R2 
>            Reporter: Xian Zou
> I am developing retention management in CMIS1.1 which cmis:secondaryObjectTypeIds is
cmis:rm_destructionRetention. After complete the server code for CM repository, I tried to
develop a JUNIT case to create/update a document with the cmis:rm_expirationDate and cmis:rm_destructionDate
property. All create/update operations works as design for atompub binding, but failed in
browser binding with the following error.
> org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException: cmis:rm_expirationDate
is unknown!
> 	at org.apache.chemistry.opencmis.client.bindings.spi.browser.AbstractBrowserBindingService.convertStatusCode(
> 	at
> 	at org.apache.chemistry.opencmis.client.bindings.spi.browser.ObjectServiceImpl.updateProperties(
> 	at org.apache.chemistry.opencmis.client.runtime.AbstractCmisObject.updateProperties(
> 	at org.apache.chemistry.opencmis.client.runtime.AbstractCmisObject.updateProperties(
> 	at
> 	at
> Here is my sample code for the update logic as the example.
> Map<String, Object> updateProperties = new HashMap<String, Object>();
>             String newName = "updatedname" + TestUtils.getRandomInt(10000);
>             updateProperties.put("cmis:name", newName);
>             updateProperties.put("clbNonGroup.CMISString", newName);
>             Calendar c = getTestCalendar(2);
>             Calendar c2 = getTestCalendar(3);
>             updateProperties.put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, secondObjTypeIds);
>             updateProperties.put(PropertyIds.EXPIRATION_DATE, c);
>             updateProperties.put(PropertyIds.DESTRUCTION_DATE, c2);
>             Document updatedDoc = TestUtils.updateDocument(session, doc.getId(), updateProperties);
> I checked the chemistry code and found the following logic may cause the "cmis:rm_expirationDate
is unknown!" error" in createNewProperties and createUpdateProperties methods in
>  PropertiesImpl result = new PropertiesImpl();
>         for (Map.Entry<String, List<String>> property : properties.entrySet())
>             PropertyDefinition<?> propDef = typeCache.getPropertyDefinition(property.getKey());
>             if (propDef == null && objectIds != null) {
>                 for (String objectId : objectIds) {
>                     typeCache.getTypeDefinitionForObject(objectId);
>                     propDef = typeCache.getPropertyDefinition(property.getKey());
>                     if (propDef != null) {
>                         break;
>                     }
>                 }
>             }
>             if (propDef == null) {
>                 throw new CmisInvalidArgumentException(property.getKey() + " is unknown!");
>             }
>             result.addProperty(createPropertyData(propDef, property.getValue()));
>         }
> Actually, when we create/update an document, the type definition in the code above will
be gotten from the primary object type. The properties for secondary object types will not
be gotten in the type definitions , so I think it should be a bug for browser binding. Here
are some possible solutions for the issue.
> Possible solution 1: Don't check the properties and throw the CmisInvalidArgumentException(property.getKey()
+ " is unknown!"); exception for browser binding like other bindings.
> Possible solution 2: Check the properties in type definitions in both primary object
type and all possible/passed secondary types. If we find the property in either of them. We
will not throw the exception.
> If I develop the code in wrong way, please tell me how to write it correctly.
> Thanks.

This message was sent by Atlassian JIRA

View raw message