TransientApplicationState<?> state = (TransientApplicationState<?>) app.getState();
String contentId = state.getContentId();
if ("dashboard/DashboardPortlet".equals(contentId)) {
DashboardData data;
if (app.getStorageId() != null) {
UIContainer dstDashboard = session.findObjectById(ObjectType.CONTAINER, app.getStorageId());
data = loadDashboard(dstDashboard);
// Update those attributes as we have to do it now, they don't exist in a container
// but do exist in a dashboard container
Attributes attrs = dstDashboard.getAttributes();
attrs.setValue(MappedAttributes.SHOW_INFO_BAR, app.isShowInfoBar());
attrs.setValue(MappedAttributes.SHOW_MODE, app.isShowApplicationMode());
attrs.setValue(MappedAttributes.SHOW_WINDOW_STATE, app.isShowApplicationState());
attrs.setValue(MappedAttributes.THEME, app.getTheme());
} else {
data = DashboardData.INITIAL_DASHBOARD;
transientDashboardData = (ApplicationData<?>) srcChild;
}
//
String icon = data.getIcon();
if (icon == null)
icon = app.getIcon();
String title = data.getTitle();
if (title == null)
title = app.getTitle();
String description = data.getDescription();
if (description == null)
description = app.getDescription();
String width = data.getWidth();
if (width == null)
width = app.getWidth();
String height = data.getHeight();
if (height == null)
height = app.getHeight();
data = new DashboardData(data.getStorageId(), data.getId(), data.getName(), icon, data.getTemplate(),
data.getFactoryId(), title, description, width, height, app.getAccessPermissions(),
data.getChildren());
//
srcChild = data;
}
}
}
//
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