@Override public DocumentModel createEntry(Map<String, Object> fieldMap) { checkPermission(SecurityConstants.WRITE); DocumentModel docModel = createEntryWithoutReferences(fieldMap); // Add references fields Map<String, Field> schemaFieldMap = directory.getSchemaFieldMap(); String idFieldName = schemaFieldMap.get(getIdField()).getName().getPrefixedName(); Object entry = fieldMap.get(idFieldName); String sourceId = docModel.getId(); for (Reference reference : getDirectory().getReferences()) { String referenceFieldName = schemaFieldMap.get(reference.getFieldName()).getName().getPrefixedName(); if (getDirectory().getReferences(reference.getFieldName()).size() > 1) { if (log.isWarnEnabled()) { log.warn("Directory " + directoryName + " cannot create field " + reference.getFieldName() + " for entry " + entry + ": this field is associated with more than one reference"); } continue; } List<String> targetIds = toStringList(fieldMap.get(referenceFieldName)); if (reference.getClass() == referenceClass) { reference.addLinks(sourceId, targetIds, this); } else { reference.addLinks(sourceId, targetIds); } } getDirectory().invalidateCaches(); return docModel; }
List<String> targetIds = toStringList(docModel.getProperty(schemaName, referenceFieldName)); if (reference.getClass() == referenceClass) { reference.setTargetIdsForSource(docModel.getId(), targetIds, this);
/** * Fetches both statically and dynamically defined references and merges the results. * * @see org.nuxeo.ecm.directory.Reference#getSourceIdsForTarget(String) */ @Override // XXX: broken, use getLdapTargetIds for a proper implementation public List<String> getTargetIdsForSource(String sourceId) { String schemaName = getSourceDirectory().getSchema(); try (Session session = getSourceDirectory().getSession()) { try { return BaseSession.toStringList(session.getEntry(sourceId).getProperty(schemaName, fieldName)); } catch (PropertyException e) { throw new DirectoryException(e); } } }