[ 
https://issues.apache.org/jira/browse/CMIS-968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Xian Zou updated CMIS-968:
--------------------------
    Issue Type: Test  (was: Bug)

> Broswer binding failed to check the property list for secondary type when 
> update/create properties for secondary type 
> ----------------------------------------------------------------------------------------------------------------------
>
>                 Key: CMIS-968
>                 URL: https://issues.apache.org/jira/browse/CMIS-968
>             Project: Chemistry
>          Issue Type: Test
>          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(AbstractBrowserBindingService.java:249)
>       at 
> org.apache.chemistry.opencmis.client.bindings.spi.browser.AbstractBrowserBindingService.post(AbstractBrowserBindingService.java:377)
>       at 
> org.apache.chemistry.opencmis.client.bindings.spi.browser.ObjectServiceImpl.updateProperties(ObjectServiceImpl.java:400)
>       at 
> org.apache.chemistry.opencmis.client.runtime.AbstractCmisObject.updateProperties(AbstractCmisObject.java:349)
>       at 
> org.apache.chemistry.opencmis.client.runtime.AbstractCmisObject.updateProperties(AbstractCmisObject.java:313)
>       at 
> com.ibm.ecm.cmis.test.opencmis.util.TestUtils.updateDocument(TestUtils.java:2568)
>       at 
> com.ibm.ecm.cmis.test.opencmis.object.common.DocumentCRUD.createDocument(DocumentCRUD.java:172)
> 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 AbstractBrowserServiceCall.java.
>  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
(v6.3.4#6332)

Reply via email to