Marco Biscaro created CMIS-870:
----------------------------------

             Summary: Inconsistent cardinality - getProperties vs 
updateProperties
                 Key: CMIS-870
                 URL: https://issues.apache.org/jira/browse/CMIS-870
             Project: Chemistry
          Issue Type: Bug
          Components: opencmis-commons
    Affects Versions: OpenCMIS 0.12.0
         Environment: Tested with Alfresco 5.0.a on Mac OS X using the browser 
binding.
            Reporter: Marco Biscaro
            Priority: Minor


I think the best way to explain this bug is through API response samples. For 
example, the following updateProperties call on Alfresco:

{code}
POST 
/alfresco/api/-default-/public/cmis/versions/1.1/browser/root?objectId=207ba708-714e-4740-96f8-5cfeabc9003f

cmisaction=update&propertyId[0]=cm:title&propertyValue[0]=DocTitle


{
  "properties": {
    (...)
    "cmis:secondaryObjectTypeIds": {
      "id": "cmis:secondaryObjectTypeIds",
      "localName": "secondaryObjectTypeIds",
      "displayName": "Secondary Object Type Ids",
      "queryName": "cmis:secondaryObjectTypeIds",
      "type": "id",
      "cardinality": "multi",
      "value": [
        "P:cm:titled",
        "P:cm:author",
        "P:sys:localized"
      ]
    },
    (...)
    "cm:title": {
      "id": "cm:title",
      "localName": "title",
      "displayName": "Título",
      "queryName": "cm:title",
      "type": "string",
      "cardinality": "single",
      "value": "DocTitle"
    },
    (...)
  }
}
{code}

The response above is correct. The cm:title property (part of P:cm:titled 
aspect) has cardinality single and is returned as a string.

The problem lies on the getProperties action. For example:

{code}
GET 
/alfresco/api/-default-/public/cmis/versions/1.1/browser/root?objectId=207ba708-714e-4740-96f8-5cfeabc9003f&cmisselector=properties


{
  (...)
  "cm:title": {
    "id": "cm:title",
    "localName": "title",
    "displayName": "Título",
    "queryName": "cm:title",
    "type": "string",
    "value": [
      "DocTitle"
    ]
  },
  (...)
}
{code}

As you can see, the cardinality is undefined and the value is returned as an 
array.

Debugging the code, I realized that when the updateProperties endpoint is 
called, the method ServerTypeCacheImpl.getTypeDefinitionForObject is invoked 
and this method correctly registers all type definitions for secondary object 
types. This makes it possible to correctly determine the cardinality of the 
property when converting the response to JSON.

However, when getProperties is called, the 
ServerTypeCacheImpl.getTypeDefinitionForObject method is *not* called, but the 
type definition is registered by invoking 
ServerTypeCacheImpl.getTypeDefinition, which does not register the secondary 
object types. When converting to JSON, the cardinality of the property is 
unknown and it is (incorrectly) returned as an array.

I think the method getTypeDefinitionForObject should always be called, to 
correctly register secondary object types and ensure consistency between 
queries of the same object.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to