Skip to content

Commit

Permalink
imrpving delta computation
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed May 3, 2019
1 parent 63bad50 commit a10209d
Show file tree
Hide file tree
Showing 10 changed files with 191 additions and 30 deletions.
Expand Up @@ -29,6 +29,7 @@
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType;

/**
Expand Down Expand Up @@ -77,6 +78,8 @@ public interface ItemWrapper<V extends PrismValue, I extends Item<V, ID>, ID ext
boolean isColumn();
void setColumn(boolean column);

<D extends ItemDelta<V, ID>> D getDelta();
<D extends ItemDelta<V, ID>> D getDelta(boolean absolute) throws SchemaException;

<D extends ItemDelta<V, ID>> void applyDelta(D delta) throws SchemaException;

}
Expand Up @@ -54,7 +54,8 @@ public IW createWrapper(PrismContainerValueWrapper<?> parent, ItemDefinition<?>
I childItem = (I) parent.getNewValue().findItem(name);
ItemStatus status = ItemStatus.NOT_CHANGED;
if (childItem == null) {
childItem = (I) def.instantiate();
childItem = (I) parent.getNewValue().findOrCreateItem(name);
// childItem = (I) def.instantiate();
status = ItemStatus.ADDED;
}

Expand Down
Expand Up @@ -43,17 +43,14 @@
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.Visitor;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.data.column.ColumnUtils;
import com.evolveum.midpoint.web.component.prism.ContainerValueWrapper;
import com.evolveum.midpoint.web.component.prism.ItemVisibility;
import com.evolveum.midpoint.web.component.prism.ItemVisibilityHandlerOld;
import com.evolveum.midpoint.web.component.prism.ValueWrapperOld;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormItemServerValidationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormItemValidationType;
Expand All @@ -68,12 +65,12 @@ public abstract class ItemWrapperImpl<PV extends PrismValue, I extends Item<PV,

private static final long serialVersionUID = 1L;

private static final transient Trace LOGGER = TraceManager.getTrace(ItemWrapperImpl.class);

private PrismContainerValueWrapper<?> parent;

private ItemStatus status = null;
private ItemPath fullPath = null;
// private PrismContext prismContext = null;


private String displayName;

private List<VW> values = new ArrayList<>();
Expand Down Expand Up @@ -105,7 +102,7 @@ public ItemWrapperImpl(@Nullable PrismContainerValueWrapper<?> parent, I item, I

protected <D extends ItemDelta<PV, ID>, O extends ObjectType> D getItemDelta(Class<O> objectClass, Class<D> deltaClass) throws SchemaException {
// D delta = (D) getPrismContext().deltaFor(objectClass).asItemDelta();
D delta = (D) createEmptyDelta(getPath());
D delta = (D) createEmptyDelta(null);
for (VW value : values) {
value.addToDelta(delta);
}
Expand All @@ -117,17 +114,39 @@ protected <D extends ItemDelta<PV, ID>, O extends ObjectType> D getItemDelta(Cla
}

@Override
public <D extends ItemDelta<PV, ID>> D getDelta() {
D delta = (D) createEmptyDelta(getPath());
public <D extends ItemDelta<PV, ID>> D getDelta(boolean absolute) throws SchemaException {
LOGGER.trace("Start computing delta for {}", newItem);
ItemPath path;
if (absolute) {
path = getPath();
} else {
path = getName();
}
D delta = (D) createEmptyDelta(path);
for (VW value : values) {
value.addToDelta(delta);
}

if (delta.isEmpty()) {
LOGGER.trace("There is no delta for {}", newItem);
return null;
}

// parent.applyDelta(delta);
LOGGER.trace("Returning delta {}", delta);
return delta;
}


@Override
public <D extends ItemDelta<PV, ID>> void applyDelta(D delta) throws SchemaException {
if (delta == null) {
return;
}

LOGGER.trace("Applying {} to {}", delta, newItem);
delta.applyTo(newItem);
}

@Override
public String getDisplayName() {
Expand Down Expand Up @@ -310,7 +329,7 @@ private <IW extends ItemWrapper> ItemStatus findObjectStatus(IW parent) {
return status;

}


@Override
public boolean hasChanged() {
Expand Down Expand Up @@ -744,4 +763,8 @@ public void setStripe(boolean stripe) {
this.stripe = stripe;
}

protected I getOldItem() {
return oldItem;
}

}
Expand Up @@ -24,6 +24,7 @@
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -87,4 +88,6 @@ public interface PrismContainerValueWrapper<C extends Containerable> extends Pri

void sort();

<ID extends ItemDelta> void applyDelta(ID delta) throws SchemaException;

}
Expand Up @@ -34,6 +34,7 @@
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DebugUtil;
Expand Down Expand Up @@ -67,6 +68,51 @@ public PrismContainerValueWrapperImpl(PrismContainerWrapper<C> parent, PrismCont
super(parent, pcv, status);
}

@Override
public <D extends ItemDelta<PrismContainerValue<C>, ID>, ID extends ItemDefinition> void addToDelta(D delta)
throws SchemaException {


switch (getStatus()) {
case ADDED:
boolean wasChanged = false;
for (ItemWrapper<?, ?, ?, ?> itemWrapper : items) {
D subDelta = (D) itemWrapper.getDelta(false);
if (subDelta == null) {
continue;
}
wasChanged = true;
subDelta.applyTo(getOldValue());
}
if (wasChanged) {
delta.addValueToAdd(getOldValue().clone());
}
break;
case NOT_CHANGED:
for (ItemWrapper<?, ?, ?, ?> itemWrapper : items) {
D subDelta = (D) itemWrapper.getDelta(true);
if (subDelta == null) {
continue;
}
wasChanged = true;
delta.merge(subDelta);
}
break;
case DELETED :
delta.addValueToDelete(getOldValue().clone());
}
}

@Override
public <ID extends ItemDelta> void applyDelta(ID delta) throws SchemaException {
if (delta == null) {
return;
}

LOGGER.trace("Applying {} to {}", delta, getNewValue());
delta.applyTo(getNewValue());
}

@Override
public void setRealValue(C realValue) {
LOGGER.trace("Nothing to do");
Expand All @@ -83,6 +129,11 @@ public String getDisplayName() {
@Override
public String getHelpText() {
return WebPrismUtil.getHelpText(getContainerDefinition());





}

@Override
Expand Down
Expand Up @@ -17,6 +17,7 @@

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.namespace.QName;
Expand All @@ -26,13 +27,15 @@
import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper;
import com.evolveum.midpoint.prism.ComplexTypeDefinition;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.MutablePrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -224,5 +227,36 @@ public <IW extends ItemWrapper> IW findItem(ItemPath path, Class<IW> type) throw
public String debugDump(int indent) {
return super.debugDump(indent);
}

protected <C extends Containerable> void cleanupEmptyContainers(PrismContainer<C> container) {
List<PrismContainerValue<C>> values = container.getValues();
List<PrismContainerValue<C>> valuesToBeRemoved = new ArrayList<>();
for (PrismContainerValue<C> value : values) {
List<Item<?,?>> items = value.getItems();
if (items != null) {
Iterator<Item<?,?>> iterator = items.iterator();
while (iterator.hasNext()) {
Item<?,?> item = iterator.next();

if (item instanceof PrismContainer) {
cleanupEmptyContainers((PrismContainer) item);

if (item.isEmpty()) {
iterator.remove();
}
} else {
// cleanupEmptyItem()
}
}
}

if (items == null || value.isEmpty()) {
valuesToBeRemoved.add(value);
}
}

container.removeAll(valuesToBeRemoved);
}


}
Expand Up @@ -15,10 +15,20 @@
*/
package com.evolveum.midpoint.gui.impl.prism;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.prism.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand All @@ -31,35 +41,60 @@
public class PrismObjectWrapperImpl<O extends ObjectType> extends PrismContainerWrapperImpl<O> implements PrismObjectWrapper<O> {

private static final long serialVersionUID = 1L;

public PrismObjectWrapperImpl(PrismObject<O> item, ItemStatus status) {
super(null, item, status);
}

@Override
public ObjectDelta<O> getObjectDelta() throws SchemaException {
ObjectDelta<O> objectDelta = getPrismContext().deltaFor(getObject().getCompileTimeClass()).asObjectDelta(getObject().getOid());
ObjectDelta<O> objectDelta = getPrismContext().deltaFor(getObject().getCompileTimeClass())
.asObjectDelta(getObject().getOid());

Collection<ItemDelta> deltas = new ArrayList<>();
for (ItemWrapper<?, ?, ?, ?> itemWrapper : getValue().getItems()) {
ItemDelta delta = itemWrapper.getDelta();
ItemDelta delta = itemWrapper.getDelta(true);
if (delta == null) {
continue;
}
objectDelta.addModification(delta);
// objectDelta.addModification(delta);
deltas.add(delta);
}

switch (getStatus()) {
case ADDED:
objectDelta.setChangeType(ChangeType.ADD);
PrismObject<O> clone = (PrismObject<O>) getOldItem().clone();
// cleanupEmptyContainers(clone);
for (ItemDelta d : deltas) {
d.applyTo(clone);
}
objectDelta.setObjectToAdd(clone);
break;
case NOT_CHANGED:
objectDelta.mergeModifications(deltas);
break;
case DELETED:
objectDelta.setChangeType(ChangeType.DELETE);
break;
}

// if (ItemStatus.ADDED == getStatus()) {
// objectDelta.setObjectToAdd(getObject());
// }

if (objectDelta.isEmpty()) {
return null;
}

return objectDelta;
}

@Override
@Deprecated
public String getOid() {
return ((PrismObject<O>) getItem()).getOid();
}

@Override
public PrismObject<O> getObject() {
return (PrismObject<O>) getItem();
Expand All @@ -69,10 +104,10 @@ public PrismObject<O> getObject() {
public PrismObjectValueWrapper<O> getValue() {
return (PrismObjectValueWrapper<O>) getValues().iterator().next();
}

@Override
public String getDisplayName() {
return "properties";
}

}

0 comments on commit a10209d

Please sign in to comment.