[ https://issues.apache.org/jira/browse/CMIS-968?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15118497#comment-15118497 ]
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 org.apache.chemistry.opencmis.client.bindings.spi.browser.ObjectServiceImpl.java.) 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 types. ArrayList<String> secondObjTypeIds = new ArrayList<String>(); secondObjTypeIds.add(SecondaryTypeIds.DESTRUCTION_CLIENT_MANAGED_RETENTION); 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 org.apache.chemistry.opencmis.client.bindings.spi.browser.ObjectServiceImpl.java.) 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: https://issues.apache.org/jira/browse/CMIS-968 > 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(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)