}
}
}
//
UIComponent dstChild;
if (srcChildId != null) {
dstChild = session.findObjectById(ObjectType.COMPONENT, srcChildId);
if (dstChild == null) {
throw new StaleModelException("Could not find supposed present child with id " + srcChildId);
}
// julien : this can fail due to a bug in chromattic not implementing equals method properly
// and is replaced with the foreach below
/*
* if (!dst.contains(dstChild)) { throw new IllegalArgumentException("Attempt for updating a ui component " +
* session.pathOf(dstChild) + "that is not present in the target ui container " + session.pathOf(dst)); }
*/
boolean found = false;
for (UIComponent child : dst.getComponents()) {
if (child.getObjectId().equals(srcChildId)) {
found = true;
break;
}
}
//
if (!found) {
if (hierarchyRelationships.containsKey(srcChildId)) {
String srcId = hierarchyRelationships.get(srcChildId);
// It's a move operation, so we move the node first
dst.getComponents().add(dstChild);
//
changes.add(new ModelChange.Move(srcId, dst.getObjectId(), srcChildId));
} else {
throw new IllegalArgumentException("Attempt for updating a ui component " + session.pathOf(dstChild)
+ " that is not present in the target ui container " + session.pathOf(dst));
}
}
//
changes.add(new ModelChange.Update(srcChild));
} else {
String name = srcChild.getStorageName();
if (name == null) {
// We manufacture one name
name = UUID.randomUUID().toString();
}
if (srcChild instanceof ContainerData) {
dstChild = dst.add(ObjectType.CONTAINER, name);
} else if (srcChild instanceof ApplicationData) {
dstChild = dst.add(ObjectType.WINDOW, name);
} else if (srcChild instanceof BodyData) {
dstChild = dst.add(ObjectType.BODY, name);
} else {
throw new StaleModelException("Was not expecting child " + srcChild);
}
changes.add(new ModelChange.Create(dst.getObjectId(), srcChild));
}
//
if (transientDashboardData != null) {
Attributes attrs = dstChild.getAttributes();
attrs.setValue(MappedAttributes.SHOW_INFO_BAR, transientDashboardData.isShowInfoBar());
attrs.setValue(MappedAttributes.SHOW_MODE, transientDashboardData.isShowApplicationMode());
attrs.setValue(MappedAttributes.SHOW_WINDOW_STATE, transientDashboardData.isShowApplicationState());
attrs.setValue(MappedAttributes.THEME, transientDashboardData.getTheme());
}
save(srcChild, dstChild, changes, hierarchyRelationships);
//
String dstChildId = dstChild.getObjectId();
modelObjectMap.put(dstChildId, srcChild);
orders.add(dstChildId);
}
// Take care of move operation that could be seen as a remove otherwise
for (UIComponent dstChild : dst.getComponents()) {
String dstChildId = dstChild.getObjectId();
if (!modelObjectMap.containsKey(dstChildId)) {
String parentId = hierarchyRelationships.get(dstChildId);
if (parentId != null) {
// Get the new parent
UIContainer parent = session.findObjectById(ObjectType.CONTAINER, parentId);
// Perform the move
parent.getComponents().add(dstChild);
//
changes.add(new ModelChange.Move(dst.getObjectId(), parentId, dstChildId));
// julien : we do not need to create an update operation
// as later the update operation will be created when the
// object
// will be processed
} else if (hierarchyRelationships.containsKey(dstChildId)) {
// The dstChild is placed under transient Chromattic entity whose storageId == null. However,
// the hierachyRelationships contains dstChildId in key set, so we have to mark dstChild as
// moved object
modelObjectMap.put(dstChildId, null);
}
}
}
// Delete removed children
for (Iterator<UIComponent> i = dst.getComponents().iterator(); i.hasNext();) {
UIComponent dstChild = i.next();
String dstChildId = dstChild.getObjectId();
if (!modelObjectMap.containsKey(dstChildId)) {
i.remove();
changes.add(new ModelChange.Destroy(dstChildId));
}
}