/*
* Copyright (c) 2010-2017 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.prism.delta;
import java.util.ArrayList;
import java.util.Collection;
import javax.xml.namespace.QName;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismReference;
import com.evolveum.midpoint.prism.PrismReferenceDefinition;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.exception.SchemaException;
/**
* @author semancik
*
*/
public class ReferenceDelta extends ItemDelta<PrismReferenceValue,PrismReferenceDefinition> {
public ReferenceDelta(PrismReferenceDefinition itemDefinition, PrismContext prismContext) {
super(itemDefinition, prismContext);
}
public ReferenceDelta(ItemPath propertyPath, PrismReferenceDefinition itemDefinition, PrismContext prismContext) {
super(propertyPath, itemDefinition, prismContext);
}
public ReferenceDelta(ItemPath parentPath, QName name, PrismReferenceDefinition itemDefinition, PrismContext prismContext) {
super(parentPath, name, itemDefinition, prismContext);
}
public ReferenceDelta(QName name, PrismReferenceDefinition itemDefinition, PrismContext prismContext) {
super(name, itemDefinition, prismContext);
}
@Override
public Class<PrismReference> getItemClass() {
return PrismReference.class;
}
@Override
public void setDefinition(PrismReferenceDefinition definition) {
if (!(definition instanceof PrismReferenceDefinition)) {
throw new IllegalArgumentException("Cannot apply "+definition+" to reference delta");
}
super.setDefinition(definition);
}
@Override
public void applyDefinition(PrismReferenceDefinition definition) throws SchemaException {
if (!(definition instanceof PrismReferenceDefinition)) {
throw new IllegalArgumentException("Cannot apply definition "+definition+" to reference delta "+this);
}
super.applyDefinition(definition);
}
@Override
protected boolean isApplicableToType(Item item) {
return item instanceof PrismReference;
}
@Override
public ReferenceDelta clone() {
ReferenceDelta clone = new ReferenceDelta(getPath(), (PrismReferenceDefinition)getDefinition(), getPrismContext());
copyValues(clone);
return clone;
}
protected void copyValues(ReferenceDelta clone) {
super.copyValues(clone);
}
/**
* Convenience method for quick creation of object deltas that replace a single object property. This is used quite often
* to justify a separate method.
*/
public static Collection<? extends ItemDelta> createModificationReplaceCollection(QName propertyName,
PrismObjectDefinition<?> objectDefinition, PrismReferenceValue refValue) {
Collection<? extends ItemDelta> modifications = new ArrayList<ItemDelta>(1);
ReferenceDelta delta = createModificationReplace(propertyName, objectDefinition, refValue);
((Collection)modifications).add(delta);
return modifications;
}
public static ReferenceDelta createModificationReplace(QName refName, PrismObjectDefinition<?> objectDefinition, String oid) {
return createModificationReplace(refName, objectDefinition, new PrismReferenceValue(oid));
}
public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjectDefinition<?> objectDefinition, String oid) {
return createModificationReplace(path, objectDefinition, new PrismReferenceValue(oid));
}
public static <O extends Objectable> ReferenceDelta createModificationReplace(QName refName, Class<O> type, PrismContext ctx , String oid) {
PrismObjectDefinition<O> objectDefinition = ctx.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type);
return createModificationReplace(refName, objectDefinition, oid==null?null:new PrismReferenceValue(oid));
}
public static <O extends Objectable> ReferenceDelta createModificationReplace(ItemPath path, Class<O> type, PrismContext ctx, String oid) {
PrismObjectDefinition<O> objectDefinition = ctx.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type);
return createModificationReplace(path, objectDefinition, oid==null?null:new PrismReferenceValue(oid));
}
public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjectDefinition<?> objectDefinition,
PrismReferenceValue refValue) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
if (refValue == null) {
referenceDelta.setValueToReplace();
} else {
referenceDelta.setValueToReplace(refValue);
}
return referenceDelta;
}
public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjectDefinition<?> objectDefinition,
Collection<PrismReferenceValue> refValues) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
referenceDelta.setValuesToReplace(refValues);
return referenceDelta;
}
public static ReferenceDelta createModificationReplace(QName refName, PrismObjectDefinition<?> objectDefinition,
PrismReferenceValue refValue) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(refName, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
if (refValue == null) {
referenceDelta.setValueToReplace();
} else {
referenceDelta.setValueToReplace(refValue);
}
return referenceDelta;
}
public static Collection<? extends ItemDelta> createModificationAddCollection(QName propertyName,
PrismObjectDefinition<?> objectDefinition, PrismReferenceValue refValue) {
Collection<? extends ItemDelta<?,?>> modifications = createModificationsCollection(1);
ReferenceDelta delta = createModificationAdd(propertyName, objectDefinition, refValue);
((Collection)modifications).add(delta);
return modifications;
}
private static Collection<? extends ItemDelta<?,?>> createModificationsCollection(int initSize) {
return new ArrayList<ItemDelta<?,?>>(initSize);
}
public static ReferenceDelta createModificationAdd(QName refName, PrismObjectDefinition<?> objectDefinition,
String oid) {
return createModificationAdd(refName, objectDefinition, new PrismReferenceValue(oid));
}
public static ReferenceDelta createModificationAdd(ItemPath path, PrismObjectDefinition<?> objectDefinition,
String oid) {
return createModificationAdd(path, objectDefinition, new PrismReferenceValue(oid));
}
public static ReferenceDelta createModificationAdd(QName refName, PrismObjectDefinition<?> objectDefinition,
PrismReferenceValue refValue) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(refName, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
referenceDelta.addValueToAdd(refValue);
return referenceDelta;
}
public static ReferenceDelta createModificationAdd(ItemPath path, PrismObjectDefinition<?> objectDefinition,
PrismReferenceValue refValue) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
referenceDelta.addValueToAdd(refValue);
return referenceDelta;
}
public static ReferenceDelta createModificationAdd(ItemPath path, PrismObjectDefinition<?> objectDefinition,
Collection<PrismReferenceValue> refValues) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
referenceDelta.addValuesToAdd(refValues);
return referenceDelta;
}
public static <T extends Objectable> ReferenceDelta createModificationAdd(Class<T> type, QName refName, PrismContext prismContext,
PrismReferenceValue refValue) {
PrismObjectDefinition<T> objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type);
return createModificationAdd(refName, objectDefinition, refValue);
}
public static <T extends Objectable> Collection<? extends ItemDelta> createModificationAddCollection(Class<T> type, QName refName, PrismContext prismContext,
String targetOid) {
PrismReferenceValue refValue = new PrismReferenceValue(targetOid);
return createModificationAddCollection(type, refName, prismContext, refValue );
}
public static <T extends Objectable> Collection<? extends ItemDelta> createModificationAddCollection(Class<T> type, QName refName, PrismContext prismContext,
PrismReferenceValue refValue) {
Collection<? extends ItemDelta<?,?>> modifications = createModificationsCollection(1);
ReferenceDelta delta = createModificationAdd(type, refName, prismContext, refValue);
((Collection)modifications).add(delta);
return modifications;
}
public static <T extends Objectable> ReferenceDelta createModificationAdd(Class<T> type, QName refName, PrismContext prismContext,
PrismObject<?> refTarget) {
PrismReferenceValue refValue = PrismReferenceValue.createFromTarget(refTarget);
return createModificationAdd(type, refName, prismContext, refValue);
}
public static <T extends Objectable> Collection<? extends ItemDelta> createModificationAddCollection(Class<T> type, QName refName, PrismContext prismContext,
PrismObject<?> refTarget) {
Collection<? extends ItemDelta<?,?>> modifications = createModificationsCollection(1);
ReferenceDelta delta = createModificationAdd(type, refName, prismContext, refTarget);
((Collection)modifications).add(delta);
return modifications;
}
public static Collection<? extends ItemDelta> createModificationDeleteCollection(QName propertyName,
PrismObjectDefinition<?> objectDefinition, PrismReferenceValue refValue) {
Collection<? extends ItemDelta> modifications = new ArrayList<ItemDelta>(1);
ReferenceDelta delta = createModificationDelete(propertyName, objectDefinition, refValue);
((Collection)modifications).add(delta);
return modifications;
}
public static ReferenceDelta createModificationDelete(ItemPath path, PrismObjectDefinition<?> objectDefinition,
Collection<PrismReferenceValue> refValues) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
referenceDelta.addValuesToDelete(refValues);
return referenceDelta;
}
public static ReferenceDelta createModificationDelete(QName refName, PrismObjectDefinition<?> objectDefinition,
String oid) {
return createModificationDelete(refName, objectDefinition, new PrismReferenceValue(oid));
}
public static ReferenceDelta createModificationDelete(QName refName, PrismObjectDefinition<?> objectDefinition,
PrismObject<?> refTarget) {
PrismReferenceValue refValue = PrismReferenceValue.createFromTarget(refTarget);
return createModificationDelete(refName, objectDefinition, refValue);
}
public static ReferenceDelta createModificationDelete(QName refName, PrismObjectDefinition<?> objectDefinition,
PrismReferenceValue refValue) {
PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(refName, PrismReferenceDefinition.class);
ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there
referenceDelta.addValueToDelete(refValue);
return referenceDelta;
}
public static <T extends Objectable> ReferenceDelta createModificationDelete(Class<T> type, QName refName, PrismContext prismContext,
PrismReferenceValue refValue) {
PrismObjectDefinition<T> objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type);
return createModificationDelete(refName, objectDefinition, refValue);
}
public static <T extends Objectable> Collection<? extends ItemDelta> createModificationDeleteCollection(Class<T> type, QName refName, PrismContext prismContext,
PrismReferenceValue refValue) {
Collection<? extends ItemDelta<?,?>> modifications = createModificationsCollection(1);
ReferenceDelta delta = createModificationDelete(type, refName, prismContext, refValue);
((Collection)modifications).add(delta);
return modifications;
}
public static <T extends Objectable> ReferenceDelta createModificationDelete(Class<T> type, QName refName, PrismContext prismContext,
PrismObject<?> refTarget) {
PrismReferenceValue refValue = PrismReferenceValue.createFromTarget(refTarget);
return createModificationDelete(type, refName, prismContext, refValue);
}
public static <T extends Objectable> ReferenceDelta createModificationDelete(Class<T> type, QName refName, PrismObject<?> refTarget) {
PrismReferenceValue refValue = PrismReferenceValue.createFromTarget(refTarget);
return createModificationDelete(type, refName, refTarget.getPrismContext(), refValue);
}
public static <T extends Objectable> Collection<? extends ItemDelta> createModificationDeleteCollection(Class<T> type, QName refName, PrismContext prismContext,
PrismObject<?> refTarget) {
Collection<? extends ItemDelta<?,?>> modifications = createModificationsCollection(1);
ReferenceDelta delta = createModificationDelete(type, refName, prismContext, refTarget);
((Collection)modifications).add(delta);
return modifications;
}
}