/**
* Copyright (c) 2015-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.objectdetails;
import com.evolveum.midpoint.gui.api.ComponentConstants;
import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab;
import com.evolveum.midpoint.gui.api.component.tabs.PanelTab;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto;
import com.evolveum.midpoint.web.component.form.Form;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoProvider;
import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoProviderOptions;
import com.evolveum.midpoint.web.page.admin.users.dto.FocusSubwrapperDto;
import com.evolveum.midpoint.web.page.self.PageSelfProfile;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.string.StringValue;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
/**
* @author semancik
*
*/
public class FocusMainPanel<F extends FocusType> extends AbstractObjectMainPanel<F> {
private static final long serialVersionUID = 1L;
private static final Trace LOGGER = TraceManager.getTrace(FocusMainPanel.class);
private LoadableModel<List<FocusSubwrapperDto<ShadowType>>> projectionModel;
private LoadableModel<List<AssignmentEditorDto>> assignmentsModel;
private TaskDtoProvider taskDtoProvider;
private FocusAssignmentsTabPanel assignmentsTabPanel = null;
public FocusMainPanel(String id, LoadableModel<ObjectWrapper<F>> objectModel,
LoadableModel<List<AssignmentEditorDto>> assignmentsModel,
LoadableModel<List<FocusSubwrapperDto<ShadowType>>> projectionModel,
PageAdminFocus<F> parentPage) {
super(id, objectModel, parentPage);
Validate.notNull(projectionModel, "Null projection model");
this.assignmentsModel = assignmentsModel;
this.projectionModel = projectionModel;
initLayout(parentPage);
}
private void initLayout(final PageAdminObjectDetails<F> parentPage) {
getMainForm().setMultiPart(true);
taskDtoProvider = new TaskDtoProvider(parentPage, TaskDtoProviderOptions.minimalOptions());
taskDtoProvider.setQuery(createTaskQuery(null, parentPage));
}
@Override
protected void onInitialize() {
super.onInitialize();
StringValue oidValue = getPage().getPageParameters().get(OnePageParameterEncoder.PARAMETER);
taskDtoProvider.setQuery(createTaskQuery(oidValue != null ? oidValue.toString() : null, (PageBase)getPage()));
}
private ObjectQuery createTaskQuery(String oid, PageBase page) {
if (oid == null) {
oid = "non-existent"; // TODO !!!!!!!!!!!!!!!!!!!!
}
return QueryBuilder.queryFor(TaskType.class, page.getPrismContext())
.item(TaskType.F_OBJECT_REF).ref(oid)
.and()
.block()
.not().item(TaskType.F_EXECUTION_STATUS).eq(TaskExecutionStatusType.CLOSED)
.endBlock()
.and().item(TaskType.F_PARENT).isNull()
.build();
}
@Override
protected List<ITab> createTabs(final PageAdminObjectDetails<F> parentPage) {
List<ITab> tabs = new ArrayList<>();
List<ObjectFormType> objectFormTypes = parentPage.getObjectFormTypes();
// default tabs are always added to component structure, visibility is decided later in
// visible behavior based on adminGuiConfiguration
addDefaultTabs(parentPage, tabs);
addSpecificTabs(parentPage, tabs);
if (objectFormTypes == null) {
return tabs;
}
for (ObjectFormType objectFormType : objectFormTypes) {
final FormSpecificationType formSpecificationType = objectFormType.getFormSpecification();
if (formSpecificationType == null){
continue;
}
String title = formSpecificationType.getTitle();
if (title == null) {
title = "pageAdminFocus.extended";
}
if (StringUtils.isEmpty(formSpecificationType.getPanelClass())) {
continue;
}
tabs.add(
new PanelTab(parentPage.createStringResource(title)) {
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer createPanel(String panelId) {
return createTabPanel(panelId, formSpecificationType, parentPage);
}
});
}
return tabs;
}
protected WebMarkupContainer createTabPanel(String panelId, FormSpecificationType formSpecificationType,
PageAdminObjectDetails<F> parentPage) {
String panelClassName = formSpecificationType.getPanelClass();
Class<?> panelClass;
try {
panelClass = Class.forName(panelClassName);
} catch (ClassNotFoundException e) {
throw new SystemException("Panel class '"+panelClassName+"' as specified in admin GUI configuration was not found", e);
}
if (AbstractFocusTabPanel.class.isAssignableFrom(panelClass)) {
Constructor<?> constructor;
try {
constructor = panelClass.getConstructor(String.class, Form.class, LoadableModel.class, LoadableModel.class, LoadableModel.class, PageBase.class);
} catch (NoSuchMethodException | SecurityException e) {
throw new SystemException("Unable to locate constructor (String,Form,LoadableModel,LoadableModel,LoadableModel,PageBase) in "+panelClass+": "+e.getMessage(), e);
}
AbstractFocusTabPanel<F> tabPanel;
try {
tabPanel = (AbstractFocusTabPanel<F>) constructor.newInstance(panelId, getMainForm(), getObjectModel(),
assignmentsModel, projectionModel ,parentPage);
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new SystemException("Error instantiating "+panelClass+": "+e.getMessage(), e);
}
return tabPanel;
} else if (AbstractObjectTabPanel.class.isAssignableFrom(panelClass)) {
Constructor<?> constructor;
try {
constructor = panelClass.getConstructor(String.class, Form.class, LoadableModel.class, PageBase.class);
} catch (NoSuchMethodException | SecurityException e) {
throw new SystemException("Unable to locate constructor (String,Form,LoadableModel,PageBase) in "+panelClass+": "+e.getMessage(), e);
}
AbstractObjectTabPanel<F> tabPanel;
try {
tabPanel = (AbstractObjectTabPanel<F>) constructor.newInstance(panelId, getMainForm(), getObjectModel(), parentPage);
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new SystemException("Error instantiating "+panelClass+": "+e.getMessage(), e);
}
return tabPanel;
} else {
throw new UnsupportedOperationException("Tab panels that are not subclasses of AbstractObjectTabPanel or AbstractFocusTabPanel are not supported yet (got "+panelClass+")");
}
}
protected WebMarkupContainer createFocusDetailsTabPanel(String panelId, PageAdminObjectDetails<F> parentPage) {
return new FocusDetailsTabPanel<F>(panelId, getMainForm(), getObjectModel(), assignmentsModel, projectionModel, parentPage);
}
protected WebMarkupContainer createFocusProjectionsTabPanel(String panelId, PageAdminObjectDetails<F> parentPage) {
return new FocusProjectionsTabPanel<F>(panelId, getMainForm(), getObjectModel(), projectionModel, parentPage);
}
protected WebMarkupContainer createFocusAssignmentsTabPanel(String panelId, PageAdminObjectDetails<F> parentPage) {
assignmentsTabPanel = new FocusAssignmentsTabPanel<F>(panelId, getMainForm(), getObjectModel(), assignmentsModel, parentPage);
return assignmentsTabPanel;
}
protected WebMarkupContainer createRequestAssignmentTabPanel(String panelId, PageAdminObjectDetails<F> parentPage) {
return new RequestAssignmentTabPanel<F>(panelId, getMainForm(), getObjectModel(), assignmentsModel, parentPage);
}
protected WebMarkupContainer createObjectHistoryTabPanel(String panelId, PageAdminObjectDetails<F> parentPage) {
return new ObjectHistoryTabPanel<>(panelId, getMainForm(), getObjectModel(), parentPage);
}
protected IModel<PrismObject<F>> unwrapModel() {
return new AbstractReadOnlyModel<PrismObject<F>>() {
@Override
public PrismObject<F> getObject() {
return getObjectWrapper().getObject();
}
};
}
protected void addSpecificTabs(final PageAdminObjectDetails<F> parentPage, List<ITab> tabs) {
}
protected void addDefaultTabs(final PageAdminObjectDetails<F> parentPage, List<ITab> tabs) {
FocusTabVisibleBehavior authorization = new FocusTabVisibleBehavior(unwrapModel(),
ComponentConstants.UI_FOCUS_TAB_BASIC_URL);
tabs.add(
new PanelTab(parentPage.createStringResource("pageAdminFocus.basic"), authorization){
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer createPanel(String panelId) {
return createFocusDetailsTabPanel(panelId, parentPage);
}
});
authorization = new FocusTabVisibleBehavior(unwrapModel(), ComponentConstants.UI_FOCUS_TAB_PROJECTIONS_URL);
tabs.add(
new CountablePanelTab(parentPage.createStringResource("pageAdminFocus.projections"), authorization){
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer createPanel(String panelId) {
return createFocusProjectionsTabPanel(panelId, parentPage);
}
@Override
public String getCount() {
return Integer.toString(projectionModel.getObject() == null ? 0 : projectionModel.getObject().size());
}
});
authorization = new FocusTabVisibleBehavior(unwrapModel(), ComponentConstants.UI_FOCUS_TAB_ASSIGNMENTS_URL);
tabs.add(
new CountablePanelTab(parentPage.createStringResource("pageAdminFocus.assignments"), authorization) {
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer createPanel(String panelId) {
return createFocusAssignmentsTabPanel(panelId, parentPage);
}
@Override
public String getCount() {
return Integer.toString(assignmentsModel.getObject() == null ? 0 : assignmentsModel.getObject().size());
}
});
authorization = new FocusTabVisibleBehavior(unwrapModel(), ComponentConstants.UI_FOCUS_TAB_TASKS_URL);
tabs.add(
new CountablePanelTab(parentPage.createStringResource("pageAdminFocus.tasks"), authorization) {
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer createPanel(String panelId) {
return new FocusTasksTabPanel<F>(panelId, getMainForm(), getObjectModel(), taskDtoProvider, parentPage);
}
@Override
public String getCount() {
return Long.toString(taskDtoProvider == null ? 0L : taskDtoProvider.size());
}
});
if (!(parentPage instanceof PageSelfProfile)) {
authorization = new FocusTabVisibleBehavior(unwrapModel(), ComponentConstants.UI_FOCUS_TAB_REQUEST_ROLE_URL);
tabs.add(
new PanelTab(parentPage.createStringResource("pageAdminFocus.request"), authorization) {
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer createPanel(String panelId) {
return createRequestAssignmentTabPanel(panelId, parentPage);
}
});
}
}
@Override
protected boolean areSavePreviewButtonsEnabled(){
return assignmentsTabPanel == null ?
super.areSavePreviewButtonsEnabled() : assignmentsTabPanel.isAssignmentsModelChanged();
}
}