diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index 9fefcd4d35b..6f8b21c7538 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -704,6 +704,7 @@ public void showResult(OperationResult result, String errorMessageKey, boolean s } + protected String createComponentPath(String... components) { return StringUtils.join(components, ":"); } 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 e80bf3d2ca3..e51c401fc9b 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 @@ -52,245 +52,250 @@ import org.apache.wicket.util.file.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; /** * @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")}) + @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_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_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 model; - private IModel xmlEditorModel; - - public PageImportObject() { - model = new LoadableModel(false) { - - @Override - protected ImportOptionsType load() { - return MiscSchemaUtil.getDefaultImportOptions(); - } - }; - xmlEditorModel = new Model(null); - - initLayout(); - } - - private void initLayout() { - Form mainForm = new Form(ID_MAIN_FORM); - add(mainForm); - - ImportOptionsPanel importOptions = new ImportOptionsPanel(ID_IMPORT_OPTIONS, model); - 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); - - AceEditor aceEditor = new AceEditor(ID_ACE_EDITOR, xmlEditorModel); - aceEditor.setOutputMarkupId(true); - inputAce.add(aceEditor); - - 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 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) { - AjaxSubmitButton saveFileButton = new AjaxSubmitButton(ID_IMPORT_FILE_BUTTON, - createStringResource("PageImportObject.button.import")) { - - @Override - protected void onSubmit(AjaxRequestTarget target, Form form) { - saveFilePerformed(target); - } - - @Override - protected void onError(AjaxRequestTarget target, Form form) { - 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, Form form) { - saveXmlPerformed(target); - } - - @Override - protected void onError(AjaxRequestTarget target, Form form) { - target.add(getFeedbackPanel()); - } - }; - addVisibileForInputType(saveXmlButton, INPUT_XML, inputType); - buttonBar.add(saveXmlButton); - } - - private void saveFilePerformed(AjaxRequestTarget target) { - OperationResult result = new OperationResult(OPERATION_IMPORT_FILE); - - FileUploadField file = (FileUploadField) get(createComponentPath(ID_MAIN_FORM, ID_INPUT, ID_INPUT_FILE, ID_FILE_INPUT)); - final FileUpload uploadedFile = file.getFileUpload(); - if (uploadedFile == null) { - error(getString("pageImportObject.message.nullFile")); - target.add(getFeedbackPanel()); - - return; - } - - InputStream stream = null; - 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(); - } - - newFile = new File(folder, uploadedFile.getClientFileName()); - // Check new file, delete if it already exists - if (newFile.exists()) { - newFile.delete(); - } - // Save file - Task task = createSimpleTask(OPERATION_IMPORT_FILE); - newFile.createNewFile(); - uploadedFile.writeTo(newFile); - - InputStreamReader reader = new InputStreamReader(new FileInputStream(newFile), "utf-8"); - stream = new ReaderInputStream(reader, reader.getEncoding()); - getModelService().importObjectsFromStream(stream, model.getObject(), task, result); - - result.recomputeStatus(); - } catch (Exception ex) { - result.recordFatalError("Couldn't import file.", ex); - LoggingUtils.logException(LOGGER, "Couldn't import file", ex); - } finally { - if (stream != null) { - IOUtils.closeQuietly(stream); - } - if (newFile != null) { - FileUtils.deleteQuietly(newFile); - } - } - - showResult(result); - target.add(getFeedbackPanel()); - } - - private void saveXmlPerformed(AjaxRequestTarget target) { - String xml = xmlEditorModel.getObject(); - if (StringUtils.isEmpty(xml)) { - error(getString("pageImportObject.message.emptyXml")); - target.add(getFeedbackPanel()); - - return; - } - - OperationResult result = new OperationResult(OPERATION_IMPORT_XML); - InputStream stream = null; - try { - Task task = createSimpleTask(OPERATION_IMPORT_XML); - - stream = IOUtils.toInputStream(xml, "utf-8"); - getModelService().importObjectsFromStream(stream, model.getObject(), task, result); - - result.recomputeStatus(); - } catch (Exception ex) { - result.recordFatalError("Couldn't import object.", ex); - LoggingUtils.logException(LOGGER, "Error occured during xml import", ex); - } finally { - if (stream != null) { - IOUtils.closeQuietly(stream); - } - } - - if (result.isSuccess()) { - xmlEditorModel.setObject(null); - } - - showResult(result); - target.add(getFeedbackPanel()); - } + 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_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_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 model; + private IModel xmlEditorModel; + + public PageImportObject() { + model = new LoadableModel(false) { + + @Override + protected ImportOptionsType load() { + return MiscSchemaUtil.getDefaultImportOptions(); + } + }; + xmlEditorModel = new Model(null); + + initLayout(); + } + + private void initLayout() { + Form mainForm = new Form(ID_MAIN_FORM); + add(mainForm); + + ImportOptionsPanel importOptions = new ImportOptionsPanel(ID_IMPORT_OPTIONS, model); + 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); + + AceEditor aceEditor = new AceEditor(ID_ACE_EDITOR, xmlEditorModel); + aceEditor.setOutputMarkupId(true); + inputAce.add(aceEditor); + + 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 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) { + AjaxSubmitButton saveFileButton = new AjaxSubmitButton(ID_IMPORT_FILE_BUTTON, + createStringResource("PageImportObject.button.import")) { + + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + savePerformed(false, OPERATION_IMPORT_FILE, target); + } + + @Override + protected void onError(AjaxRequestTarget target, Form form) { + 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, Form form) { + savePerformed(true, OPERATION_IMPORT_XML, target); + } + + @Override + protected void onError(AjaxRequestTarget target, Form form) { + 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 InputStream getInputStream(boolean raw) throws Exception { + if (raw) { + return IOUtils.toInputStream(xmlEditorModel.getObject(), "utf-8"); + } + 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(); + uploadedFile.writeTo(newFile); + + InputStreamReader reader = new InputStreamReader(new FileInputStream(newFile), "utf-8"); + return new ReaderInputStream(reader, reader.getEncoding()); + } 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); + stream = getInputStream(raw); + getModelService().importObjectsFromStream(stream, model.getObject(), task, result); + + result.recomputeStatus(); + } catch (Exception ex) { + result.recordFatalError("Couldn't import file.", ex); + LoggingUtils.logException(LOGGER, "Couldn't import file", ex); + } finally { + if (stream != null) { + IOUtils.closeQuietly(stream); + } + + } + + if (result.isSuccess()) { + xmlEditorModel.setObject(null); + } + + showResult(result); + target.add(getFeedbackPanel()); + } + + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java index 1350b6ae5da..209f0120793 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java @@ -126,11 +126,7 @@ public PageUsers() { public PageUsers(boolean clearPagingInSession) { this(clearPagingInSession, null, null); } - @Override - protected void onBeforeRender() { - // TODO Auto-generated method stub - super.onBeforeRender(); - } + public PageUsers(boolean clearPagingInSession, final UsersDto.SearchType type, final String text) { searchModel = new LoadableModel(false) { @@ -156,7 +152,6 @@ protected ExecuteChangeOptionsDto load() { }; getSessionStorage().clearPagingInSession(clearPagingInSession); - add(getFeedbackPanel()); initLayout(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java index 9d8de7f6a9b..739b0a1df67 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.LayerRefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.LayerRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; @@ -267,21 +268,7 @@ public RefinedObjectClassDefinition getEditObjectClassDefinition(PrismObject shadow = getShadowModel(accountMancombOid); + display("shadow", shadow); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + RefinedObjectClassDefinition editObjectClassDefinition = modelInteractionService.getEditObjectClassDefinition(shadow, resourceOpenDj, AuthorizationPhaseType.REQUEST); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + TestUtil.assertSuccess(result); + display("OC def", editObjectClassDefinition); + + PrismAsserts.assertPropertyDefinition(editObjectClassDefinition, + new QName(RESOURCE_OPENDJ_NAMESPACE, "cn"), DOMUtil.XSD_STRING, 1, -1); + PrismAsserts.assertPropertyDefinition(editObjectClassDefinition, + new QName(RESOURCE_OPENDJ_NAMESPACE, "o"), DOMUtil.XSD_STRING, 0, -1); + PrismAsserts.assertPropertyDefinition(editObjectClassDefinition, + new QName(RESOURCE_OPENDJ_NAMESPACE, "uidNumber"), DOMUtil.XSD_INT, 1, 1); + PrismAsserts.assertPropertyDefinition(editObjectClassDefinition, + new QName(RESOURCE_OPENDJ_NAMESPACE, "gidNumber"), DOMUtil.XSD_INT, 1, 1); + } + @Test public void test119DeleteUserMancombUnix() throws Exception { final String TEST_NAME = "test119DeleteUserMancombUnix";