/* * 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.page.admin.certification; import com.evolveum.midpoint.certification.api.AccessCertificationApiConstants; import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.DiffUtil; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.component.TabbedPanel; import com.evolveum.midpoint.web.page.admin.certification.dto.CertDefinitionDto; import com.evolveum.midpoint.web.page.admin.certification.dto.DefinitionScopeDto; import com.evolveum.midpoint.web.page.admin.certification.dto.StageDefinitionDto; 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.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.tabs.AbstractTab; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.*; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @author mederly */ @PageDescriptor(url = "/admin/certification/definition", action = { @AuthorizationAction(actionUri = PageAdminCertification.AUTH_CERTIFICATION_ALL, label = PageAdminCertification.AUTH_CERTIFICATION_ALL_LABEL, description = PageAdminCertification.AUTH_CERTIFICATION_ALL_DESCRIPTION), @AuthorizationAction(actionUri = PageAdminCertification.AUTH_CERTIFICATION_DEFINITION, label = PageAdminCertification.AUTH_CERTIFICATION_DEFINITION_LABEL, description = PageAdminCertification.AUTH_CERTIFICATION_DEFINITION_DESCRIPTION) }) public class PageCertDefinition extends PageAdminCertification { private static final Trace LOGGER = TraceManager.getTrace(PageCertDefinition.class); private static final String DOT_CLASS = PageCertDefinition.class.getName() + "."; private static final String OPERATION_LOAD_DEFINITION = DOT_CLASS + "loadDefinition"; private static final String ID_SUMMARY_PANEL = "summaryPanel"; private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_BACK_BUTTON = "backButton"; private static final String ID_SAVE_BUTTON = "saveButton"; private static final String OPERATION_SAVE_DEFINITION = DOT_CLASS + "saveDefinition"; private static final String ID_TAB_PANEL = "tabPanel"; private LoadableModel<CertDefinitionDto> definitionModel; private String definitionOid; CertDecisionHelper helper = new CertDecisionHelper(); public PageCertDefinition(PageParameters parameters) { definitionOid = parameters.get(OnePageParameterEncoder.PARAMETER).toString(); initModels(); initLayout(); } //region Data private void initModels() { definitionModel = new LoadableModel<CertDefinitionDto>(false) { @Override protected CertDefinitionDto load() { if (definitionOid != null) { return loadDefinition(definitionOid); } else { try { return createDefinition(); } catch (SchemaException e) { throw new SystemException(e.getMessage(), e); } } } }; } private CertDefinitionDto loadDefinition(String definitionOid) { Task task = createSimpleTask(OPERATION_LOAD_DEFINITION); OperationResult result = task.getResult(); AccessCertificationDefinitionType definition = null; CertDefinitionDto definitionDto = null; try { Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createResolveNames()); PrismObject<AccessCertificationDefinitionType> definitionObject = WebModelServiceUtils.loadObject(AccessCertificationDefinitionType.class, definitionOid, options, PageCertDefinition.this, task, result); if (definitionObject != null) { definition = definitionObject.asObjectable(); } definitionDto = new CertDefinitionDto(definition, this, getPrismContext()); result.recordSuccessIfUnknown(); } catch (Exception ex) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't get definition", ex); result.recordFatalError("Couldn't get definition.", ex); } result.recomputeStatus(); if (!WebComponentUtil.isSuccessOrHandledError(result)) { showResult(result); } return definitionDto; } private CertDefinitionDto createDefinition() throws SchemaException { AccessCertificationDefinitionType definition = getPrismContext().createObjectable(AccessCertificationDefinitionType.class); definition.setHandlerUri(AccessCertificationApiConstants.DIRECT_ASSIGNMENT_HANDLER_URI); AccessCertificationStageDefinitionType stage = new AccessCertificationStageDefinitionType(getPrismContext()); stage.setName("Stage 1"); stage.setNumber(1); stage.setReviewerSpecification(new AccessCertificationReviewerSpecificationType(getPrismContext())); definition.getStageDefinition().add(stage); CertDefinitionDto definitionDto = new CertDefinitionDto(definition, PageCertDefinition.this, getPrismContext()); return definitionDto; } //endregion //region Layout private void initLayout() { CertDefinitionSummaryPanel summaryPanel = new CertDefinitionSummaryPanel(ID_SUMMARY_PANEL, new PropertyModel<>(definitionModel, CertDefinitionDto.F_PRISM_OBJECT)); add(summaryPanel); Form mainForm = new Form(ID_MAIN_FORM); add(mainForm); initTabs(mainForm); initButtons(mainForm); } private void initTabs(Form mainForm) { List<ITab> tabs = new ArrayList<>(); tabs.add(new AbstractTab(createStringResource("PageCertDefinition.basic")) { @Override public WebMarkupContainer getPanel(String panelId) { return new DefinitionBasicPanel(panelId, definitionModel); } }); tabs.add(new AbstractTab(createStringResource("PageCertDefinition.scopeDefinition")) { @Override public WebMarkupContainer getPanel(String panelId) { return new DefinitionScopePanel(panelId, new PropertyModel<>(definitionModel, CertDefinitionDto.F_SCOPE_DEFINITION)); } }); tabs.add(new CountablePanelTab(createStringResource("PageCertDefinition.stagesDefinition")) { @Override public WebMarkupContainer createPanel(String panelId) { return new DefinitionStagesPanel(panelId, new PropertyModel<>(definitionModel, CertDefinitionDto.F_STAGE_DEFINITION), PageCertDefinition.this); } @Override public String getCount() { return String.valueOf(definitionModel.getObject().getNumberOfStages()); } }); tabs.add(new AbstractTab(createStringResource("PageCertDefinition.xmlDefinition")) { @Override public WebMarkupContainer getPanel(String panelId) { return new DefinitionXmlPanel(panelId, definitionModel); } }); TabbedPanel tabPanel = WebComponentUtil.createTabPanel(ID_TAB_PANEL, this, tabs, null); mainForm.add(tabPanel); } public TabbedPanel getTabPanel() { return (TabbedPanel) get(createComponentPath(ID_MAIN_FORM, ID_TAB_PANEL)); } private void initButtons(final Form mainForm) { AjaxButton backButton = new AjaxButton(ID_BACK_BUTTON, createStringResource("PageCertDefinition.button.back")) { @Override public void onClick(AjaxRequestTarget target) { redirectBack(); } }; mainForm.add(backButton); AjaxSubmitButton saveButton = new AjaxSubmitButton(ID_SAVE_BUTTON, createStringResource("PageCertDefinition.button.save")) { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { savePerformed(target); } }; mainForm.add(saveButton); } //endregion //region Actions public void savePerformed(AjaxRequestTarget target) { CertDefinitionDto dto = definitionModel.getObject(); // if (StringUtils.isEmpty(dto.getXml())) { // error(getString("CertDefinitionPage.message.cantSaveEmpty")); // target.add(getFeedbackPanel()); // return; // } if (StringUtils.isEmpty(dto.getName())) { error(getString("CertDefinitionPage.message.cantSaveEmptyName")); target.add(getFeedbackPanel()); return; } Task task = createSimpleTask(OPERATION_SAVE_DEFINITION); OperationResult result = task.getResult(); try { AccessCertificationDefinitionType oldObject = dto.getOldDefinition(); oldObject.asPrismObject().revive(getPrismContext()); AccessCertificationDefinitionType newObject = dto.getUpdatedDefinition(getPrismContext()); newObject.asPrismObject().revive(getPrismContext()); ObjectDelta<AccessCertificationDefinitionType> delta; if (oldObject.getOid() != null) { delta = DiffUtil.diff(oldObject, newObject); } else { delta = ObjectDelta.createAddDelta(newObject.asPrismObject()); } if (LOGGER.isTraceEnabled()) { LOGGER.trace("Access definition delta:\n{}", delta.debugDump()); } delta.normalize(); if (delta != null && !delta.isEmpty()) { getPrismContext().adopt(delta); ModelExecuteOptions options = new ModelExecuteOptions(); options.setRaw(true); getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), options, task, result); } result.computeStatus(); } catch (Exception ex) { result.recordFatalError("Couldn't save object: " + ex.getMessage(), ex); } showResult(result); if (result.isError()) { target.add(getFeedbackPanel()); } else { redirectBack(); } } //endregion }