/**
 * Validate user's CMIS reference
 *
 * Users can enter a CMIS reference in various ways:
 * id:    753026c2-1d1e-40df-bf5b-847f5d23c1df
 * path:  /Sites/bloomington-arts-commission/documentLibrary/Agendas
 * query: select id from cmis:document where ...
 *
 * @implements hook_field_validate()
 * @see https://api.drupal.org/api/drupal/modules!field!field.api.php/function/hook_field_validate/7
 */
function cmisro_field_validate($entity_type, $entity, $field, $instance, $lang, &$items, &$errors)
{
    foreach ($items as $delta => $item) {
        if (!empty($item['reference'])) {
            $type = _cmisro_referenceType($item['reference']);
            try {
                $o = $type === 'query' ? _cmisro_getQuery($item['reference']) : _cmisro_getObject($item['reference']);
            } catch (Exception $e) {
                $errors[$field['field_name']][$lang][$delta][] = ['error' => 'unknownAttachment', 'message' => "{$instance['label']}: {$e->getMessage()}"];
            }
        }
    }
}
/**
 * @param string $reference
 */
function _cmisro_getObject($reference)
{
    $s = _cmisro_service();
    $o = _cmisro_referenceType($reference) === 'path' ? $s->getObjectByPath($reference) : $s->getObject($reference);
    return _cmisro_object($o);
}