From 57edb91d9af8fcb0007758a585d99652f1645b4a Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Thu, 23 Jan 2020 09:01:44 +0100 Subject: [PATCH] language level problem --- .../admin/configuration/PageImportObject.java | 730 +++++++------- .../admin/resources/ResourceSummaryPanel.java | 170 ++-- .../web/page/admin/users/PageUser.java | 908 +++++++++--------- 3 files changed, 904 insertions(+), 904 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java index 7675e5d81f2..1275b217bb9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java @@ -1,365 +1,365 @@ -/* - * Copyright (c) 2010-2015 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ - -package com.evolveum.midpoint.web.page.admin.configuration; - -import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.task.api.Task; -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.input.DataLanguagePanel; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.component.AceEditor; -import com.evolveum.midpoint.web.page.admin.configuration.component.ImportOptionsPanel; -import com.evolveum.midpoint.web.security.MidPointApplication; -import com.evolveum.midpoint.web.security.WebApplicationConfiguration; -import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ImportOptionsType; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; -import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.Radio; -import org.apache.wicket.markup.html.form.RadioGroup; -import org.apache.wicket.markup.html.form.upload.FileUpload; -import org.apache.wicket.markup.html.form.upload.FileUploadField; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.util.file.File; -import org.jetbrains.annotations.NotNull; - -import java.io.FileInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.List; - -import static org.apache.commons.lang3.BooleanUtils.isTrue; - -/** - * @author lazyman - * @author mserbak - */ -@PageDescriptor(url = "/admin/config/import", action = { - @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CONFIGURATION_IMPORT_URL, label = "PageImportObject.auth.configImport.label", description = "PageImportObject.auth.configImport.description") }) -public class PageImportObject extends PageAdminConfiguration { - - private static final Trace LOGGER = TraceManager.getTrace(PageImportObject.class); - private static final String DOT_CLASS = PageImportObject.class.getName() + "."; - private static final String OPERATION_IMPORT_FILE = DOT_CLASS + "importFile"; - private static final String OPERATION_IMPORT_XML = DOT_CLASS + "importXml"; - - private static final String ID_MAIN_FORM = "mainForm"; - private static final String ID_BUTTON_BAR = "buttonBar"; - private static final String ID_IMPORT_OPTIONS = "importOptions"; - private static final String ID_IMPORT_RADIO_GROUP = "importRadioGroup"; - private static final String ID_FILE_RADIO = "fileRadio"; - private static final String ID_XML_RADIO = "xmlRadio"; - private static final String ID_BACK_BUTTON = "back"; - private static final String ID_IMPORT_FILE_BUTTON = "importFileButton"; - private static final String ID_IMPORT_XML_BUTTON = "importXmlButton"; - private static final String ID_INPUT = "input"; - private static final String ID_INPUT_ACE = "inputAce"; - private static final String ID_LANGUAGE_PANEL = "languagePanel"; - private static final String ID_ACE_EDITOR = "aceEditor"; - private static final String ID_INPUT_FILE_LABEL = "inputFileLabel"; - private static final String ID_INPUT_FILE = "inputFile"; - private static final String ID_FILE_INPUT = "fileInput"; - - private static final Integer INPUT_FILE = 1; - private static final Integer INPUT_XML = 2; - - private LoadableModel optionsModel; - private IModel fullProcessingModel; - private IModel xmlEditorModel; - - private String dataLanguage; - - public PageImportObject() { - optionsModel = new LoadableModel(false) { - - @Override - protected ImportOptionsType load() { - return MiscSchemaUtil.getDefaultImportOptions(); - } - }; - fullProcessingModel = Model.of(Boolean.TRUE); - xmlEditorModel = new Model<>(null); - - initLayout(); - } - - private void initLayout() { - Form mainForm = new com.evolveum.midpoint.web.component.form.Form(ID_MAIN_FORM); - mainForm.setMultiPart(true); - add(mainForm); - - ImportOptionsPanel importOptions = new ImportOptionsPanel(ID_IMPORT_OPTIONS, optionsModel, fullProcessingModel); - mainForm.add(importOptions); - - final WebMarkupContainer input = new WebMarkupContainer(ID_INPUT); - input.setOutputMarkupId(true); - mainForm.add(input); - - final WebMarkupContainer buttonBar = new WebMarkupContainer(ID_BUTTON_BAR); - buttonBar.setOutputMarkupId(true); - mainForm.add(buttonBar); - - final IModel groupModel = new Model<>(INPUT_FILE); - RadioGroup importRadioGroup = new RadioGroup(ID_IMPORT_RADIO_GROUP, groupModel); - importRadioGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() { - - @Override - protected void onUpdate(AjaxRequestTarget target) { - target.add(input); - target.add(buttonBar); - } - }); - mainForm.add(importRadioGroup); - - Radio fileRadio = new Radio(ID_FILE_RADIO, new Model(INPUT_FILE), importRadioGroup); - importRadioGroup.add(fileRadio); - - Radio xmlRadio = new Radio(ID_XML_RADIO, new Model(INPUT_XML), importRadioGroup); - importRadioGroup.add(xmlRadio); - - WebMarkupContainer inputAce = new WebMarkupContainer(ID_INPUT_ACE); - addVisibileForInputType(inputAce, INPUT_XML, groupModel); - input.add(inputAce); - - dataLanguage = determineDataLanguage(); - - DataLanguagePanel languagePanel = new DataLanguagePanel<>(ID_LANGUAGE_PANEL, dataLanguage, List.class, this) { - @Override - protected void onLanguageSwitched(AjaxRequestTarget target, int index, String updatedLanguage, String objectString) { - dataLanguage = updatedLanguage; - xmlEditorModel.setObject(objectString); - addOrReplaceEditor(inputAce); - target.add(mainForm); - } - - @Override - protected String getObjectStringRepresentation() { - return xmlEditorModel.getObject(); - } - }; - inputAce.add(languagePanel); - addOrReplaceEditor(inputAce); - - WebMarkupContainer inputFileLabel = new WebMarkupContainer(ID_INPUT_FILE_LABEL); - addVisibileForInputType(inputFileLabel, INPUT_FILE, groupModel); - input.add(inputFileLabel); - - WebMarkupContainer inputFile = new WebMarkupContainer(ID_INPUT_FILE); - addVisibileForInputType(inputFile, INPUT_FILE, groupModel); - input.add(inputFile); - - FileUploadField fileInput = new FileUploadField(ID_FILE_INPUT); - inputFile.add(fileInput); - - initButtons(buttonBar, groupModel); - } - - private void addOrReplaceEditor(WebMarkupContainer inputAce) { - AceEditor editor = new AceEditor(ID_ACE_EDITOR, xmlEditorModel); - editor.setOutputMarkupId(true); - editor.setModeForDataLanguage(dataLanguage); - editor.add(new AjaxFormComponentUpdatingBehavior("blur") { - @Override - protected void onUpdate(AjaxRequestTarget target) { - } - }); - inputAce.addOrReplace(editor); - } - - private void addVisibileForInputType(Component comp, final Integer type, - final IModel groupModel) { - comp.add(new VisibleEnableBehaviour() { - - @Override - public boolean isVisible() { - return type.equals(groupModel.getObject()); - } - - }); - } - - private void initButtons(WebMarkupContainer buttonBar, IModel inputType) { - AjaxButton backButton = new AjaxButton(ID_BACK_BUTTON, createStringResource("PageCertCampaign.button.back")) { - - @Override - public void onClick(AjaxRequestTarget target) { - redirectBack(); - } - }; - backButton.add(new VisibleEnableBehaviour() { - - @Override - public boolean isVisible() { - return canRedirectBack(); - } - }); - buttonBar.add(backButton); - - AjaxSubmitButton saveFileButton = new AjaxSubmitButton(ID_IMPORT_FILE_BUTTON, - createStringResource("PageImportObject.button.import")) { - - @Override - protected void onSubmit(AjaxRequestTarget target) { - savePerformed(false, OPERATION_IMPORT_FILE, target); - } - - @Override - protected void onError(AjaxRequestTarget target) { - target.add(getFeedbackPanel()); - } - }; - addVisibileForInputType(saveFileButton, INPUT_FILE, inputType); - buttonBar.add(saveFileButton); - - AjaxSubmitButton saveXmlButton = new AjaxSubmitButton(ID_IMPORT_XML_BUTTON, - createStringResource("PageImportObject.button.import")) { - - @Override - protected void onSubmit(AjaxRequestTarget target) { - savePerformed(true, OPERATION_IMPORT_XML, target); - } - - @Override - protected void onError(AjaxRequestTarget target) { - target.add(getFeedbackPanel()); - } - }; - addVisibileForInputType(saveXmlButton, INPUT_XML, inputType); - buttonBar.add(saveXmlButton); - } - - private FileUpload getUploadedFile() { - FileUploadField file = (FileUploadField) get( - createComponentPath(ID_MAIN_FORM, ID_INPUT, ID_INPUT_FILE, ID_FILE_INPUT)); - return file.getFileUpload(); - } - - private boolean validateInput(boolean raw) { - if (raw) { - return StringUtils.isNotEmpty(xmlEditorModel.getObject()); - } - return getUploadedFile() != null; - - } - - private static class InputDescription { - private InputStream inputStream; - private String dataLanguage; - InputDescription(InputStream inputStream, String dataLanguage) { - this.inputStream = inputStream; - this.dataLanguage = dataLanguage; - } - } - - @NotNull - private InputDescription getInputDescription(boolean editor) throws Exception { - if (editor) { - return new InputDescription( - IOUtils.toInputStream(xmlEditorModel.getObject(), StandardCharsets.UTF_8), - dataLanguage); - } - File newFile = null; - try { - // Create new file - MidPointApplication application = getMidpointApplication(); - WebApplicationConfiguration config = application.getWebApplicationConfiguration(); - File folder = new File(config.getImportFolder()); - if (!folder.exists() || !folder.isDirectory()) { - folder.mkdir(); - } - - FileUpload uploadedFile = getUploadedFile(); - newFile = new File(folder, uploadedFile.getClientFileName()); - // Check new file, delete if it already exists - if (newFile.exists()) { - newFile.delete(); - } - // Save file - - newFile.createNewFile(); - - FileUtils.copyInputStreamToFile(uploadedFile.getInputStream(), newFile); - - String language = getPrismContext().detectLanguage(newFile); - return new InputDescription(new FileInputStream(newFile), language); - } finally { - if (newFile != null) { - FileUtils.deleteQuietly(newFile); - } - } - } - - private void clearOldFeedback(){ - getSession().getFeedbackMessages().clear(); - getFeedbackMessages().clear(); - } - - private void savePerformed(boolean raw, String operationName, AjaxRequestTarget target) { - clearOldFeedback(); - - OperationResult result = new OperationResult(operationName); - - if (!validateInput(raw)) { - error(getString("pageImportObject.message.nullFile")); - target.add(getFeedbackPanel()); - - return; - } - InputStream stream = null; - - try { - Task task = createSimpleTask(operationName); - InputDescription inputDescription = getInputDescription(raw); - stream = inputDescription.inputStream; - ImportOptionsType options = optionsModel.getObject(); - if (isTrue(fullProcessingModel.getObject())) { - options.setModelExecutionOptions(new ModelExecuteOptionsType().raw(false)); - } else { - options.setModelExecutionOptions(null); - } - getModelService().importObjectsFromStream(stream, inputDescription.dataLanguage, options, task, result); - - result.recomputeStatus(); - } catch (Exception ex) { - result.recordFatalError(getString("PageImportObject.message.savePerformed.fatalError"), ex); - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import file", ex); - } finally { - if (stream != null) { - IOUtils.closeQuietly(stream); - } - - } - showResult(result); - if (result.isFatalError()){ - target.add(getFeedbackPanel()); - } else { - target.add(PageImportObject.this); - } - } - - -} +/* + * Copyright (c) 2010-2015 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.web.page.admin.configuration; + +import com.evolveum.midpoint.gui.api.model.LoadableModel; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +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.input.DataLanguagePanel; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.component.AceEditor; +import com.evolveum.midpoint.web.page.admin.configuration.component.ImportOptionsPanel; +import com.evolveum.midpoint.web.security.MidPointApplication; +import com.evolveum.midpoint.web.security.WebApplicationConfiguration; +import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ImportOptionsType; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; +import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.Radio; +import org.apache.wicket.markup.html.form.RadioGroup; +import org.apache.wicket.markup.html.form.upload.FileUpload; +import org.apache.wicket.markup.html.form.upload.FileUploadField; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.util.file.File; +import org.jetbrains.annotations.NotNull; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; + +import static org.apache.commons.lang3.BooleanUtils.isTrue; + +/** + * @author lazyman + * @author mserbak + */ +@PageDescriptor(url = "/admin/config/import", action = { + @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CONFIGURATION_IMPORT_URL, label = "PageImportObject.auth.configImport.label", description = "PageImportObject.auth.configImport.description") }) +public class PageImportObject extends PageAdminConfiguration { + + private static final Trace LOGGER = TraceManager.getTrace(PageImportObject.class); + private static final String DOT_CLASS = PageImportObject.class.getName() + "."; + private static final String OPERATION_IMPORT_FILE = DOT_CLASS + "importFile"; + private static final String OPERATION_IMPORT_XML = DOT_CLASS + "importXml"; + + private static final String ID_MAIN_FORM = "mainForm"; + private static final String ID_BUTTON_BAR = "buttonBar"; + private static final String ID_IMPORT_OPTIONS = "importOptions"; + private static final String ID_IMPORT_RADIO_GROUP = "importRadioGroup"; + private static final String ID_FILE_RADIO = "fileRadio"; + private static final String ID_XML_RADIO = "xmlRadio"; + private static final String ID_BACK_BUTTON = "back"; + private static final String ID_IMPORT_FILE_BUTTON = "importFileButton"; + private static final String ID_IMPORT_XML_BUTTON = "importXmlButton"; + private static final String ID_INPUT = "input"; + private static final String ID_INPUT_ACE = "inputAce"; + private static final String ID_LANGUAGE_PANEL = "languagePanel"; + private static final String ID_ACE_EDITOR = "aceEditor"; + private static final String ID_INPUT_FILE_LABEL = "inputFileLabel"; + private static final String ID_INPUT_FILE = "inputFile"; + private static final String ID_FILE_INPUT = "fileInput"; + + private static final Integer INPUT_FILE = 1; + private static final Integer INPUT_XML = 2; + + private LoadableModel optionsModel; + private IModel fullProcessingModel; + private IModel xmlEditorModel; + + private String dataLanguage; + + public PageImportObject() { + optionsModel = new LoadableModel(false) { + + @Override + protected ImportOptionsType load() { + return MiscSchemaUtil.getDefaultImportOptions(); + } + }; + fullProcessingModel = Model.of(Boolean.TRUE); + xmlEditorModel = new Model<>(null); + + initLayout(); + } + + private void initLayout() { + Form mainForm = new com.evolveum.midpoint.web.component.form.Form(ID_MAIN_FORM); + mainForm.setMultiPart(true); + add(mainForm); + + ImportOptionsPanel importOptions = new ImportOptionsPanel(ID_IMPORT_OPTIONS, optionsModel, fullProcessingModel); + mainForm.add(importOptions); + + final WebMarkupContainer input = new WebMarkupContainer(ID_INPUT); + input.setOutputMarkupId(true); + mainForm.add(input); + + final WebMarkupContainer buttonBar = new WebMarkupContainer(ID_BUTTON_BAR); + buttonBar.setOutputMarkupId(true); + mainForm.add(buttonBar); + + final IModel groupModel = new Model<>(INPUT_FILE); + RadioGroup importRadioGroup = new RadioGroup(ID_IMPORT_RADIO_GROUP, groupModel); + importRadioGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() { + + @Override + protected void onUpdate(AjaxRequestTarget target) { + target.add(input); + target.add(buttonBar); + } + }); + mainForm.add(importRadioGroup); + + Radio fileRadio = new Radio(ID_FILE_RADIO, new Model(INPUT_FILE), importRadioGroup); + importRadioGroup.add(fileRadio); + + Radio xmlRadio = new Radio(ID_XML_RADIO, new Model(INPUT_XML), importRadioGroup); + importRadioGroup.add(xmlRadio); + + WebMarkupContainer inputAce = new WebMarkupContainer(ID_INPUT_ACE); + addVisibileForInputType(inputAce, INPUT_XML, groupModel); + input.add(inputAce); + + dataLanguage = determineDataLanguage(); + + DataLanguagePanel languagePanel = new DataLanguagePanel(ID_LANGUAGE_PANEL, dataLanguage, List.class, this) { + @Override + protected void onLanguageSwitched(AjaxRequestTarget target, int index, String updatedLanguage, String objectString) { + dataLanguage = updatedLanguage; + xmlEditorModel.setObject(objectString); + addOrReplaceEditor(inputAce); + target.add(mainForm); + } + + @Override + protected String getObjectStringRepresentation() { + return xmlEditorModel.getObject(); + } + }; + inputAce.add(languagePanel); + addOrReplaceEditor(inputAce); + + WebMarkupContainer inputFileLabel = new WebMarkupContainer(ID_INPUT_FILE_LABEL); + addVisibileForInputType(inputFileLabel, INPUT_FILE, groupModel); + input.add(inputFileLabel); + + WebMarkupContainer inputFile = new WebMarkupContainer(ID_INPUT_FILE); + addVisibileForInputType(inputFile, INPUT_FILE, groupModel); + input.add(inputFile); + + FileUploadField fileInput = new FileUploadField(ID_FILE_INPUT); + inputFile.add(fileInput); + + initButtons(buttonBar, groupModel); + } + + private void addOrReplaceEditor(WebMarkupContainer inputAce) { + AceEditor editor = new AceEditor(ID_ACE_EDITOR, xmlEditorModel); + editor.setOutputMarkupId(true); + editor.setModeForDataLanguage(dataLanguage); + editor.add(new AjaxFormComponentUpdatingBehavior("blur") { + @Override + protected void onUpdate(AjaxRequestTarget target) { + } + }); + inputAce.addOrReplace(editor); + } + + private void addVisibileForInputType(Component comp, final Integer type, + final IModel groupModel) { + comp.add(new VisibleEnableBehaviour() { + + @Override + public boolean isVisible() { + return type.equals(groupModel.getObject()); + } + + }); + } + + private void initButtons(WebMarkupContainer buttonBar, IModel inputType) { + AjaxButton backButton = new AjaxButton(ID_BACK_BUTTON, createStringResource("PageCertCampaign.button.back")) { + + @Override + public void onClick(AjaxRequestTarget target) { + redirectBack(); + } + }; + backButton.add(new VisibleEnableBehaviour() { + + @Override + public boolean isVisible() { + return canRedirectBack(); + } + }); + buttonBar.add(backButton); + + AjaxSubmitButton saveFileButton = new AjaxSubmitButton(ID_IMPORT_FILE_BUTTON, + createStringResource("PageImportObject.button.import")) { + + @Override + protected void onSubmit(AjaxRequestTarget target) { + savePerformed(false, OPERATION_IMPORT_FILE, target); + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(getFeedbackPanel()); + } + }; + addVisibileForInputType(saveFileButton, INPUT_FILE, inputType); + buttonBar.add(saveFileButton); + + AjaxSubmitButton saveXmlButton = new AjaxSubmitButton(ID_IMPORT_XML_BUTTON, + createStringResource("PageImportObject.button.import")) { + + @Override + protected void onSubmit(AjaxRequestTarget target) { + savePerformed(true, OPERATION_IMPORT_XML, target); + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(getFeedbackPanel()); + } + }; + addVisibileForInputType(saveXmlButton, INPUT_XML, inputType); + buttonBar.add(saveXmlButton); + } + + private FileUpload getUploadedFile() { + FileUploadField file = (FileUploadField) get( + createComponentPath(ID_MAIN_FORM, ID_INPUT, ID_INPUT_FILE, ID_FILE_INPUT)); + return file.getFileUpload(); + } + + private boolean validateInput(boolean raw) { + if (raw) { + return StringUtils.isNotEmpty(xmlEditorModel.getObject()); + } + return getUploadedFile() != null; + + } + + private static class InputDescription { + private InputStream inputStream; + private String dataLanguage; + InputDescription(InputStream inputStream, String dataLanguage) { + this.inputStream = inputStream; + this.dataLanguage = dataLanguage; + } + } + + @NotNull + private InputDescription getInputDescription(boolean editor) throws Exception { + if (editor) { + return new InputDescription( + IOUtils.toInputStream(xmlEditorModel.getObject(), StandardCharsets.UTF_8), + dataLanguage); + } + File newFile = null; + try { + // Create new file + MidPointApplication application = getMidpointApplication(); + WebApplicationConfiguration config = application.getWebApplicationConfiguration(); + File folder = new File(config.getImportFolder()); + if (!folder.exists() || !folder.isDirectory()) { + folder.mkdir(); + } + + FileUpload uploadedFile = getUploadedFile(); + newFile = new File(folder, uploadedFile.getClientFileName()); + // Check new file, delete if it already exists + if (newFile.exists()) { + newFile.delete(); + } + // Save file + + newFile.createNewFile(); + + FileUtils.copyInputStreamToFile(uploadedFile.getInputStream(), newFile); + + String language = getPrismContext().detectLanguage(newFile); + return new InputDescription(new FileInputStream(newFile), language); + } finally { + if (newFile != null) { + FileUtils.deleteQuietly(newFile); + } + } + } + + private void clearOldFeedback(){ + getSession().getFeedbackMessages().clear(); + getFeedbackMessages().clear(); + } + + private void savePerformed(boolean raw, String operationName, AjaxRequestTarget target) { + clearOldFeedback(); + + OperationResult result = new OperationResult(operationName); + + if (!validateInput(raw)) { + error(getString("pageImportObject.message.nullFile")); + target.add(getFeedbackPanel()); + + return; + } + InputStream stream = null; + + try { + Task task = createSimpleTask(operationName); + InputDescription inputDescription = getInputDescription(raw); + stream = inputDescription.inputStream; + ImportOptionsType options = optionsModel.getObject(); + if (isTrue(fullProcessingModel.getObject())) { + options.setModelExecutionOptions(new ModelExecuteOptionsType().raw(false)); + } else { + options.setModelExecutionOptions(null); + } + getModelService().importObjectsFromStream(stream, inputDescription.dataLanguage, options, task, result); + + result.recomputeStatus(); + } catch (Exception ex) { + result.recordFatalError(getString("PageImportObject.message.savePerformed.fatalError"), ex); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import file", ex); + } finally { + if (stream != null) { + IOUtils.closeQuietly(stream); + } + + } + showResult(result); + if (result.isFatalError()){ + target.add(getFeedbackPanel()); + } else { + target.add(PageImportObject.this); + } + } + + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceSummaryPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceSummaryPanel.java index edcf7b298d5..628f319e441 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceSummaryPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceSummaryPanel.java @@ -1,85 +1,85 @@ -/* - * Copyright (c) 2016-2017 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.web.page.admin.resources; - -import java.util.ArrayList; -import java.util.List; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.AvailabilityStatusType; -import org.apache.wicket.model.IModel; - -import com.evolveum.midpoint.gui.api.GuiStyleConstants; -import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; -import com.evolveum.midpoint.schema.util.ResourceTypeUtil; -import com.evolveum.midpoint.web.component.ObjectSummaryPanel; -import com.evolveum.midpoint.web.component.util.SummaryTag; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; - -public class ResourceSummaryPanel extends ObjectSummaryPanel { - private static final long serialVersionUID = 1L; - - public ResourceSummaryPanel(String id, IModel model, ModelServiceLocator serviceLocator) { - super(id, ResourceType.class, model, serviceLocator); - } - - @Override - protected List> getSummaryTagComponentList(){ - AvailabilityStatusType availability = ResourceTypeUtil.getLastAvailabilityStatus(getModelObject()); - - List> summaryTagList = new ArrayList<>(); - - SummaryTag summaryTag = new SummaryTag<>(ID_SUMMARY_TAG, getModel()) { - private static final long serialVersionUID = 1L; - - @Override - protected void initialize(ResourceType object) { - if (availability== null) { - setIconCssClass(GuiStyleConstants.CLASS_ICON_RESOURCE_UNKNOWN); - setLabel(getString("ResourceSummaryPanel.UNKNOWN")); - return; - } - setLabel(getString(ResourceSummaryPanel.this.getString(availability))); - switch(availability) { - case UP: - setIconCssClass(GuiStyleConstants.CLASS_ICON_ACTIVATION_ACTIVE); - break; - case DOWN: - setIconCssClass(GuiStyleConstants.CLASS_ICON_ACTIVATION_INACTIVE); - break; - case BROKEN: - setIconCssClass(GuiStyleConstants.CLASS_ICON_RESOURCE_BROKEN); - break; - - - } - } - }; - summaryTagList.add(summaryTag); - return summaryTagList; - } - - - @Override - protected String getIconCssClass() { - return GuiStyleConstants.CLASS_OBJECT_RESOURCE_ICON; - } - - @Override - protected String getIconBoxAdditionalCssClass() { - return "summary-panel-resource"; - } - - @Override - protected String getBoxAdditionalCssClass() { - return "summary-panel-resource"; - } - - @Override - protected boolean isIdentifierVisible() { - return false; - } -} +/* + * Copyright (c) 2016-2017 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.page.admin.resources; + +import java.util.ArrayList; +import java.util.List; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.AvailabilityStatusType; +import org.apache.wicket.model.IModel; + +import com.evolveum.midpoint.gui.api.GuiStyleConstants; +import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; +import com.evolveum.midpoint.schema.util.ResourceTypeUtil; +import com.evolveum.midpoint.web.component.ObjectSummaryPanel; +import com.evolveum.midpoint.web.component.util.SummaryTag; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; + +public class ResourceSummaryPanel extends ObjectSummaryPanel { + private static final long serialVersionUID = 1L; + + public ResourceSummaryPanel(String id, IModel model, ModelServiceLocator serviceLocator) { + super(id, ResourceType.class, model, serviceLocator); + } + + @Override + protected List> getSummaryTagComponentList(){ + AvailabilityStatusType availability = ResourceTypeUtil.getLastAvailabilityStatus(getModelObject()); + + List> summaryTagList = new ArrayList<>(); + + SummaryTag summaryTag = new SummaryTag(ID_SUMMARY_TAG, getModel()) { + private static final long serialVersionUID = 1L; + + @Override + protected void initialize(ResourceType object) { + if (availability== null) { + setIconCssClass(GuiStyleConstants.CLASS_ICON_RESOURCE_UNKNOWN); + setLabel(getString("ResourceSummaryPanel.UNKNOWN")); + return; + } + setLabel(getString(ResourceSummaryPanel.this.getString(availability))); + switch(availability) { + case UP: + setIconCssClass(GuiStyleConstants.CLASS_ICON_ACTIVATION_ACTIVE); + break; + case DOWN: + setIconCssClass(GuiStyleConstants.CLASS_ICON_ACTIVATION_INACTIVE); + break; + case BROKEN: + setIconCssClass(GuiStyleConstants.CLASS_ICON_RESOURCE_BROKEN); + break; + + + } + } + }; + summaryTagList.add(summaryTag); + return summaryTagList; + } + + + @Override + protected String getIconCssClass() { + return GuiStyleConstants.CLASS_OBJECT_RESOURCE_ICON; + } + + @Override + protected String getIconBoxAdditionalCssClass() { + return "summary-panel-resource"; + } + + @Override + protected String getBoxAdditionalCssClass() { + return "summary-panel-resource"; + } + + @Override + protected boolean isIdentifierVisible() { + return false; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index a9c245abca2..6b0c27691c6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -1,454 +1,454 @@ -/* - * Copyright (c) 2010-2017 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.web.page.admin.users; - -import com.evolveum.midpoint.gui.api.ComponentConstants; -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.context.ModelContext; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; -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.application.Url; -import com.evolveum.midpoint.web.component.FocusSummaryPanel; -import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; -import com.evolveum.midpoint.web.component.assignment.AssignmentTablePanel; -import com.evolveum.midpoint.web.component.assignment.DelegationEditorPanel; -import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; -import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel; -import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel; -import com.evolveum.midpoint.web.component.objectdetails.FocusPersonasTabPanel; -import com.evolveum.midpoint.web.component.objectdetails.UserDelegationsTabPanel; -import com.evolveum.midpoint.web.page.admin.PageAdminFocus; -import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; -import com.evolveum.midpoint.web.page.admin.users.component.UserSummaryPanel; -import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; -import com.evolveum.midpoint.web.util.OnePageParameterEncoder; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import org.apache.commons.lang3.StringUtils; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.extensions.markup.html.tabs.ITab; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.list.ListItem; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.request.mapper.parameter.PageParameters; - -import java.util.*; - -import static org.apache.commons.collections4.CollectionUtils.addIgnoreNull; - -/** - * @author lazyman - * @author semancik - */ - -@PageDescriptor( - urls = { - @Url(mountUrl = "/admin/user", matchUrlForSecurity = "/admin/user") - }, - encoder = OnePageParameterEncoder.class, - action = { - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_USERS_ALL_URL, - label = "PageAdminUsers.auth.usersAll.label", - description = "PageAdminUsers.auth.usersAll.description"), - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_USER_URL, - label = "PageUser.auth.user.label", - description = "PageUser.auth.user.description") - }) -public class PageUser extends PageAdminFocus { - private static final long serialVersionUID = 1L; - - private static final String DOT_CLASS = PageUser.class.getName() + "."; - private static final String OPERATION_LOAD_DELEGATED_BY_ME_ASSIGNMENTS = DOT_CLASS + "loadDelegatedByMeAssignments"; - private static final String OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST = DOT_CLASS + "createAssignmentPreviewDtoList"; - - private LoadableModel> delegationsModel; - private LoadableModel> privilegesListModel; - private UserDelegationsTabPanel userDelegationsTabPanel = null; - - private static final Trace LOGGER = TraceManager.getTrace(PageUser.class); - - public PageUser() { - super(); - } - - public PageUser(PageParameters parameters) { - super(parameters); - } - - public PageUser(final PrismObject userToEdit) { - super(userToEdit); - } - - public PageUser(final PrismObject userToEdit, boolean isNewObject) { - super(userToEdit, isNewObject); - } - - @Override - protected void initializeModel(final PrismObject objectToEdit, boolean isNewObject, boolean isReadonly) { - super.initializeModel(objectToEdit, isNewObject, isReadonly); - - delegationsModel = new LoadableModel<>(false) { - private static final long serialVersionUID = 1L; - - @Override - protected List load() { - if (StringUtils.isNotEmpty(getObjectWrapper().getOid())) { - return loadDelegatedByMeAssignments(); - } else { - return new ArrayList<>(); - } - } - }; - privilegesListModel = new LoadableModel<>(false) { - private static final long serialVersionUID = 1L; - - @Override - protected List load() { - return getUserPrivilegesList(); - } - }; - } - - @Override - protected FocusSummaryPanel createSummaryPanel() { - return new UserSummaryPanel(ID_SUMMARY_PANEL, isEditingFocus() ? - Model.of(getObjectModel().getObject().getObject().asObjectable()) : Model.of(), this); - } - - protected void cancelPerformed(AjaxRequestTarget target) { - redirectBack(); - } - - @Override - protected UserType createNewObject() { - return new UserType(); - } - - @Override - protected Class getRestartResponsePage() { - return PageUsers.class; - } - - @Override - public Class getCompileTimeClass() { - return UserType.class; - } - - @Override - protected AbstractObjectMainPanel createMainPanel(String id) { - return new FocusMainPanel<>(id, getObjectModel(), getProjectionModel(), this) { - private static final long serialVersionUID = 1L; - - @Override - protected void addSpecificTabs(final PageAdminObjectDetails parentPage, List tabs) { - tabs.add( - new CountablePanelTab(parentPage.createStringResource("pageAdminFocus.personas"), - getTabVisibility(ComponentConstants.UI_FOCUS_TAB_PERSONAS_URL, false, parentPage)) { - - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new FocusPersonasTabPanel<>(panelId, getMainForm(), getObjectModel()); - } - - @Override - public String getCount() { - if (getObjectWrapper() == null || getObjectWrapper().getObject() == null) { - return Integer.toString(0); - } - List personasRefList = getObjectWrapper().getObject().asObjectable().getPersonaRef(); - int count = 0; - for (ObjectReferenceType object : personasRefList) { - if (object != null && !object.asReferenceValue().isEmpty()) { - count++; - } - } - return Integer.toString(count); - } - - }); - - tabs.add(new CountablePanelTab(parentPage.createStringResource("FocusType.delegations"), - getTabVisibility(ComponentConstants.UI_FOCUS_TAB_DELEGATIONS_URL, false, parentPage)) { - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - userDelegationsTabPanel = new UserDelegationsTabPanel<>(panelId, getMainForm(), getObjectModel(), - delegationsModel, privilegesListModel); - return userDelegationsTabPanel; - } - - @Override - public String getCount() { - return Integer.toString(delegationsModel.getObject() == null ? 0 : delegationsModel.getObject().size()); - } - }); - - tabs.add(new CountablePanelTab(parentPage.createStringResource("FocusType.delegatedToMe"), - getTabVisibility(ComponentConstants.UI_FOCUS_TAB_DELEGATED_TO_ME_URL, true, parentPage)){ - - private static final long serialVersionUID = 1L; - - @Override - public WebMarkupContainer createPanel(String panelId) { - return new AssignmentTablePanel(panelId, - getDelegatedToMeModel()) { - private static final long serialVersionUID = 1L; - - @Override - public void populateAssignmentDetailsPanel(ListItem item) { - DelegationEditorPanel editor = new DelegationEditorPanel(ID_ROW, item.getModel(), true, - privilegesListModel, PageUser.this); - item.add(editor); - } - - @Override - public String getExcludeOid() { - return getObject().getOid(); - } - - @Override - public IModel getLabel() { - return parentPage.createStringResource("FocusType.delegatedToMe"); - } - - @Override - protected List createAssignmentMenu() { - return new ArrayList<>(); - } - - }; - } - - @Override - public String getCount() { - return Integer.toString(getDelegatedToMeModel().getObject() == null ? - 0 : getDelegatedToMeModel().getObject().size()); - } - }); - } - - @Override - protected boolean getOptionsPanelVisibility() { - if (isSelfProfile()){ - return false; - } else { - return super.getOptionsPanelVisibility(); - } - } - - @Override - protected boolean areSavePreviewButtonsEnabled(){ - return super.areSavePreviewButtonsEnabled() || - (userDelegationsTabPanel != null ? userDelegationsTabPanel.isDelegationsModelChanged() : false); - } - - @Override - protected boolean isFocusHistoryPage(){ - return PageUser.this.isFocusHistoryPage(); - } - - @Override - protected void viewObjectHistoricalDataPerformed(AjaxRequestTarget target, PrismObject object, String date){ - PageUser.this.navigateToNext(new PageUserHistory(object, date)); - } - }; - } - - protected boolean isSelfProfile(){ - return false; - } - - private List loadDelegatedByMeAssignments() { - OperationResult result = new OperationResult(OPERATION_LOAD_DELEGATED_BY_ME_ASSIGNMENTS); - List list = new ArrayList<>(); - try{ - - Task task = createSimpleTask(OPERATION_LOAD_DELEGATED_BY_ME_ASSIGNMENTS); - - PrismReferenceValue referenceValue = getPrismContext().itemFactory().createReferenceValue(getObjectWrapper().getOid(), - UserType.COMPLEX_TYPE); - referenceValue.setRelation(WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION)); - - ObjectFilter refFilter = getPrismContext().queryFor(UserType.class) - .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(referenceValue) - .buildFilter(); - - ObjectQuery query = getPrismContext().queryFactory().createQuery(refFilter); - - List> usersList = getModelService().searchObjects(UserType.class, query, null, task, result); - List processedUsersOid = new ArrayList<>(); - if (usersList != null && usersList.size() > 0){ - for (PrismObject user : usersList) { - if (processedUsersOid.contains(user.getOid())){ - continue; - } - List assignments = user.asObjectable().getAssignment(); - for (AssignmentType assignment : assignments) { - if (assignment.getTargetRef() != null && - StringUtils.isNotEmpty(assignment.getTargetRef().getOid()) && - assignment.getTargetRef().getOid().equals(getObjectWrapper().getOid())) { - AssignmentEditorDto dto = new AssignmentEditorDto(UserDtoStatus.MODIFY, assignment, this, - user.asObjectable()); - dto.setEditable(false); - list.add(dto); - } - } - processedUsersOid.add(user.getOid()); - } - } - - } catch (Exception ex){ - result.recomputeStatus(); - showResult(result); - } - Collections.sort(list); - return list; - } - - private List getUserPrivilegesList(){ - List list = new ArrayList<>(); - OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST); - Task task = createSimpleTask(OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST); - for (AssignmentType assignment : getObjectWrapper().getObject().asObjectable().getAssignment()) { - addIgnoreNull(list, createDelegableAssignmentsPreviewDto(assignment, task, result)); - } - return list; - } - - @Override - protected boolean processDeputyAssignments(boolean previewOnly) { - boolean isAnythingChanged = false; - for (AssignmentEditorDto dto : delegationsModel.getObject()) { - if (!UserDtoStatus.MODIFY.equals(dto.getStatus())) { - if (!previewOnly) { - UserType user = dto.getDelegationOwner(); - saveDelegationToUser(user.asPrismObject(), dto); - } - isAnythingChanged = true; - } - } - return isAnythingChanged; - } - - /** - * for now used only for delegation changes - * @param modelContextMap - */ - @Override - protected void processAdditionalFocalObjectsForPreview(Map, ModelContext> modelContextMap){ - for (AssignmentEditorDto dto : delegationsModel.getObject()) { - if (!UserDtoStatus.MODIFY.equals(dto.getStatus())) { - UserType user = dto.getDelegationOwner(); - - OperationResult result = new OperationResult(OPERATION_PREVIEW_CHANGES); - Task task = createSimpleTask(OPERATION_PREVIEW_CHANGES); - try { - - Collection> deltas = prepareDelegationDelta(user.asPrismObject(), dto); - - ModelContext modelContext = getModelInteractionService().previewChanges(deltas, getOptions(true), task, result); - modelContextMap.put(user.asPrismObject(), modelContext); - } catch (Exception e) { - LoggingUtils.logUnexpectedException(LOGGER, "Could not save delegation ", e); - error("Could not save delegation. Reason: " + e); - } finally { - result.recomputeStatus(); - } - } - } - } - - - private void saveDelegationToUser(PrismObject user, AssignmentEditorDto assignmentDto) { - OperationResult result = new OperationResult(OPERATION_SAVE); - try { - getPrismContext().adopt(user); - Collection> deltas = prepareDelegationDelta(user, assignmentDto); - getModelService().executeChanges(deltas, getOptions(false), createSimpleTask(OPERATION_SAVE), result); - - result.recordSuccess(); - } catch (Exception e) { - LoggingUtils.logUnexpectedException(LOGGER, "Could not save assignments ", e); - error("Could not save assignments. Reason: " + e); - } finally { - result.recomputeStatus(); - } - - showResult(result); - } - - private Collection> prepareDelegationDelta(PrismObject user, AssignmentEditorDto dto) - throws SchemaException { - Collection> deltas = new ArrayList<>(); - ObjectDelta delta = user.createModifyDelta(); - List userAssignmentsDtos = new ArrayList<>(); - userAssignmentsDtos.add(dto); - - deltas.add(delta); - PrismContainerDefinition def = user.getDefinition().findContainerDefinition(UserType.F_ASSIGNMENT); - handleAssignmentDeltas(delta, userAssignmentsDtos, def, true); - return deltas; - } - - public boolean isLoggedInUserPage(){ - return getObjectWrapper() != null && getObjectWrapper().getObject() != null && - StringUtils.isNotEmpty(getObjectWrapper().getObject().asObjectable().getOid()) && - getObjectWrapper().getObject().asObjectable().getOid().equals(WebModelServiceUtils.getLoggedInUserOid()); - } - - protected int countConsents() { - int consentCounter = 0; - PrismObject focus = getObjectModel().getObject().getObject(); - List assignments = focus.asObjectable().getAssignment(); - for (AssignmentType assignment : assignments) { - if (isConsentAssignment(assignment)) { - consentCounter++; - } - } - return consentCounter; - } - - private boolean isConsentAssignment(AssignmentType assignment) { - return assignment.getTargetRef() != null && QNameUtil.match(assignment.getTargetRef().getRelation(), SchemaConstants.ORG_CONSENT); - } - - protected List getConsentsList(List assignments, UserDtoStatus status){ - List list = new ArrayList<>(); - for (AssignmentType assignment : assignments) { - if (isConsentAssignment(assignment)) { - //TODO set status - list.add(assignment); - } - } - return list; - } - -} +/* + * Copyright (c) 2010-2017 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.page.admin.users; + +import com.evolveum.midpoint.gui.api.ComponentConstants; +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.context.ModelContext; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +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.application.Url; +import com.evolveum.midpoint.web.component.FocusSummaryPanel; +import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; +import com.evolveum.midpoint.web.component.assignment.AssignmentTablePanel; +import com.evolveum.midpoint.web.component.assignment.DelegationEditorPanel; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel; +import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel; +import com.evolveum.midpoint.web.component.objectdetails.FocusPersonasTabPanel; +import com.evolveum.midpoint.web.component.objectdetails.UserDelegationsTabPanel; +import com.evolveum.midpoint.web.page.admin.PageAdminFocus; +import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; +import com.evolveum.midpoint.web.page.admin.users.component.UserSummaryPanel; +import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.extensions.markup.html.tabs.ITab; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +import java.util.*; + +import static org.apache.commons.collections4.CollectionUtils.addIgnoreNull; + +/** + * @author lazyman + * @author semancik + */ + +@PageDescriptor( + urls = { + @Url(mountUrl = "/admin/user", matchUrlForSecurity = "/admin/user") + }, + encoder = OnePageParameterEncoder.class, + action = { + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_USERS_ALL_URL, + label = "PageAdminUsers.auth.usersAll.label", + description = "PageAdminUsers.auth.usersAll.description"), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_USER_URL, + label = "PageUser.auth.user.label", + description = "PageUser.auth.user.description") + }) +public class PageUser extends PageAdminFocus { + private static final long serialVersionUID = 1L; + + private static final String DOT_CLASS = PageUser.class.getName() + "."; + private static final String OPERATION_LOAD_DELEGATED_BY_ME_ASSIGNMENTS = DOT_CLASS + "loadDelegatedByMeAssignments"; + private static final String OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST = DOT_CLASS + "createAssignmentPreviewDtoList"; + + private LoadableModel> delegationsModel; + private LoadableModel> privilegesListModel; + private UserDelegationsTabPanel userDelegationsTabPanel = null; + + private static final Trace LOGGER = TraceManager.getTrace(PageUser.class); + + public PageUser() { + super(); + } + + public PageUser(PageParameters parameters) { + super(parameters); + } + + public PageUser(final PrismObject userToEdit) { + super(userToEdit); + } + + public PageUser(final PrismObject userToEdit, boolean isNewObject) { + super(userToEdit, isNewObject); + } + + @Override + protected void initializeModel(final PrismObject objectToEdit, boolean isNewObject, boolean isReadonly) { + super.initializeModel(objectToEdit, isNewObject, isReadonly); + + delegationsModel = new LoadableModel>(false) { + private static final long serialVersionUID = 1L; + + @Override + protected List load() { + if (StringUtils.isNotEmpty(getObjectWrapper().getOid())) { + return loadDelegatedByMeAssignments(); + } else { + return new ArrayList<>(); + } + } + }; + privilegesListModel = new LoadableModel>(false) { + private static final long serialVersionUID = 1L; + + @Override + protected List load() { + return getUserPrivilegesList(); + } + }; + } + + @Override + protected FocusSummaryPanel createSummaryPanel() { + return new UserSummaryPanel(ID_SUMMARY_PANEL, isEditingFocus() ? + Model.of(getObjectModel().getObject().getObject().asObjectable()) : Model.of(), this); + } + + protected void cancelPerformed(AjaxRequestTarget target) { + redirectBack(); + } + + @Override + protected UserType createNewObject() { + return new UserType(); + } + + @Override + protected Class getRestartResponsePage() { + return PageUsers.class; + } + + @Override + public Class getCompileTimeClass() { + return UserType.class; + } + + @Override + protected AbstractObjectMainPanel createMainPanel(String id) { + return new FocusMainPanel(id, getObjectModel(), getProjectionModel(), this) { + private static final long serialVersionUID = 1L; + + @Override + protected void addSpecificTabs(final PageAdminObjectDetails parentPage, List tabs) { + tabs.add( + new CountablePanelTab(parentPage.createStringResource("pageAdminFocus.personas"), + getTabVisibility(ComponentConstants.UI_FOCUS_TAB_PERSONAS_URL, false, parentPage)) { + + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new FocusPersonasTabPanel<>(panelId, getMainForm(), getObjectModel()); + } + + @Override + public String getCount() { + if (getObjectWrapper() == null || getObjectWrapper().getObject() == null) { + return Integer.toString(0); + } + List personasRefList = getObjectWrapper().getObject().asObjectable().getPersonaRef(); + int count = 0; + for (ObjectReferenceType object : personasRefList) { + if (object != null && !object.asReferenceValue().isEmpty()) { + count++; + } + } + return Integer.toString(count); + } + + }); + + tabs.add(new CountablePanelTab(parentPage.createStringResource("FocusType.delegations"), + getTabVisibility(ComponentConstants.UI_FOCUS_TAB_DELEGATIONS_URL, false, parentPage)) { + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + userDelegationsTabPanel = new UserDelegationsTabPanel<>(panelId, getMainForm(), getObjectModel(), + delegationsModel, privilegesListModel); + return userDelegationsTabPanel; + } + + @Override + public String getCount() { + return Integer.toString(delegationsModel.getObject() == null ? 0 : delegationsModel.getObject().size()); + } + }); + + tabs.add(new CountablePanelTab(parentPage.createStringResource("FocusType.delegatedToMe"), + getTabVisibility(ComponentConstants.UI_FOCUS_TAB_DELEGATED_TO_ME_URL, true, parentPage)){ + + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return new AssignmentTablePanel(panelId, + getDelegatedToMeModel()) { + private static final long serialVersionUID = 1L; + + @Override + public void populateAssignmentDetailsPanel(ListItem item) { + DelegationEditorPanel editor = new DelegationEditorPanel(ID_ROW, item.getModel(), true, + privilegesListModel, PageUser.this); + item.add(editor); + } + + @Override + public String getExcludeOid() { + return getObject().getOid(); + } + + @Override + public IModel getLabel() { + return parentPage.createStringResource("FocusType.delegatedToMe"); + } + + @Override + protected List createAssignmentMenu() { + return new ArrayList<>(); + } + + }; + } + + @Override + public String getCount() { + return Integer.toString(getDelegatedToMeModel().getObject() == null ? + 0 : getDelegatedToMeModel().getObject().size()); + } + }); + } + + @Override + protected boolean getOptionsPanelVisibility() { + if (isSelfProfile()){ + return false; + } else { + return super.getOptionsPanelVisibility(); + } + } + + @Override + protected boolean areSavePreviewButtonsEnabled(){ + return super.areSavePreviewButtonsEnabled() || + (userDelegationsTabPanel != null ? userDelegationsTabPanel.isDelegationsModelChanged() : false); + } + + @Override + protected boolean isFocusHistoryPage(){ + return PageUser.this.isFocusHistoryPage(); + } + + @Override + protected void viewObjectHistoricalDataPerformed(AjaxRequestTarget target, PrismObject object, String date){ + PageUser.this.navigateToNext(new PageUserHistory(object, date)); + } + }; + } + + protected boolean isSelfProfile(){ + return false; + } + + private List loadDelegatedByMeAssignments() { + OperationResult result = new OperationResult(OPERATION_LOAD_DELEGATED_BY_ME_ASSIGNMENTS); + List list = new ArrayList<>(); + try{ + + Task task = createSimpleTask(OPERATION_LOAD_DELEGATED_BY_ME_ASSIGNMENTS); + + PrismReferenceValue referenceValue = getPrismContext().itemFactory().createReferenceValue(getObjectWrapper().getOid(), + UserType.COMPLEX_TYPE); + referenceValue.setRelation(WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION)); + + ObjectFilter refFilter = getPrismContext().queryFor(UserType.class) + .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(referenceValue) + .buildFilter(); + + ObjectQuery query = getPrismContext().queryFactory().createQuery(refFilter); + + List> usersList = getModelService().searchObjects(UserType.class, query, null, task, result); + List processedUsersOid = new ArrayList<>(); + if (usersList != null && usersList.size() > 0){ + for (PrismObject user : usersList) { + if (processedUsersOid.contains(user.getOid())){ + continue; + } + List assignments = user.asObjectable().getAssignment(); + for (AssignmentType assignment : assignments) { + if (assignment.getTargetRef() != null && + StringUtils.isNotEmpty(assignment.getTargetRef().getOid()) && + assignment.getTargetRef().getOid().equals(getObjectWrapper().getOid())) { + AssignmentEditorDto dto = new AssignmentEditorDto(UserDtoStatus.MODIFY, assignment, this, + user.asObjectable()); + dto.setEditable(false); + list.add(dto); + } + } + processedUsersOid.add(user.getOid()); + } + } + + } catch (Exception ex){ + result.recomputeStatus(); + showResult(result); + } + Collections.sort(list); + return list; + } + + private List getUserPrivilegesList(){ + List list = new ArrayList<>(); + OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST); + Task task = createSimpleTask(OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST); + for (AssignmentType assignment : getObjectWrapper().getObject().asObjectable().getAssignment()) { + addIgnoreNull(list, createDelegableAssignmentsPreviewDto(assignment, task, result)); + } + return list; + } + + @Override + protected boolean processDeputyAssignments(boolean previewOnly) { + boolean isAnythingChanged = false; + for (AssignmentEditorDto dto : delegationsModel.getObject()) { + if (!UserDtoStatus.MODIFY.equals(dto.getStatus())) { + if (!previewOnly) { + UserType user = dto.getDelegationOwner(); + saveDelegationToUser(user.asPrismObject(), dto); + } + isAnythingChanged = true; + } + } + return isAnythingChanged; + } + + /** + * for now used only for delegation changes + * @param modelContextMap + */ + @Override + protected void processAdditionalFocalObjectsForPreview(Map, ModelContext> modelContextMap){ + for (AssignmentEditorDto dto : delegationsModel.getObject()) { + if (!UserDtoStatus.MODIFY.equals(dto.getStatus())) { + UserType user = dto.getDelegationOwner(); + + OperationResult result = new OperationResult(OPERATION_PREVIEW_CHANGES); + Task task = createSimpleTask(OPERATION_PREVIEW_CHANGES); + try { + + Collection> deltas = prepareDelegationDelta(user.asPrismObject(), dto); + + ModelContext modelContext = getModelInteractionService().previewChanges(deltas, getOptions(true), task, result); + modelContextMap.put(user.asPrismObject(), modelContext); + } catch (Exception e) { + LoggingUtils.logUnexpectedException(LOGGER, "Could not save delegation ", e); + error("Could not save delegation. Reason: " + e); + } finally { + result.recomputeStatus(); + } + } + } + } + + + private void saveDelegationToUser(PrismObject user, AssignmentEditorDto assignmentDto) { + OperationResult result = new OperationResult(OPERATION_SAVE); + try { + getPrismContext().adopt(user); + Collection> deltas = prepareDelegationDelta(user, assignmentDto); + getModelService().executeChanges(deltas, getOptions(false), createSimpleTask(OPERATION_SAVE), result); + + result.recordSuccess(); + } catch (Exception e) { + LoggingUtils.logUnexpectedException(LOGGER, "Could not save assignments ", e); + error("Could not save assignments. Reason: " + e); + } finally { + result.recomputeStatus(); + } + + showResult(result); + } + + private Collection> prepareDelegationDelta(PrismObject user, AssignmentEditorDto dto) + throws SchemaException { + Collection> deltas = new ArrayList<>(); + ObjectDelta delta = user.createModifyDelta(); + List userAssignmentsDtos = new ArrayList<>(); + userAssignmentsDtos.add(dto); + + deltas.add(delta); + PrismContainerDefinition def = user.getDefinition().findContainerDefinition(UserType.F_ASSIGNMENT); + handleAssignmentDeltas(delta, userAssignmentsDtos, def, true); + return deltas; + } + + public boolean isLoggedInUserPage(){ + return getObjectWrapper() != null && getObjectWrapper().getObject() != null && + StringUtils.isNotEmpty(getObjectWrapper().getObject().asObjectable().getOid()) && + getObjectWrapper().getObject().asObjectable().getOid().equals(WebModelServiceUtils.getLoggedInUserOid()); + } + + protected int countConsents() { + int consentCounter = 0; + PrismObject focus = getObjectModel().getObject().getObject(); + List assignments = focus.asObjectable().getAssignment(); + for (AssignmentType assignment : assignments) { + if (isConsentAssignment(assignment)) { + consentCounter++; + } + } + return consentCounter; + } + + private boolean isConsentAssignment(AssignmentType assignment) { + return assignment.getTargetRef() != null && QNameUtil.match(assignment.getTargetRef().getRelation(), SchemaConstants.ORG_CONSENT); + } + + protected List getConsentsList(List assignments, UserDtoStatus status){ + List list = new ArrayList<>(); + for (AssignmentType assignment : assignments) { + if (isConsentAssignment(assignment)) { + //TODO set status + list.add(assignment); + } + } + return list; + } + +}