public static boolean isEmpty(ItemDeltaType itemDeltaType) { if (itemDeltaType == null) { return true; } if (itemDeltaType.getModificationType() == ModificationTypeType.REPLACE) { return false; } return !itemDeltaType.getValue().isEmpty(); }
private static String printItemDeltaValues(ItemDeltaType itemDelta) { List values = itemDelta.getValue(); StringBuilder sb = new StringBuilder(); for (Object value : values) { String v = printItemDeltaValue(itemDelta.getPath(), value); if (StringUtils.isNotBlank(v)) { sb.append(v); sb.append(", "); } } sb.setLength(Math.max(sb.length() - 2, 0)); // delete last delimiter return sb.toString(); }
private static boolean isMetadata(ItemDeltaType itemDelta) { List values = itemDelta.getValue(); for (Object v : values) { if (v instanceof MetadataType) { return true; } else if (v instanceof RawType) { return isMetadata(itemDelta.getPath()); } } return false; }
private static void addModValues(ItemDelta delta, ItemDeltaType mod, Collection<PrismValue> values, DeltaConversionOptions options) throws SchemaException { if (values == null || values.isEmpty()) { // RawType modValue = new RawType(delta.getPrismContext()); // mod.getValue().add(modValue); } else { for (PrismValue value : values) { XNode xnode = toXNode(delta, value, options); RawType modValue = new RawType(xnode, value.getPrismContext()); mod.getValue().add(modValue); } } }
private static void shortPrettyPrint(StringBuilder sb, ItemDeltaType deltaType) { ModificationTypeType modificationType = deltaType.getModificationType(); if (modificationType == ModificationTypeType.ADD) { sb.append("(+)"); } else if (modificationType == ModificationTypeType.DELETE) { sb.append("(-)"); } else if (modificationType == ModificationTypeType.REPLACE) { sb.append("(=)"); } sb.append(deltaType.getPath()); sb.append(": "); List<RawType> values = deltaType.getValue(); if (values.isEmpty()) { sb.append("[]"); } else if (values.size() == 1) { values.get(0).shortDump(sb); } else { sb.append("["); Iterator<RawType> iterator = values.iterator(); while (iterator.hasNext()) { RawType value = iterator.next(); value.shortDump(sb); if (iterator.hasNext()) { sb.append(", "); } } sb.append("]"); } }
public static String prettyPrint(ItemDeltaType change) throws SchemaException { if (change == null) { return "null"; } StringBuilder sb = new StringBuilder("PropertyModification("); sb.append(change.getModificationType()); sb.append(","); if (change.getPath() != null) { sb.append(change.getPath().getItemPath()); // todo ... with declarations? } else { sb.append("xpath=null"); } sb.append(","); List<RawType> values = change.getValue(); for (RawType value : values) { sb.append(prettyPrint(value.serializeToXNode())); // todo implement correctly... sb.append(","); } return sb.toString(); }
private static void adopt(ItemDeltaType itemDelta, PrismContext prismContext) throws SchemaException { for (RawType value : itemDelta.getValue()) { if (value != null) { value.revive(prismContext); } } for (RawType value : itemDelta.getEstimatedOldValue()) { if (value != null) { value.revive(prismContext); } } }
@Override public ItemDeltaType clone() { ItemDeltaType clone = new ItemDeltaType(); clone.setModificationType(getModificationType()); clone.setPath(getPath()); //TODO clone path // If not to clone inside iteration, then in clone object would be an origin raw objects and manipulations with // clones wail take effect on origin objects. For example parsing while taking data from raw objects. // In our case it have bad side effect - equals doesn't work. for (RawType rawType : getValue()) { clone.getValue().add(rawType.clone()); } // delta.setValue(value != null ? value.clone() : null); clone.getEstimatedOldValue().addAll(getEstimatedOldValue()); return clone; }
public static <O extends ObjectType> ObjectDeltaListType createModificationDeltaList(Class<O> type, String oid, String path, ModificationTypeType modType, Object... values) { ObjectDeltaListType deltaList = new ObjectDeltaListType(); ObjectDeltaType delta = new ObjectDeltaType(); delta.setObjectType(getTypeQName(type)); delta.setChangeType(ChangeTypeType.MODIFY); delta.setOid(oid); ItemDeltaType itemDelta = new ItemDeltaType(); itemDelta.setPath(ModelClientUtil.createItemPathType(path)); itemDelta.setModificationType(modType); itemDelta.getValue().addAll(Arrays.asList(values)); delta.getItemDelta().add(itemDelta); deltaList.getDelta().add(delta); return deltaList; }
public static <O extends ObjectType> ObjectDeltaType createConstructionAssignmentDelta(Class<O> focusType, String focusOid, ModificationTypeType modType, String resourceOid, ShadowKindType kind, String intent) { ItemDeltaType assignmentDelta = new ItemDeltaType(); assignmentDelta.setModificationType(modType); assignmentDelta.setPath(ModelClientUtil.createItemPathType("assignment")); assignmentDelta.getValue().add(createConstructionAssignment(resourceOid, kind, intent)); ObjectDeltaType deltaType = new ObjectDeltaType(); deltaType.setObjectType(ModelClientUtil.getTypeQName(focusType)); deltaType.setChangeType(ChangeTypeType.MODIFY); deltaType.setOid(focusOid); deltaType.getItemDelta().add(assignmentDelta); return deltaType; }
public static <O extends ObjectType> ObjectDeltaType createRoleAssignmentDelta(Class<O> focusType, String focusOid, ModificationTypeType modType, String... roleOids) { ItemDeltaType assignmentDelta = new ItemDeltaType(); assignmentDelta.setModificationType(modType); assignmentDelta.setPath(ModelClientUtil.createItemPathType("assignment")); for (String roleOid: roleOids) { assignmentDelta.getValue().add(createRoleAssignment(roleOid)); } ObjectDeltaType deltaType = new ObjectDeltaType(); deltaType.setObjectType(ModelClientUtil.getTypeQName(focusType)); deltaType.setChangeType(ChangeTypeType.MODIFY); deltaType.setOid(focusOid); deltaType.getItemDelta().add(assignmentDelta); return deltaType; }
/** * We are going to change user's password. As the user has an account, the password change * should be also applied to the account (by schemaHandling). */ @Test public void test022ChangeUserPassword() throws Exception { final String TEST_NAME = "test022ChangeUserPassword"; displayTestTitle(TEST_NAME); // GIVEN ObjectDeltaType objectChange = unmarshallValueFromFile( REQUEST_USER_MODIFY_PASSWORD_FILENAME, ObjectDeltaType.class); System.out.println("In modification: " + objectChange.getItemDelta().get(0).getValue().get(0)); assertNoRepoCache(); // WHEN ObjectTypes.USER.getTypeQName(), OperationResultType result = modifyObjectViaModelWS(objectChange); // THEN assertUserPasswordChange("butUnd3dM4yT4lkAL0t", result); }
private void assertXmlPolyMod(ObjectModificationType objectModificationType, QName propertyName, ModificationTypeType modType, PolyStringType... expectedValues) throws SchemaException { //FIXME: for (ItemDeltaType mod : objectModificationType.getItemDelta()) { if (!propertyName.equals(mod.getPath().getItemPath().last())) { continue; } assertEquals(modType, mod.getModificationType()); for (RawType val : mod.getValue()){ assertModificationPolyStringValue(val, expectedValues); } } }
RawType rawType = mod.getItemDelta().get(0).getValue().get(0); ItemDefinition assignmentDefinition = getPrismContext().getSchemaRegistry().findContainerDefinitionByCompileTimeClass(AssignmentType.class); assertNotNull(assignmentDefinition);
@Test public void testAccountRefDelta() throws Exception { System.out.println("===[ testAccountRefDelta ]===="); // GIVEN ObjectModificationType objectChange = new ObjectModificationType(); objectChange.setOid("12345"); ItemDeltaType modificationDeleteAccountRef = new ItemDeltaType(); modificationDeleteAccountRef.setModificationType(ModificationTypeType.DELETE); ObjectReferenceType accountRefToDelete = new ObjectReferenceType(); accountRefToDelete.setOid("54321"); PrismContext prismContext = getPrismContext(); RawType modificationValue = new RawType(prismContext.xnodeSerializer().root(new QName("dummy")).serializeRealValue(accountRefToDelete).getSubnode(), prismContext); modificationDeleteAccountRef.getValue().add(modificationValue); objectChange.getItemDelta().add(modificationDeleteAccountRef); ItemPathType itemPathType = new ItemPathType(UserType.F_LINK_REF); modificationDeleteAccountRef.setPath(itemPathType); PrismObjectDefinition<UserType> objDef = PrismTestUtil.getObjectDefinition(UserType.class); // WHEN Collection<? extends ItemDelta> modifications = DeltaConvertor.toModifications(objectChange, objDef); // THEN assertNotNull("Null modifications", modifications); assertFalse("Empty modifications", modifications.isEmpty()); // TODO: more asserts }
@Test public void testMarshallObjectDeltaType() throws Exception { ObjectDeltaType delta = new ObjectDeltaType(); delta.setOid("07b32c14-0c18-460b-bd4a-99b96699f952"); delta.setChangeType(ChangeTypeType.MODIFY); ItemDeltaType item1 = new ItemDeltaType(); delta.getItemDelta().add(item1); item1.setModificationType(ModificationTypeType.REPLACE); Document document = DOMUtil.getDocument(); // Element path = document.createElementNS(SchemaConstantsGenerated.NS_TYPES, "path"); // path.setTextContent("c:credentials/c:password"); ItemPath path = ItemPath.create(SchemaConstantsGenerated.C_CREDENTIALS, CredentialsType.F_PASSWORD); item1.setPath(new ItemPathType(path)); ProtectedStringType protectedString = new ProtectedStringType(); protectedString.setEncryptedData(new EncryptedDataType()); RawType value = new RawType(((PrismContextImpl) PrismTestUtil.getPrismContext()).getBeanMarshaller().marshall(protectedString), PrismTestUtil.getPrismContext()); item1.getValue().add(value); String xml = PrismTestUtil.serializeJaxbElementToString( new JAXBElement<>(new QName("http://www.example.com", "custom"), Object.class, delta)); assertNotNull(xml); }
protected boolean isActivationStatusModifyDelta(ObjectDeltaType delta, ActivationStatusType expected) throws SchemaException { if (delta.getChangeType() != ChangeTypeType.MODIFY) { return false; } for (ItemDeltaType itemDelta: delta.getItemDelta()) { ItemPath deltaPath = itemDelta.getPath().getItemPath(); if (SchemaConstants.PATH_ACTIVATION_ADMINISTRATIVE_STATUS.equivalent(deltaPath)) { List<RawType> value = itemDelta.getValue(); PrismProperty<ActivationStatusType> parsedItem = (PrismProperty<ActivationStatusType>)(Item) value.get(0).getParsedItem(getUserDefinition().findPropertyDefinition(SchemaConstants.PATH_ACTIVATION_ADMINISTRATIVE_STATUS)); ActivationStatusType status = parsedItem.getRealValue(); display("Delta status " + status, itemDelta); if (expected.equals(status)) { return true; } } } return false; }
/** * Similar to previous test just the request is constructed a bit differently. */ @Test public void test023ChangeUserPasswordJAXB() throws Exception { final String TEST_NAME = "test023ChangeUserPasswordJAXB"; displayTestTitle(TEST_NAME); // GIVEN final String NEW_PASSWORD = "abandonSHIP"; Document doc = ModelClientUtil.getDocumnent(); ObjectDeltaType userDelta = new ObjectDeltaType(); userDelta.setOid(USER_JACK_OID); userDelta.setChangeType(ChangeTypeType.MODIFY); userDelta.setObjectType(UserType.COMPLEX_TYPE); ItemDeltaType passwordDelta = new ItemDeltaType(); passwordDelta.setModificationType(ModificationTypeType.REPLACE); passwordDelta.setPath(ModelClientUtil.createItemPathType("credentials/password/value", prismContext)); ProtectedStringType pass = new ProtectedStringType(); pass.setClearValue(NEW_PASSWORD); XNode passValue = prismContext.xnodeSerializer().root(new QName("dummy")).serializeRealValue(pass).getSubnode(); System.out.println("PASSWORD VALUE: " + passValue.debugDump()); RawType passwordValue = new RawType(passValue, prismContext); passwordDelta.getValue().add(passwordValue); userDelta.getItemDelta().add(passwordDelta); // WHEN ObjectTypes.USER.getTypeQName(), OperationResultType result = modifyObjectViaModelWS(userDelta); // THEN assertUserPasswordChange(NEW_PASSWORD, result); }
PrimitiveXNode<String> xnode = prismContext.xnodeFactory().primitive(valueParser, type, type != null); RawType rawValue = new RawType(xnode, prismContext); itemDeltaType.getValue().add(rawValue); objectChange.getItemDelta().add(itemDeltaType); return objectChange;
protected PrismObject<ShadowType> getParsedShadowBefore(PrismContext prismContext) throws SchemaException, IOException { PrismObject<ShadowType> oldObject = getRawShadowBefore(prismContext); // resolve rawtypes ObjectDeltaType objectChange = oldObject.asObjectable().getObjectChange(); for (ItemDeltaType itemDeltaType : objectChange.getItemDelta()) { for (RawType rawType : itemDeltaType.getValue()) { rawType.getParsedItem( prismContext.definitionFactory().createPropertyDefinition(itemDeltaType.getPath().getItemPath().lastName(), rawType.getXnode().getTypeQName())); } } return oldObject; }