/*
* Copyright (c) 2010-2016 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.web.component.data.column;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.xml.namespace.QName;
import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.web.component.util.SelectableBean;
public class ColumnUtils {
public static <T> List<IColumn<T, String>> createColumns(List<ColumnTypeDto<String>> columns) {
List<IColumn<T, String>> tableColumns = new ArrayList<>();
for (ColumnTypeDto<String> column : columns) {
PropertyColumn<T, String> tableColumn = null;
if (column.isSortable()) {
tableColumn = createPropertyColumn(column.getColumnName(), column.getSortableColumn(),
column.getColumnValue(), column.isMultivalue());
} else {
tableColumn = new PropertyColumn<T, String>(createStringResource(column.getColumnName()),
column.getColumnValue());
}
tableColumns.add(tableColumn);
}
return tableColumns;
}
private static <T> PropertyColumn<T, String> createPropertyColumn(String name, String sortableProperty,
final String expression, final boolean multivalue) {
return new PropertyColumn<T, String>(createStringResource(name), sortableProperty, expression) {
private static final long serialVersionUID = 1L;
@Override
public void populateItem(Item item, String componentId, IModel rowModel) {
if (multivalue) {
IModel<List> values = new PropertyModel<List>(rowModel, expression);
RepeatingView repeater = new RepeatingView(componentId);
for (final Object task : values.getObject()) {
repeater.add(new Label(repeater.newChildId(), task.toString()));
}
item.add(repeater);
return;
}
super.populateItem(item, componentId, rowModel);
}
};
}
public static <O extends ObjectType> List<IColumn<SelectableBean<O>, String>> getDefaultColumns(Class<? extends O> type) {
if (type == null) {
return getDefaultUserColumns();
}
if (type.equals(UserType.class)) {
return getDefaultUserColumns();
} else if (RoleType.class.equals(type)) {
return getDefaultRoleColumns();
} else if (OrgType.class.equals(type)) {
return getDefaultOrgColumns();
} else if (ServiceType.class.equals(type)) {
return getDefaultServiceColumns();
} else if (type.equals(TaskType.class)) {
return getDefaultTaskColumns();
} else if (type.equals(ResourceType.class)) {
return getDefaultResourceColumns();
} else {
return new ArrayList<>();
// throw new UnsupportedOperationException("Will be implemented eventually");
}
}
public static <O extends ObjectType> IColumn<SelectableBean<O>, String> createIconColumn(Class<? extends O> type){
if (type.equals(ObjectType.class)){
return getDefaultIcons();
}
if (type.equals(UserType.class)) {
return getUserIconColumn();
} else if (RoleType.class.equals(type)) {
return getRoleIconColumn();
} else if (OrgType.class.equals(type)) {
return getOrgIconColumn();
} else if (ServiceType.class.equals(type)) {
return getServiceIconColumn();
} else if (ShadowType.class.equals(type)) {
return getShadowIconColumn();
} else if (type.equals(TaskType.class)) {
return getTaskIconColumn();
} else if (type.equals(ResourceType.class)) {
return getResourceIconColumn();
} else if (type.equals(AccessCertificationDefinitionType.class)) {
return getAccessCertificationDefinitionIconColumn();
} else {
return getEmptyIconColumn();
// throw new UnsupportedOperationException("Will be implemented eventually");
}
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getEmptyIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return "";
}
};
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getDefaultIcons(){
return new IconColumn<SelectableBean<T>>(createStringResource("userBrowserDialog.type")) {
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T object = rowModel.getObject().getValue();
return object != null ? WebComponentUtil.createDefaultIcon(object.asPrismObject()) : null;
}
};
}
};
}
private static IModel<String> createIconColumnHeaderModel() {
return new Model<String>() {
@Override
public String getObject() {
return "";
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getUserIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T user = rowModel.getObject().getValue();
return user != null ? WebComponentUtil.createUserIcon(user.asPrismContainer()) : null;
}
};
}
@Override
protected IModel<String> createTitleModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
T user = rowModel.getObject().getValue();
String iconClass = user != null ? WebComponentUtil.createUserIcon(user.asPrismContainer()) : null;
String compareStringValue = GuiStyleConstants.CLASS_OBJECT_USER_ICON + " " + GuiStyleConstants.CLASS_ICON_STYLE;
String titleValue = "";
if (iconClass != null &&
iconClass.startsWith(compareStringValue) &&
iconClass.length() > compareStringValue.length()){
titleValue = iconClass.substring(compareStringValue.length());
}
return createStringResource("ColumnUtils.getUserIconColumn.createTitleModel." + titleValue) == null ?
"" : createStringResource("ColumnUtils.getUserIconColumn.createTitleModel." + titleValue).getString();
}
};
}
};
}
public static <T extends ObjectType> IColumn<SelectableBean<T>, String> getShadowIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T shadow = rowModel.getObject().getValue();
if (shadow == null) {
return WebComponentUtil.createErrorIcon(rowModel.getObject().getResult());
} else {
return WebComponentUtil.createShadowIcon(shadow.asPrismContainer());
}
}
};
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getRoleIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T role = rowModel.getObject().getValue();
return role != null ? WebComponentUtil.createRoleIcon(role.asPrismContainer()) : null;
}
};
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getOrgIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T org = rowModel.getObject().getValue();
return org != null ? WebComponentUtil.createOrgIcon(org.asPrismContainer()) : null;
}
};
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getServiceIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T service = rowModel.getObject().getValue();
return service != null ? WebComponentUtil.createServiceIcon(service.asPrismContainer()) : null;
}
};
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getTaskIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T task = rowModel.getObject().getValue();
return task != null ? WebComponentUtil.createTaskIcon(task.asPrismContainer()) : null;
}
};
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getAccessCertificationDefinitionIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return GuiStyleConstants.CLASS_OBJECT_CERT_DEF_ICON + " " + GuiStyleConstants.CLASS_ICON_STYLE_NORMAL;
}
};
}
};
}
private static <T extends ObjectType> IColumn<SelectableBean<T>, String> getResourceIconColumn(){
return new IconColumn<SelectableBean<T>>(createIconColumnHeaderModel()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<SelectableBean<T>> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
T resource = rowModel.getObject().getValue();
if (resource == null) {
return GuiStyleConstants.CLASS_OBJECT_RESOURCE_ICON;
} else {
return WebComponentUtil.createResourceIcon(resource.asPrismContainer());
}
}
};
}
};
}
public static StringResourceModel createStringResource(String resourceKey, Object... objects) {
return new StringResourceModel(resourceKey).setModel(new Model<String>()).setDefaultValue(resourceKey)
.setParameters(objects);
}
public static <T extends ObjectType> List<IColumn<SelectableBean<T>, String>> getDefaultUserColumns() {
List<IColumn<SelectableBean<T>, String>> columns = new ArrayList<IColumn<SelectableBean<T>, String>>();
List<ColumnTypeDto<String>> columnsDefs = Arrays.asList(
new ColumnTypeDto<String>("UserType.givenName", UserType.F_GIVEN_NAME.getLocalPart(),
SelectableBean.F_VALUE + ".givenName.orig", false),
new ColumnTypeDto<String>("UserType.familyName", UserType.F_FAMILY_NAME.getLocalPart(),
SelectableBean.F_VALUE + ".familyName.orig", false),
new ColumnTypeDto<String>("UserType.fullName", UserType.F_FULL_NAME.getLocalPart(),
SelectableBean.F_VALUE + ".fullName.orig", false),
new ColumnTypeDto<String>("UserType.emailAddress", UserType.F_EMAIL_ADDRESS.getLocalPart(),
SelectableBean.F_VALUE + ".emailAddress", false)
);
columns.addAll(ColumnUtils.<SelectableBean<T>>createColumns(columnsDefs));
return columns;
}
public static <T extends ObjectType> List<IColumn<SelectableBean<T>, String>> getDefaultTaskColumns() {
List<IColumn<SelectableBean<T>, String>> columns = new ArrayList<IColumn<SelectableBean<T>, String>>();
columns.add(
new AbstractColumn<SelectableBean<T>, String>(createStringResource("TaskType.kind")) {
private static final long serialVersionUID = 1L;
@Override
public void populateItem(Item<ICellPopulator<SelectableBean<T>>> cellItem,
String componentId, IModel<SelectableBean<T>> rowModel) {
SelectableBean<TaskType> object = (SelectableBean<TaskType>) rowModel.getObject();
PrismProperty<ShadowKindType> pKind = object.getValue() != null ?
object.getValue().asPrismObject().findProperty(
new ItemPath(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_KIND))
: null;
if (pKind != null) {
cellItem.add(new Label(componentId, WebComponentUtil
.createLocalizedModelForEnum(pKind.getRealValue(), cellItem)));
} else {
cellItem.add(new Label(componentId));
}
}
});
columns.add(new AbstractColumn<SelectableBean<T>, String>(
createStringResource("TaskType.intent")) {
@Override
public void populateItem(Item<ICellPopulator<SelectableBean<T>>> cellItem,
String componentId, IModel<SelectableBean<T>> rowModel) {
SelectableBean<TaskType> object = (SelectableBean<TaskType>) rowModel.getObject();
PrismProperty<String> pIntent = object.getValue() != null ?
object.getValue().asPrismObject().findProperty(
new ItemPath(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_INTENT))
: null;
if (pIntent != null) {
cellItem.add(new Label(componentId, pIntent.getRealValue()));
} else {
cellItem.add(new Label(componentId));
}
}
});
columns.add(new AbstractColumn<SelectableBean<T>, String>(
createStringResource("TaskType.objectClass")) {
@Override
public void populateItem(Item<ICellPopulator<SelectableBean<T>>> cellItem,
String componentId, IModel<SelectableBean<T>> rowModel) {
SelectableBean<TaskType> object = (SelectableBean<TaskType>) rowModel.getObject();
PrismProperty<QName> pObjectClass = object.getValue() != null ?
object.getValue().asPrismObject().findProperty(
new ItemPath(TaskType.F_EXTENSION, SchemaConstants.OBJECTCLASS_PROPERTY_NAME))
: null;
if (pObjectClass != null) {
cellItem.add(new Label(componentId, pObjectClass.getRealValue().getLocalPart()));
} else {
cellItem.add(new Label(componentId, ""));
}
}
});
List<ColumnTypeDto<String>> columnsDefs = Arrays.asList(
new ColumnTypeDto<String>("TaskType.executionStatus", TaskType.F_EXECUTION_STATUS.getLocalPart(),
SelectableBean.F_VALUE + ".executionStatus", false));
columns.addAll(ColumnUtils.<SelectableBean<T>>createColumns(columnsDefs));
return columns;
}
public static <T extends ObjectType> List<IColumn<SelectableBean<T>, String>> getDefaultRoleColumns() {
List<IColumn<SelectableBean<T>, String>> columns = new ArrayList<IColumn<SelectableBean<T>, String>>();
columns.addAll((Collection)getDefaultAbstractRoleColumns(RoleType.COMPLEX_TYPE));
return columns;
}
public static <T extends ObjectType> List<IColumn<SelectableBean<T>, String>> getDefaultServiceColumns() {
List<IColumn<SelectableBean<T>, String>> columns = new ArrayList<IColumn<SelectableBean<T>, String>>();
columns.addAll((Collection)getDefaultAbstractRoleColumns(ServiceType.COMPLEX_TYPE));
return columns;
}
public static <T extends ObjectType> List<IColumn<SelectableBean<T>, String>> getDefaultOrgColumns() {
List<IColumn<SelectableBean<T>, String>> columns = new ArrayList<IColumn<SelectableBean<T>, String>>();
columns.addAll((Collection)getDefaultAbstractRoleColumns(OrgType.COMPLEX_TYPE));
return columns;
}
private static <T extends ObjectType> List<IColumn<SelectableBean<T>, String>> getDefaultAbstractRoleColumns(QName type) {
String sortByDisplayName = null;
String sortByIdentifer = null;
if (OrgType.COMPLEX_TYPE.equals(type)) {
sortByDisplayName = AbstractRoleType.F_DISPLAY_NAME.getLocalPart();
sortByIdentifer = AbstractRoleType.F_IDENTIFIER.getLocalPart();
}
List<ColumnTypeDto<String>> columnsDefs = Arrays.asList(
new ColumnTypeDto<String>("AbstractRoleType.displayName",
sortByDisplayName,
SelectableBean.F_VALUE + ".displayName", false),
new ColumnTypeDto<String>("AbstractRoleType.description",
null,
SelectableBean.F_VALUE + ".description", false),
new ColumnTypeDto<String>("AbstractRoleType.identifier", sortByIdentifer,
SelectableBean.F_VALUE + ".identifier", false)
);
return createColumns(columnsDefs);
}
public static <T extends ObjectType> List<IColumn<SelectableBean<T>, String>> getDefaultResourceColumns() {
List<IColumn<SelectableBean<T>, String>> columns = new ArrayList<IColumn<SelectableBean<T>, String>>();
List<ColumnTypeDto<String>> columnsDefs = Arrays.asList(
new ColumnTypeDto<String>("AbstractRoleType.description", null,
SelectableBean.F_VALUE + ".description", false)
);
columns.addAll(ColumnUtils.<SelectableBean<T>>createColumns(columnsDefs));
return columns;
}
}