/**
* Copyright (c) 2015-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.schema.util;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections.map.HashedMap;
import org.jetbrains.annotations.NotNull;
import java.util.*;
/**
* @author semancik
*
*/
public class AdminGuiConfigTypeUtil {
public static AdminGuiConfigurationType compileAdminGuiConfiguration(@NotNull List<AdminGuiConfigurationType> adminGuiConfigurations,
PrismObject<SystemConfigurationType> systemConfiguration) {
// if there's no admin config at all, return null (to preserve original behavior)
if (adminGuiConfigurations.isEmpty() &&
(systemConfiguration == null || systemConfiguration.asObjectable().getAdminGuiConfiguration() == null)) {
return null;
}
AdminGuiConfigurationType composite = new AdminGuiConfigurationType();
if (systemConfiguration != null) {
applyAdminGuiConfiguration(composite, systemConfiguration.asObjectable().getAdminGuiConfiguration());
}
for (AdminGuiConfigurationType adminGuiConfiguration: adminGuiConfigurations) {
applyAdminGuiConfiguration(composite, adminGuiConfiguration);
}
return composite;
}
private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composite, AdminGuiConfigurationType adminGuiConfiguration) {
if (adminGuiConfiguration == null) {
return;
}
composite.getAdditionalMenuLink().addAll(adminGuiConfiguration.getAdditionalMenuLink());
composite.getUserDashboardLink().addAll(adminGuiConfiguration.getUserDashboardLink());
if (adminGuiConfiguration.getDefaultTimezone() != null) {
composite.setDefaultTimezone(adminGuiConfiguration.getDefaultTimezone());
}
if (adminGuiConfiguration.getPreferredDataLanguage() != null) {
composite.setPreferredDataLanguage(adminGuiConfiguration.getPreferredDataLanguage());
}
if (adminGuiConfiguration.getObjectLists() != null) {
if (composite.getObjectLists() == null) {
composite.setObjectLists(adminGuiConfiguration.getObjectLists().clone());
} else {
for (GuiObjectListType objectList: adminGuiConfiguration.getObjectLists().getObjectList()) {
mergeList(composite.getObjectLists(), objectList);
}
}
}
if (adminGuiConfiguration.getObjectForms() != null) {
if (composite.getObjectForms() == null) {
composite.setObjectForms(adminGuiConfiguration.getObjectForms().clone());
} else {
for (ObjectFormType objectForm: adminGuiConfiguration.getObjectForms().getObjectForm()) {
replaceForm(composite.getObjectForms(), objectForm);
}
}
}
if (adminGuiConfiguration.getUserDashboard() != null) {
if (composite.getUserDashboard() == null) {
composite.setUserDashboard(adminGuiConfiguration.getUserDashboard().clone());
} else {
for (DashboardWidgetType widget: adminGuiConfiguration.getUserDashboard().getWidget()) {
mergeWidget(composite.getUserDashboard(), widget);
}
}
}
if (composite.getObjectLists() != null && composite.getObjectLists().getObjectList() != null){
for (GuiObjectListType objectListType : composite.getObjectLists().getObjectList()){
if (objectListType.getColumn() != null) {
// objectListType.getColumn().clear();
// objectListType.getColumn().addAll(orderCustomColumns(objectListType.getColumn()));
List<GuiObjectColumnType> orderedList = orderCustomColumns(objectListType.getColumn());
objectListType.getColumn().clear();
objectListType.getColumn().addAll(orderedList);
}
}
}
}
private static void replaceForm(ObjectFormsType objectForms, ObjectFormType newForm) {
Iterator<ObjectFormType> iterator = objectForms.getObjectForm().iterator();
while (iterator.hasNext()) {
ObjectFormType currentForm = iterator.next();
if (currentForm.getType().equals(newForm.getType())) {
iterator.remove();
}
}
objectForms.getObjectForm().add(newForm.clone());
}
private static void mergeList(GuiObjectListsType objectLists, GuiObjectListType newList) {
// We support only the default object lists now, so simply replace the existing definition with the
// latest definition. We will need a more sophisticated merging later.
Iterator<GuiObjectListType> iterator = objectLists.getObjectList().iterator();
while (iterator.hasNext()) {
GuiObjectListType currentList = iterator.next();
if (currentList.getType().equals(newList.getType())) {
iterator.remove();
}
}
objectLists.getObjectList().add(newList.clone());
}
private static void mergeWidget(DashboardLayoutType compositeDashboard, DashboardWidgetType newWidget) {
String newWidgetIdentifier = newWidget.getIdentifier();
DashboardWidgetType compositeWidget = findWidget(compositeDashboard, newWidgetIdentifier);
if (compositeWidget == null) {
compositeDashboard.getWidget().add(newWidget.clone());
} else {
mergeWidget(compositeWidget, newWidget);
}
}
private static void mergeWidget(DashboardWidgetType compositeWidget, DashboardWidgetType newWidget) {
UserInterfaceElementVisibilityType newCompositeVisibility = mergeVisibility(compositeWidget.getVisibility(), newWidget.getVisibility());
compositeWidget.setVisibility(newCompositeVisibility);
}
private static UserInterfaceElementVisibilityType mergeVisibility(
UserInterfaceElementVisibilityType compositeVisibility, UserInterfaceElementVisibilityType newVisibility) {
if (compositeVisibility == null) {
compositeVisibility = UserInterfaceElementVisibilityType.VACANT;
}
if (newVisibility == null) {
newVisibility = UserInterfaceElementVisibilityType.VACANT;
}
if (compositeVisibility == UserInterfaceElementVisibilityType.HIDDEN || newVisibility == UserInterfaceElementVisibilityType.HIDDEN) {
return UserInterfaceElementVisibilityType.HIDDEN;
}
if (compositeVisibility == UserInterfaceElementVisibilityType.VISIBLE || newVisibility == UserInterfaceElementVisibilityType.VISIBLE) {
return UserInterfaceElementVisibilityType.VISIBLE;
}
if (compositeVisibility == UserInterfaceElementVisibilityType.AUTOMATIC || newVisibility == UserInterfaceElementVisibilityType.AUTOMATIC) {
return UserInterfaceElementVisibilityType.AUTOMATIC;
}
return UserInterfaceElementVisibilityType.VACANT;
}
public static DashboardWidgetType findWidget(DashboardLayoutType dashboard, String widgetIdentifier) {
for (DashboardWidgetType widget: dashboard.getWidget()) {
if (widget.getIdentifier().equals(widgetIdentifier)) {
return widget;
}
}
return null;
}
/*
the ordering algorithm is: the first level is occupied by
the column which previousColumn == null || "" || notExistingColumnNameValue.
Each next level contains columns which
previousColumn == columnNameFromPreviousLevel
*/
public static List<GuiObjectColumnType> orderCustomColumns(List<GuiObjectColumnType> customColumns){
if (customColumns == null || customColumns.size() == 0){
return new ArrayList<>();
}
List<GuiObjectColumnType> customColumnsList = new ArrayList<>();
customColumnsList.addAll(customColumns);
List<String> previousColumnValues = new ArrayList<>();
previousColumnValues.add(null);
previousColumnValues.add("");
Map<String, String> columnRefsMap = new HashedMap();
for (GuiObjectColumnType column : customColumns){
columnRefsMap.put(column.getName(), column.getPreviousColumn() == null ? "" : column.getPreviousColumn());
}
List<String> temp = new ArrayList<> ();
int index = 0;
while (index < customColumns.size()){
int sortFrom = index;
for (int i = index; i < customColumnsList.size(); i++){
GuiObjectColumnType column = customColumnsList.get(i);
if (previousColumnValues.contains(column.getPreviousColumn()) ||
!columnRefsMap.containsKey(column.getPreviousColumn())){
Collections.swap(customColumnsList, index, i);
index++;
temp.add(column.getName());
}
}
if (temp.size() == 0){
temp.add(customColumnsList.get(index).getName());
index++;
}
if (index - sortFrom > 1){
Collections.sort(customColumnsList.subList(sortFrom, index - 1), new Comparator<GuiObjectColumnType>() {
@Override
public int compare(GuiObjectColumnType o1, GuiObjectColumnType o2) {
return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2.getName());
}
});
}
previousColumnValues.clear();
previousColumnValues.addAll(temp);
temp.clear();
}
return customColumnsList;
}
}