// region Serializing references - specific functionality
  private XNode serializeReferenceValue(
      PrismReferenceValue value, PrismReferenceDefinition definition, SerializationContext ctx)
      throws SchemaException {
    MapXNode xmap = new MapXNode();
    boolean containsOid = false;
    String namespace =
        definition != null
            ? definition.getNamespace()
            : null; // namespace for filter and description
    if (StringUtils.isNotBlank(value.getOid())) {
      containsOid = true;
      xmap.put(XNode.KEY_REFERENCE_OID, createPrimitiveXNodeStringAttr(value.getOid()));
    }
    QName relation = value.getRelation();
    if (relation != null) {
      xmap.put(XNode.KEY_REFERENCE_RELATION, createPrimitiveXNodeAttr(relation, DOMUtil.XSD_QNAME));
    }
    QName targetType = value.getTargetType();
    if (targetType != null) {
      xmap.put(XNode.KEY_REFERENCE_TYPE, createPrimitiveXNodeAttr(targetType, DOMUtil.XSD_QNAME));
    }
    String description = value.getDescription();
    if (description != null) {
      xmap.put(
          createReferenceQName(XNode.KEY_REFERENCE_DESCRIPTION, namespace),
          createPrimitiveXNode(description, DOMUtil.XSD_STRING));
    }
    SearchFilterType filter = value.getFilter();
    if (filter != null) {
      XNode xsubnode = filter.serializeToXNode();
      xmap.put(createReferenceQName(XNode.KEY_REFERENCE_FILTER, namespace), xsubnode);
    }
    if (value.getTargetName() != null) {
      if (SerializationContext.isSerializeReferenceNames(ctx)) {
        XNode xsubnode = createPrimitiveXNode(value.getTargetName(), PolyStringType.COMPLEX_TYPE);
        xmap.put(createReferenceQName(XNode.KEY_REFERENCE_TARGET_NAME, namespace), xsubnode);
      } else {
        String commentValue = " " + value.getTargetName().getOrig() + " ";
        xmap.setComment(commentValue);
      }
    }

    boolean isComposite = false;
    if (definition != null) {
      isComposite = definition.isComposite();
    }
    if ((serializeCompositeObjects || isComposite || !containsOid) && value.getObject() != null) {
      XNode xobjnode = serializeObjectContent(value.getObject(), ctx);
      xmap.put(createReferenceQName(XNode.KEY_REFERENCE_OBJECT, namespace), xobjnode);
    }

    return xmap;
  }
  private AssignmentItemDto createAssignmentItem(
      PrismObject<UserType> user,
      PrismContainerValue assignment,
      Task task,
      OperationResult result) {
    PrismReference targetRef = assignment.findReference(AssignmentType.F_TARGET_REF);
    if (targetRef == null || targetRef.isEmpty()) {
      // account construction
      PrismContainer construction = assignment.findContainer(AssignmentType.F_CONSTRUCTION);
      String name = null;
      String description = null;
      if (construction.getValue().asContainerable() != null && !construction.isEmpty()) {
        ConstructionType constr = (ConstructionType) construction.getValue().asContainerable();
        description =
            (String)
                construction.getPropertyRealValue(ConstructionType.F_DESCRIPTION, String.class);

        if (constr.getResourceRef() != null) {
          ObjectReferenceType resourceRef = constr.getResourceRef();

          PrismObject resource =
              WebModelUtils.loadObject(
                  ResourceType.class, resourceRef.getOid(), this, task, result);
          name = WebMiscUtil.getName(resource);
        }
      }

      return new AssignmentItemDto(
          AssignmentEditorDtoType.ACCOUNT_CONSTRUCTION, name, description, null);
    }

    PrismReferenceValue refValue = targetRef.getValue();
    PrismObject value = refValue.getObject();
    if (value == null) {
      // resolve reference
      value = WebModelUtils.loadObject(ObjectType.class, refValue.getOid(), this, task, result);
    }

    if (value == null) {
      // we couldn't resolve assignment details
      return new AssignmentItemDto(null, null, null, null);
    }

    String name = WebMiscUtil.getName(value);
    AssignmentEditorDtoType type = AssignmentEditorDtoType.getType(value.getCompileTimeClass());
    String relation = refValue.getRelation() != null ? refValue.getRelation().getLocalPart() : null;
    String description = null;
    if (RoleType.class.isAssignableFrom(value.getCompileTimeClass())) {
      description = (String) value.getPropertyRealValue(RoleType.F_DESCRIPTION, String.class);
    }

    return new AssignmentItemDto(type, name, description, relation);
  }