private boolean equalsTargetType(PrismReferenceValue other) { QName otherTargetType = other.getTargetType(); if (otherTargetType == null && other.getDefinition() != null) { otherTargetType = other.getDefinition().getTargetTypeName(); } QName thisTargetType = this.getTargetType(); if (thisTargetType == null && this.getDefinition() != null) { thisTargetType = this.getDefinition().getTargetTypeName(); } return QNameUtil.match(thisTargetType, otherTargetType); }
if (definition.getTargetTypeName() != null) { addAnnotation(A_OBJECT_REFERENCE_TARGET_TYPE, definition.getTargetTypeName(), appinfo); if (attrNamespace != null && attrNamespace.equals(getNamespace())) { setAttribute(property, "name", elementName.getLocalPart()); setQNameAttribute(property, "type", definition.getTargetTypeName()); } else { setQNameAttribute(property, "ref", elementName);
public <O extends ObjectType> PrismObject<O> resolve(PrismReferenceValue refVal, String string, GetOperationOptions options, Task task, OperationResult result) throws ObjectNotFoundException { String oid = refVal.getOid(); Class<?> typeClass = ObjectType.class; QName typeQName = refVal.getTargetType(); if (typeQName == null && refVal.getParent() != null && refVal.getParent().getDefinition() != null) { PrismReferenceDefinition refDef = (PrismReferenceDefinition) refVal.getParent().getDefinition(); typeQName = refDef.getTargetTypeName(); } if (typeQName != null) { typeClass = prismContext.getSchemaRegistry().determineCompileTimeClass(typeQName); } return (PrismObject<O>) (getObjectSimple((Class<O>)typeClass, oid, options, task, result)).asPrismObject(); }
private PrismReferenceValue parseReferenceValueAsCompositeObject(XNodeImpl node, PrismReferenceDefinition definition, ParsingContext pc) throws SchemaException { if (!(node instanceof MapXNodeImpl)) { throw new IllegalArgumentException("Cannot parse reference composite object from " + node); } MapXNodeImpl map = (MapXNodeImpl) node; QName targetTypeName = definition.getTargetTypeName(); PrismObjectDefinition<Objectable> objectDefinition = null; if (map.getTypeQName() != null) { objectDefinition = getSchemaRegistry().findObjectDefinitionByType(map.getTypeQName()); } if (objectDefinition == null && targetTypeName != null) { objectDefinition = getSchemaRegistry().findObjectDefinitionByType(targetTypeName); } if (objectDefinition == null) { throw new SchemaException("No object definition for composite object in reference element " + definition.getCompositeObjectElementName()); } PrismObject<Objectable> compositeObject; try { compositeObject = parseObject(map, objectDefinition, pc); } catch (SchemaException e) { throw new SchemaException(e.getMessage() + " while parsing composite object in reference element " + definition.getCompositeObjectElementName(), e); } PrismReferenceValue refVal = new PrismReferenceValueImpl(); setReferenceObject(refVal, compositeObject); ((PrismReferenceDefinitionImpl) definition).setComposite(true); // TODO why do we modify the definition? is that safe? return refVal; }
public void applyDefinition(PrismReferenceDefinition definition, boolean force) throws SchemaException { super.applyDefinition(definition, force); if (object == null) { return; } if (object.getDefinition() != null && !force) { return; } PrismContext prismContext = definition.getPrismContext(); QName targetTypeName = definition.getTargetTypeName(); if (targetTypeName == null) { throw new SchemaException("Cannot apply definition to composite object in reference "+getParent() +": the target type name is not specified in the reference schema"); } PrismObjectDefinition<? extends Objectable> objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(object.getCompileTimeClass()); if (objectDefinition == null) { objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByType(targetTypeName); } if (objectDefinition == null) { throw new SchemaException("Cannot apply definition to composite object in reference "+getParent() +": no definition for object type "+targetTypeName); } // this should do it object.applyDefinition((PrismObjectDefinition)objectDefinition, force); }
if (type == null) { if (!pc.isAllowMissingRefTypes() && !allowMissingRefTypesOverride) { type = definition.getTargetTypeName(); if (type == null) { throw new SchemaException("Target type in reference " + definition.getName() + type = getSchemaRegistry().resolveUnqualifiedTypeName(type); QName defTargetType = definition.getTargetTypeName(); if (defTargetType != null) { if (!(prismContext.getSchemaRegistry().isAssignableFrom(defTargetType, type))) {
PrismReferenceDefinition definition = (PrismReferenceDefinition) refVal.getParent().getDefinition(); if (definition != null) { typeQName = definition.getTargetTypeName();
assertEquals("Wrong target type in accountRef", ShadowType.COMPLEX_TYPE, accountRefDef.getTargetTypeName()); assertEquals("Wrong composite object element name in accountRef", UserType.F_LINK, accountRefDef.getCompositeObjectElementName()); assertEquals("Wrong target type in tenantRef", ShadowType.COMPLEX_TYPE, accountRefDef.getTargetTypeName());
assertEquals("Wrong target type in accountRef", ACCOUNT_TYPE_QNAME, accountRefDef.getTargetTypeName()); assertEquals("Wrong composite object element name in accountRef", USER_ACCOUNT_QNAME, accountRefDef.getCompositeObjectElementName());