diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java index 0881fb6036e..1a6e8ecd3b4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MainObjectListPanel.java @@ -9,6 +9,8 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.button.CsvDownloadButtonPanel; import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.impl.component.icon.CompositedIcon; import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder; @@ -17,11 +19,10 @@ import com.evolveum.midpoint.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; import com.evolveum.midpoint.model.common.util.DefaultColumnUtils; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.DeltaFactory; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ObjectDeltaOperation; import com.evolveum.midpoint.schema.SelectorOptions; @@ -203,7 +204,7 @@ protected DisplayType getMainButtonDisplayType(){ @Override protected Map getMainButtonLayerIcons(){ - if (!isCollectionViewPanel()){ + if (!isCollectionViewPanelForCompiledView()){ return null; } Map layerIconMap = new HashMap<>(); @@ -271,7 +272,8 @@ protected String getFilename() { } @Override - protected void createReportPerformed(String name, SearchFilterType filter, List indexOfColumns, AjaxRequestTarget target) { + protected void createReportPerformed(String name, SearchFilterType filter, IModel> reportWrapper, + List indexOfColumns, AjaxRequestTarget target) { PrismContext prismContext = getPageBase().getPrismContext(); PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByType(ReportType.COMPLEX_TYPE); PrismObject obj = null; @@ -290,6 +292,27 @@ protected void createReportPerformed(String name, SearchFilterType filter, List< name = getPageBase().createStringResource("ObjectTypeGuiDescriptor.report").getString() + "-" + oid; } report.setName(WebComponentUtil.createPolyFromOrigString(name)); + try { + PrismContainerWrapper csvConfig = reportWrapper.getObject().findContainer(ItemPath.create(ReportType.F_EXPORT, ExportConfigurationType.F_CSV)); + if (csvConfig != null && csvConfig.getValue() != null) { + ExportConfigurationType export = new ExportConfigurationType(); + export.setType(ExportType.CSV); + CsvExportType csv = csvConfig.getValue().getRealValue().clone(); + List removedItem = new ArrayList(); + for(Item item : (Collection) csv.asPrismContainerValue().getItems()) { + if (item.getRealValue() == null) { + removedItem.add(item); + } + } + for (Item item : removedItem) { + csv.asPrismContainerValue().getItems().remove(item); + } + export.setCsv(csv); + report.setExport(export); + } + } catch (SchemaException e) { + LOGGER.error("Couldn't find csv export container", e); + } report.setReportEngine(ReportEngineSelectionType.COLLECTION); ObjectCollectionReportEngineConfigurationType objectCollection = new ObjectCollectionReportEngineConfigurationType(); objectCollection.setUseOnlyReportView(true); @@ -464,14 +487,14 @@ protected boolean isCreateNewObjectEnabled(){ } protected List getNewObjectInfluencesList(){ - if (isCollectionViewPanel()){ + if (isCollectionViewPanelForCompiledView()){ return new ArrayList<>(); } return getAllApplicableArchetypeViews(); } protected DisplayType getNewObjectButtonStandardDisplayType(){ - if (isCollectionViewPanel()) { + if (isCollectionViewPanelForCompiledView()) { CompiledObjectCollectionView view = getObjectCollectionView(); if (isArchetypedCollectionView(view)) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java index ed380dd1a6e..75a216f1d06 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java @@ -27,7 +27,6 @@ import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.SerializableSupplier; import com.evolveum.midpoint.web.component.util.VisibleBehaviour; -import com.evolveum.midpoint.web.page.admin.home.PageDashboardConfigurable; import com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusPresentationProperties; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang3.StringUtils; @@ -230,7 +229,7 @@ protected String getSearchByNameParameterValue() { // } protected Search createSearch() { - return SearchFactory.createSearch(type.getClassDefinition(), isCollectionViewPanel() ? getCollectionNameParameterValue().toString() : null, + return SearchFactory.createSearch(type.getClassDefinition(), isCollectionViewPanelForCompiledView() ? getCollectionNameParameterValue().toString() : null, null, getPageBase(), true); } @@ -568,7 +567,7 @@ protected String getTableIdKeyValue(){ if (tableId == null) { return null; } - if (!isCollectionViewPanel()) { + if (!isCollectionViewPanelForCompiledView()) { return tableId.name(); } return tableId.name() + "." + getCollectionNameParameterValue().toString(); @@ -660,7 +659,7 @@ protected WebMarkupContainer createTableButtonToolbar(String id) { protected String getStorageKey(){ - if (isCollectionViewPanel()) { + if (isCollectionViewPanelForCompiledView()) { StringValue collectionName = getCollectionNameParameterValue(); String collectionNameValue = collectionName != null ? collectionName.toString() : ""; return WebComponentUtil.getObjectListPageStorageKey(collectionNameValue); @@ -753,6 +752,7 @@ protected CompiledObjectCollectionView getObjectCollectionView() { } compiledView.setCollection(widget.getData().getCollection()); dashboardWidgetView = compiledView; + return dashboardWidgetView; } catch (SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ExpressionEvaluationException | ObjectNotFoundException e) { LOGGER.error("Couldn't compile collection " + collection.getName(), e); @@ -771,10 +771,24 @@ private StringValue getCollectionNameParameterValue(){ return parameters == null ? null : parameters.get(PageBase.PARAMETER_OBJECT_COLLECTION_NAME); } - protected boolean isCollectionViewPanel() { + protected boolean isCollectionViewPanelForWidget() { + PageParameters parameters = getPageBase().getPageParameters(); + if (parameters != null) { + StringValue widget = parameters.get(PageBase.PARAMETER_DASHBOARD_WIDGET_NAME); + StringValue dashboardOid = parameters.get(PageBase.PARAMETER_DASHBOARD_TYPE_OID); + return widget != null && widget.toString() != null && dashboardOid != null && dashboardOid.toString() != null; + } + return false; + } + + protected boolean isCollectionViewPanelForCompiledView() { return getCollectionNameParameterValue() != null && getCollectionNameParameterValue().toString() != null; } + protected boolean isCollectionViewPanel() { + return isCollectionViewPanelForCompiledView() || isCollectionViewPanelForWidget(); + } + @SuppressWarnings("unchecked") protected BaseSortableDataProvider> getDataProvider() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java index 70a9a9b6d1f..b2e2d82b2e6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/button/CsvDownloadButtonPanel.java @@ -12,6 +12,7 @@ import java.util.List; import com.evolveum.midpoint.gui.api.model.LoadableModel; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; @@ -19,6 +20,7 @@ import com.evolveum.midpoint.web.component.dialog.ExportingPanel; import com.evolveum.midpoint.web.component.search.Search; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import org.apache.commons.lang.StringUtils; @@ -160,8 +162,9 @@ public void exportPerformed(AjaxRequestTarget target) { } @Override - protected void createReportPerformed(String name, SearchFilterType filter, AjaxRequestTarget target) { - CsvDownloadButtonPanel.this.createReportPerformed(name, filter, exportableColumnsIndex, target); + protected void createReportPerformed(String name, SearchFilterType filter, + IModel> report, AjaxRequestTarget target) { + CsvDownloadButtonPanel.this.createReportPerformed(name, filter, report, exportableColumnsIndex, target); } @Override @@ -188,7 +191,7 @@ public boolean isVisibleCreateReportOption() { protected abstract String getFilename(); - protected abstract void createReportPerformed(String name, SearchFilterType filter, List indexOfColumns, AjaxRequestTarget target); + protected abstract void createReportPerformed(String name, SearchFilterType filter, IModel> report, List indexOfColumns, AjaxRequestTarget target); public boolean isVisibleCreateReportOption() { return true; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/CsvExportConfigurtionTabPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/CsvExportConfigurtionTabPanel.html new file mode 100644 index 00000000000..7d33f634df4 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/CsvExportConfigurtionTabPanel.html @@ -0,0 +1,14 @@ + + + + +

+

+
+

+ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/CsvExportConfigurtionTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/CsvExportConfigurtionTabPanel.java new file mode 100644 index 00000000000..125546d9bf5 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/CsvExportConfigurtionTabPanel.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2010-2019 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.component.dialog; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.component.form.CheckBoxPanel; +import com.evolveum.midpoint.gui.api.component.result.MessagePanel; +import com.evolveum.midpoint.gui.api.model.LoadableModel; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper; +import com.evolveum.midpoint.gui.impl.prism.panel.ItemPanelSettingsBuilder; +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; +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.component.AceEditor; +import com.evolveum.midpoint.web.component.message.FeedbackAlerts; +import com.evolveum.midpoint.web.component.search.Search; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.model.PrismContainerWrapperModel; +import com.evolveum.midpoint.web.model.PrismPropertyWrapperModel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; + +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.StringResourceModel; + +/** + * @author skublik + */ + +public class CsvExportConfigurtionTabPanel extends BasePanel { + + private static final Trace LOGGER = TraceManager.getTrace(ExportingFilterTabPanel.class); + + private static final String ID_WARNING_MESSAGE = "warningMessage"; + private static final String ID_CSV_FIELD = "csv"; + + private LoadableModel search; + private FeedbackAlerts feedbackList; + private IModel> report; + + public CsvExportConfigurtionTabPanel(String id, IModel> report) { + super(id); + this.report = report; + } + + @Override + protected void onInitialize() { + super.onInitialize(); + initLayer(); + } + + private void initLayer() { + + StringResourceModel messageModel = getPageBase().createStringResource("ExportingFilterTabPanel.message.useFilter"); + MessagePanel warningMessage = new MessagePanel(ID_WARNING_MESSAGE, MessagePanel.MessagePanelType.WARN, messageModel); + warningMessage.setOutputMarkupId(true); + add(warningMessage); + + Panel csv = null; + try { + csv = getPageBase().initItemPanel(ID_CSV_FIELD, CsvExportType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(report, + ItemPath.create(ReportType.F_EXPORT, ExportConfigurationType.F_CSV)), new ItemPanelSettingsBuilder().build()); + } catch (SchemaException e) { + LOGGER.error("Could not create panel for filter. Reason: {}", e.getMessage(), e); + } + add(csv); + } + + public CsvExportType getFilter() throws Exception { + PrismContainerWrapper csv = report.getObject().findContainer(ItemPath.create(ReportType.F_EXPORT, ExportConfigurationType.F_CSV)); + return csv.getValue().getRealValue(); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingFilterTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingFilterTabPanel.java index 44e391bb4ea..0e47f8f2109 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingFilterTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingFilterTabPanel.java @@ -42,7 +42,6 @@ public class ExportingFilterTabPanel extends BasePanel { private static final String ID_FILTER_FIELD = "filter"; private LoadableModel search; - private FeedbackAlerts feedbackList; private IModel check = new IModel() { private boolean check = false; @@ -78,10 +77,9 @@ public void setObject(String object) { } }; - public ExportingFilterTabPanel(String id, LoadableModel search, FeedbackAlerts feedbackList) { + public ExportingFilterTabPanel(String id, LoadableModel search) { super(id); this.search = search; - this.feedbackList = feedbackList; } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.html index 46d30bfe734..af75eb02e36 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.html @@ -7,7 +7,7 @@ --> -
+

@@ -23,5 +23,5 @@

-
+ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.java index 0ccb309fe2c..303fbf58c2a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ExportingPanel.java @@ -12,16 +12,34 @@ import java.util.List; import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; +import com.evolveum.midpoint.gui.api.factory.wrapper.ItemWrapperFactory; +import com.evolveum.midpoint.gui.api.factory.wrapper.PrismObjectWrapperFactory; +import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext; import com.evolveum.midpoint.gui.api.model.LoadableModel; +import com.evolveum.midpoint.gui.api.prism.ItemStatus; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper; +import com.evolveum.midpoint.gui.impl.prism.panel.ItemPanelSettingsBuilder; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.component.TabbedPanel; +import com.evolveum.midpoint.web.component.form.Form; import com.evolveum.midpoint.web.component.input.TextPanel; import com.evolveum.midpoint.web.component.message.FeedbackAlerts; import com.evolveum.midpoint.web.component.search.Search; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.model.PrismContainerWrapperModel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardReportEngineConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExportConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionReportEngineConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import org.apache.wicket.Component; @@ -36,6 +54,7 @@ import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -59,7 +78,7 @@ public class ExportingPanel extends BasePanel implements Popupable { private static final Trace LOGGER = TraceManager.getTrace(ExportingPanel.class); private static final long serialVersionUID = 1L; - private static final String ID_PANEL = "panel"; + private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_WARNING_MESSAGE = "warningMessage"; private static final String ID_FEEDBACK = "feedback"; private static final String ID_CREATE_REPORT = "createReport"; @@ -73,6 +92,14 @@ public class ExportingPanel extends BasePanel implements Popupable { private Long exportSizeLimit; private LoadableModel search; private final IModel nameModel; + private IModel> report = new LoadableModel>(false) { + private static final long serialVersionUID = 1L; + + @Override + protected PrismObjectWrapper load() { + return initReportWrapper(); + } + }; public ExportingPanel(String id, DataTable dataTable, List exportedColumnsIndex, Long exportSizeLimit, LoadableModel search, IModel name) { @@ -92,26 +119,27 @@ protected void onInitialize() { } private void initLayout() { - WebMarkupContainer panel = new WebMarkupContainer(ID_PANEL); + initReportWrapper(); + Form form = new Form<>(ID_MAIN_FORM, true); MessagePanel warningMessage = new MessagePanel(ID_WARNING_MESSAGE, MessagePanel.MessagePanelType.WARN, getWarningMessageModel()); warningMessage.setOutputMarkupId(true); warningMessage.add(new VisibleBehaviour(() -> getWarningMessageModel() != null)); - panel.add(warningMessage); + form.add(warningMessage); FeedbackAlerts feedbackList = new FeedbackAlerts(ID_FEEDBACK); feedbackList.setOutputMarkupId(true); feedbackList.setOutputMarkupPlaceholderTag(true); - panel.add(feedbackList); + form.add(feedbackList); TextPanel nameField = new TextPanel(ID_NAME, nameModel); - panel.add(nameField); - nameField.getBaseFormComponent().add(new AjaxFormComponentUpdatingBehavior("change") { - - @Override - protected void onUpdate(AjaxRequestTarget target) { - } - }); + form.add(nameField); +// nameField.getBaseFormComponent().add(new AjaxFormComponentUpdatingBehavior("change") { +// +// @Override +// protected void onUpdate(AjaxRequestTarget target) { +// } +// }); TabbedPanel tabPanel = new TabbedPanel(ID_TAB, createTabs(feedbackList)){ @Override @@ -128,18 +156,16 @@ public void onClick(AjaxRequestTarget target) { }; } }; - panel.add(tabPanel); + form.add(tabPanel); PanelTab columnTabPanel = (PanelTab) tabPanel.getTabs().getObject().get(0); PanelTab filterTabPanel = (PanelTab) tabPanel.getTabs().getObject().get(1); - AjaxButton createReport = new AjaxButton(ID_CREATE_REPORT, - new StringResourceModel("ExportingPopupPanel.createReport", this, null)) { - + AjaxSubmitButton createReport = new AjaxSubmitButton(ID_CREATE_REPORT, getPageBase().createStringResource("ExportingPopupPanel.createReport")) { private static final long serialVersionUID = 1L; @Override - public void onClick(AjaxRequestTarget target) { - performSelectedColumns(columnTabPanel, target); + protected void onSubmit(AjaxRequestTarget target) { + performSelectedColumns(columnTabPanel); if (exportedColumnsIndex.isEmpty()) { LOGGER.warn("None columns selected"); getPageBase().warn(createStringResource("ExportingPanel.message.error.selectColumn").getString()); @@ -162,9 +188,14 @@ public void onClick(AjaxRequestTarget target) { return; } } - createReportPerformed(nameModel.getObject(), filter, target); + createReportPerformed(nameModel.getObject(), filter, report, target); ((PageBase) getPage()).hideMainPopup(target); } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(getPageBase().getFeedbackPanel()); + } }; createReport.add(new VisibleEnableBehaviour() { @Override @@ -172,15 +203,13 @@ public boolean isVisible() { return isVisibleCreateReportOption(); } }); - panel.add(createReport); - AjaxButton exportSelected = new AjaxButton(ID_EXPORT, - new StringResourceModel("ExportingPopupPanel.exportSelected", this, null)) { - + form.add(createReport); + AjaxSubmitButton exportSelected = new AjaxSubmitButton(ID_EXPORT, getPageBase().createStringResource("ExportingPopupPanel.exportSelected")) { private static final long serialVersionUID = 1L; @Override - public void onClick(AjaxRequestTarget target) { - performSelectedColumns(columnTabPanel, target); + public void onSubmit(AjaxRequestTarget target) { + performSelectedColumns(columnTabPanel); if (exportedColumnsIndex.isEmpty()) { LOGGER.warn("None columns selected"); getPageBase().warn("ExportingPanel.message.error.selectColumn"); @@ -190,8 +219,13 @@ public void onClick(AjaxRequestTarget target) { ((PageBase) getPage()).hideMainPopup(target); exportPerformed(target); } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(getPageBase().getFeedbackPanel()); + } }; - panel.add(exportSelected); + form.add(exportSelected); AjaxButton cancelButton = new AjaxButton(ID_CANCEL, new StringResourceModel("Button.cancel", this, null)) { @@ -202,19 +236,36 @@ public void onClick(AjaxRequestTarget target) { cancelPerformed(target); } }; - panel.add(cancelButton); - add(panel); + form.add(cancelButton); + add(form); } - private void performSelectedColumns(PanelTab columnTabPanel, AjaxRequestTarget target) { + private PrismObjectWrapper initReportWrapper() { + Task task = getPageBase().createSimpleTask("Create report wrapper"); + PrismObjectDefinition def = getPageBase().getPrismContext().getSchemaRegistry().findObjectDefinitionByType(ReportType.COMPLEX_TYPE); + PrismObjectWrapperFactory factory = getPageBase().findObjectWrapperFactory(def); + + WrapperContext context = new WrapperContext(task, task.getResult()); + context.setCreateIfEmpty(false); + try { + PrismObject reportType = def.instantiate(); + PrismObjectWrapper objectWrapper = factory.createObjectWrapper(reportType, ItemStatus.ADDED, context); + return objectWrapper; + } catch (SchemaException e) { + LOGGER.error("Could not create object wrapper for report. Reason: {}", e.getMessage(), e); + } + return null; + } + + private void performSelectedColumns(PanelTab columnTabPanel) { exportedColumnsIndex.clear(); BoxedTablePanel> table = (BoxedTablePanel>) columnTabPanel.getPanel(); List availableData = ((SelectableListDataProvider) table.getDataTable().getDataProvider()).getSelectedObjects(); exportedColumnsIndex.addAll(availableData); } - protected void createReportPerformed(String name, SearchFilterType filter, AjaxRequestTarget target) { - + protected void createReportPerformed(String name, SearchFilterType filter, IModel> report, + AjaxRequestTarget target) { } private List createTabs(FeedbackAlerts feedbackList) { @@ -230,7 +281,7 @@ public WebMarkupContainer createPanel(String panelId) { tabs.add(new PanelTab(getPageBase().createStringResource("ExportingPopupPanel.filter")) { @Override public WebMarkupContainer createPanel(String panelId) { - return new ExportingFilterTabPanel(panelId, search, feedbackList){ + return new ExportingFilterTabPanel(panelId, search){ @Override public PageBase getPageBase() { return ExportingPanel.this.getPageBase(); @@ -243,6 +294,19 @@ public boolean isVisible() { return isVisibleCreateReportOption(); } }); + + tabs.add(new PanelTab(getPageBase().createStringResource("ExportingPopupPanel.ExportConfiguration")) { + @Override + public WebMarkupContainer createPanel(String panelId) { + return new CsvExportConfigurtionTabPanel(panelId, report); + } + + @Override + public boolean isVisible() { + return isVisibleCreateReportOption(); + } + }); + return tabs; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java index 068db238aaa..68f0937945d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java @@ -20,6 +20,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper; import com.evolveum.midpoint.gui.api.util.WebPrismUtil; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.path.ItemPath; @@ -608,7 +609,7 @@ protected String getFilename() { } @Override - protected void createReportPerformed(String name, SearchFilterType filter, List object, AjaxRequestTarget target) { + protected void createReportPerformed(String name, SearchFilterType filter, IModel> report, List object, AjaxRequestTarget target) { } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java index 4cbae9cbeda..eee1dec7021 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java @@ -196,7 +196,7 @@ private void taskDetailsPerformed(String oid) { private List, String>> initTaskColumns() { List, String>> columns = new ArrayList<>(); - if (!isCollectionViewPanel()){ + if (!isCollectionViewPanelForCompiledView()){ columns.add(createTaskCategoryColumn()); } columns.addAll(initCustomTaskColumns()); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 69270c670a7..69075b0d9fe 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -17067,6 +17067,7 @@ 4.2 + true @@ -17074,7 +17075,12 @@ Condition for the searched objects. Searched object will be shown if the condition evaluates to true. + This condition use only for reports and as last option because of performance. + + 4.2 + true + diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/interaction/DashboardService.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/interaction/DashboardService.java index b6ba04ff52b..5e65190ae1d 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/interaction/DashboardService.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/interaction/DashboardService.java @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.List; +import com.evolveum.midpoint.audit.api.AuditEventRecord; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; @@ -34,11 +35,20 @@ @Experimental public interface DashboardService { - DashboardWidget createWidgetData(DashboardWidgetType widget, Task task, OperationResult result) throws SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException, ObjectNotFoundException; + DashboardWidget createWidgetData(DashboardWidgetType widget, Task task, OperationResult result) + throws SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, + ExpressionEvaluationException, ObjectNotFoundException; - List> searchObjectFromCollection(CollectionRefSpecificationType collection, QName typeForFilter, Collection> options, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException; + List> searchObjectFromCollection(CollectionRefSpecificationType collection, QName typeForFilter, + Collection> options, Task task, OperationResult result) throws SchemaException, + ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException; - ObjectCollectionType getObjectCollectionType(DashboardWidgetType widget, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException; + List searchObjectFromCollection(CollectionRefSpecificationType collectionConfig, Task task, OperationResult result) + throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, + ExpressionEvaluationException; + + ObjectCollectionType getObjectCollectionType(DashboardWidgetType widget, Task task, OperationResult result) throws ObjectNotFoundException, + SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException; CollectionRefSpecificationType getCollectionRefSpecificationType(DashboardWidgetType widget, Task task, OperationResult result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java index 1329ee83d9f..93734ae83df 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/DashboardServiceImpl.java @@ -10,6 +10,8 @@ import java.util.*; +import com.evolveum.midpoint.audit.api.AuditEventRecord; +import com.evolveum.midpoint.model.api.util.DashboardUtils; import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -381,11 +383,14 @@ private void evaluateVariation(DashboardWidgetType widget, ExpressionVariables v } @Override - public List> searchObjectFromCollection(CollectionRefSpecificationType collectionConfig, QName typeForFilter, Collection> defaultOptions, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException { + public List> searchObjectFromCollection(CollectionRefSpecificationType collectionConfig, QName typeForFilter, + Collection> defaultOptions, Task task, OperationResult result) + throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException { SearchFilterType searchFilter; SearchFilterType searchFilterForMerge = null; Collection> options = defaultOptions; Class type; + ExpressionType condition = null; if (collectionConfig.getCollectionRef() != null && collectionConfig.getFilter() != null) { LOGGER.error("CollectionRefSpecificationType contains CollectionRef and Filter, please define only one"); @@ -403,6 +408,9 @@ public List> searchObjectFromCollection(CollectionRefSpe if (collection.getSelectorOptions() != null) { options = MiscSchemaUtil.optionsTypeToOptions(collection.getSelectorOptions(), prismContext); } + if (collection.getCondition() != null) { + condition = collection.getCondition(); + } } else { searchFilter = collectionConfig.getFilter(); if (collectionConfig.getBaseCollectionRef() != null && @@ -420,6 +428,9 @@ public List> searchObjectFromCollection(CollectionRefSpe if (collection.getSelectorOptions() != null) { options = MiscSchemaUtil.optionsTypeToOptions(collection.getSelectorOptions(), prismContext); } + if (collection.getCondition() != null) { + condition = collection.getCondition(); + } } else { searchFilterForMerge = collectionConfig.getBaseCollectionRef().getFilter(); } @@ -468,13 +479,55 @@ public List> searchObjectFromCollection(CollectionRefSpe ObjectFilter objectFilter = query.getFilter(); - objectFilter = collectionProcessor.evaluateExpressionsInFilter(objectFilter, task.getResult(), task); + objectFilter = collectionProcessor.evaluateExpressionsInFilter(objectFilter, result, task); query.setFilter(objectFilter); List> values; - values = modelService.searchObjects(type, query, options, task, task.getResult()); + values = modelService.searchObjects(type, query, options, task, result); + if(condition != null) { + return evaluateCondition(condition, values, task, result); + } return values; } + @Override + public List searchObjectFromCollection(CollectionRefSpecificationType collectionConfig, Task task, OperationResult result) + throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException { + List auditRecords = new ArrayList<>(); + if (collectionConfig.getCollectionRef() != null) { + ObjectReferenceType ref = collectionConfig.getCollectionRef(); + Class refType = prismContext.getSchemaRegistry().determineClassForType(ref.getType()); + ObjectCollectionType collection = (ObjectCollectionType) modelService + .getObject(refType, ref.getOid(), null, task, result).asObjectable(); + if (collection.getAuditSearch() != null) { + Map parameters = new HashMap<>(); + String query = DashboardUtils.getQueryForListRecords(DashboardUtils.createQuery(collection, parameters, false, clock)); + auditRecords = auditService.listRecords(query, parameters, result); + if (auditRecords == null) { + auditRecords = new ArrayList<>(); + } + if (collection.getCondition() != null) { + return evaluateCondition(collection.getCondition(), auditRecords, task, result); + } + } + } + return auditRecords; + } + + private List evaluateCondition(ExpressionType condition, List values, Task task, OperationResult result) + throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { + List newValues = new ArrayList(); + for (T value : values) { + ExpressionVariables variables = new ExpressionVariables(); + variables.put(ExpressionConstants.VAR_OBJECT, value, value.getClass()); + PrismPropertyValue conditionValue = ExpressionUtil.evaluateCondition(variables, condition, null, expressionFactory, + "Evaluate condition", task, result); + if (conditionValue != null && Boolean.TRUE.equals(conditionValue.getRealValue())) { + newValues.add(value); + } + } + return newValues; + } + @Override public ObjectCollectionType getObjectCollectionType(DashboardWidgetType widget, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { if (isCollectionRefOfCollectionNull(widget)) { diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/CsvExporterController.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/CsvExporterController.java index 0d4e0882345..efb3affadd9 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/CsvExporterController.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/CsvExporterController.java @@ -13,10 +13,14 @@ import com.evolveum.midpoint.model.common.util.DefaultColumnUtils; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; +import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; import com.evolveum.midpoint.report.impl.ReportServiceImpl; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; @@ -143,21 +147,17 @@ public byte[] processCollection(String nameOfReport, ObjectCollectionReportEngin if (!isAuditCollection) { csvFile = createTableBoxForObjectView(collectionRefSpecification, compiledCollection, task, result); } else { - csvFile = createTableBoxForAuditView(collection, compiledCollection, task, result); + csvFile = createTableForAuditView(collectionRefSpecification, compiledCollection, task, result); } return csvFile; } - private byte[] createTableBoxForAuditView(ObjectCollectionType collection, CompiledObjectCollectionView compiledCollection, Task task, OperationResult result) { - Map parameters = new HashMap<>(); - String query = DashboardUtils - .getQueryForListRecords(DashboardUtils.createQuery(collection, parameters, false, getReportService().getClock())); - List auditRecords = getReportService().getAuditService().listRecords(query, parameters, result); - if (auditRecords == null) { - auditRecords = new ArrayList<>(); - } + private byte[] createTableForAuditView(CollectionRefSpecificationType collectionRef, CompiledObjectCollectionView compiledCollection, + Task task, OperationResult result) throws CommunicationException, ObjectNotFoundException, SchemaException, + SecurityViolationException, ConfigurationException, ExpressionEvaluationException { + List auditRecords = getReportService().getDashboardService().searchObjectFromCollection(collectionRef, task, result); if (compiledCollection.getColumns().isEmpty()) { getReportService().getModelInteractionService().applyView(compiledCollection, DefaultColumnUtils.getDefaultAuditEventsView()); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/HtmlExportController.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/HtmlExportController.java index 30c109854a1..fb74a27fce5 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/HtmlExportController.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/export/HtmlExportController.java @@ -128,7 +128,7 @@ public byte[] processDashboard(DashboardReportEngineConfigurationType dashboardC LOGGER.error("CollectionRef is null for report of audit records"); throw new IllegalArgumentException("CollectionRef is null for report of audit records"); } - tableBox = createTableBoxForAuditView(widgetData.getLabel(), collection, compiledCollection, false, task, result); + tableBox = createTableBoxForAuditView(widgetData.getLabel(), collectionRefSpecification, compiledCollection, false, task, result); break; } if (tableBox != null) { @@ -215,9 +215,9 @@ public byte[] processCollection(String nameOfReport, ObjectCollectionReportEngin ContainerTag tableBox; boolean isAuditCollection = collection != null && collection.getAuditSearch() != null; if (!isAuditCollection) { - tableBox = createTableBoxForObjectView(label, collectionConfig.getCollection(), compiledCollection, true, task, result); + tableBox = createTableBoxForObjectView(label, collectionRefSpecification, compiledCollection, true, task, result); } else { - tableBox = createTableBoxForAuditView(label, collection, compiledCollection, true, task, result); + tableBox = createTableBoxForAuditView(label, collectionRefSpecification, compiledCollection, true, task, result); } body.append(tableBox.render()); @@ -391,16 +391,11 @@ private ContainerTag createTableBoxForObjectView(String label, CollectionRefSpec } private ContainerTag createTableBoxForAuditView( - String label, ObjectCollectionType collection, @NotNull CompiledObjectCollectionView compiledCollection, - boolean recordProgress, Task task, OperationResult result) { - Map parameters = new HashMap<>(); + String label, CollectionRefSpecificationType collection, @NotNull CompiledObjectCollectionView compiledCollection, + boolean recordProgress, Task task, OperationResult result) throws CommunicationException, ObjectNotFoundException, + SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { long startMillis = getReportService().getClock().currentTimeMillis(); - String query = DashboardUtils - .getQueryForListRecords(DashboardUtils.createQuery(collection, parameters, false, getReportService().getClock())); - List records = getReportService().getAuditService().listRecords(query, parameters, result); - if (records == null || records.isEmpty()) { - return null; - } + List records = getReportService().getDashboardService().searchObjectFromCollection(collection, task, result); if (compiledCollection.getColumns().isEmpty()) { getReportService().getModelInteractionService().applyView(compiledCollection, DefaultColumnUtils.getDefaultAuditEventsView()); diff --git a/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicNewReportTest.java b/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicNewReportTest.java index a526325d788..60422b8cb08 100644 --- a/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicNewReportTest.java +++ b/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicNewReportTest.java @@ -56,30 +56,40 @@ public abstract class BasicNewReportTest extends AbstractReportIntegrationTest { public static final File COLLECTION_SHADOW_WITH_VIEW_FILE = new File(COMMON_DIR, "object-collection-shadow-of-resource-with-view.xml"); public static final File DASHBOARD_TRIPLE_VIEW_FILE = new File(COMMON_DIR, "dashboard-with-triple-view.xml"); public static final File COLLECTION_BASIC = new File(COMMON_DIR, "object-collection-basic-filter.xml"); + public static final File COLLECTION_USER_WITH_CONDITION_FILE = new File(COMMON_DIR, "object-collection-all-user-with-condition.xml"); + public static final File COLLECTION_AUDIT_WITH_CONDITION_FILE = new File(COMMON_DIR, "object-collection-audit-records-with-condition.xml"); public static final File REPORT_DASHBOARD_WITH_DEFAULT_COLUMN_FILE = new File(TEST_REPORTS_DIR, "report-dashboard-with-default-column.xml"); public static final File REPORT_DASHBOARD_WITH_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-dashboard-with-view.xml"); public static final File REPORT_DASHBOARD_WITH_TRIPLE_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-dashboard-with-triple-view.xml"); - public static final File REPORT_OBJECT_COLLECTION_WITH_DEFAULT_COLUMN_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-default-column.xml"); - public static final File REPORT_OBJECT_COLLECTION_WITH_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-view.xml"); - public static final File REPORT_OBJECT_COLLECTION_WITH_DOUBLE_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-double-view.xml"); + public static final File REPORT_AUDIT_COLLECTION_WITH_DEFAULT_COLUMN_FILE = new File(TEST_REPORTS_DIR, "report-audit-collection-with-default-column.xml"); public static final File REPORT_AUDIT_COLLECTION_WITH_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-audit-collection-with-view.xml"); public static final File REPORT_AUDIT_COLLECTION_WITH_DOUBLE_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-audit-collection-with-double-view.xml"); + public static final File REPORT_AUDIT_COLLECTION_WITH_CONDITION_FILE = new File(TEST_REPORTS_DIR, "report-audit-collection-with-condition.xml"); + + public static final File REPORT_OBJECT_COLLECTION_WITH_DEFAULT_COLUMN_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-default-column.xml"); + public static final File REPORT_OBJECT_COLLECTION_WITH_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-view.xml"); + public static final File REPORT_OBJECT_COLLECTION_WITH_DOUBLE_VIEW_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-double-view.xml"); public static final File REPORT_OBJECT_COLLECTION_WITH_FILTER_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-filter.xml"); public static final File REPORT_OBJECT_COLLECTION_WITH_FILTER_AND_BASIC_COLLECTION_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-filter-and-basic-collection.xml"); + public static final File REPORT_OBJECT_COLLECTION_WITH_CONDITION_FILE = new File(TEST_REPORTS_DIR, "report-object-collection-with-condition.xml"); public static final String REPORT_DASHBOARD_WITH_DEFAULT_COLUMN_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a8582"; public static final String REPORT_DASHBOARD_WITH_VIEW_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a8533"; public static final String REPORT_DASHBOARD_WITH_TRIPLE_VIEW_OID = "2b87aa2e-dd86-4842-bcf5-76200a9a8533"; - public static final String REPORT_OBJECT_COLLECTION_WITH_DEFAULT_COLUMN_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85ab"; - public static final String REPORT_OBJECT_COLLECTION_WITH_VIEW_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85de"; - public static final String REPORT_OBJECT_COLLECTION_WITH_DOUBLE_VIEW_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85ef"; + public static final String REPORT_AUDIT_COLLECTION_WITH_DEFAULT_COLUMN_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85bc"; public static final String REPORT_AUDIT_COLLECTION_WITH_VIEW_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85cd"; public static final String REPORT_AUDIT_COLLECTION_WITH_DOUBLE_VIEW_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85fg"; + public static final String REPORT_AUDIT_COLLECTION_WITH_CONDITION_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85rr"; + + public static final String REPORT_OBJECT_COLLECTION_WITH_DEFAULT_COLUMN_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85ab"; + public static final String REPORT_OBJECT_COLLECTION_WITH_VIEW_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85de"; + public static final String REPORT_OBJECT_COLLECTION_WITH_DOUBLE_VIEW_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85ef"; public static final String REPORT_OBJECT_COLLECTION_WITH_FILTER_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85gh"; public static final String REPORT_OBJECT_COLLECTION_WITH_FILTER_AND_BASIC_COLLECTION_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a85hi"; + public static final String REPORT_OBJECT_COLLECTION_WITH_CONDITION_OID = "2b44aa2e-dd86-4842-bcf5-762c8a9a851a"; public static final String RESOURCE_DUMMY_OID = "10000000-0000-0000-0000-000000000004"; @@ -112,9 +122,11 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti importObjectFromFile(COLLECTION_RESOURCE_WITH_VIEW_FILE, initResult); importObjectFromFile(COLLECTION_TASK_WITH_VIEW_FILE, initResult); importObjectFromFile(COLLECTION_AUDIT_WITH_VIEW_FILE, initResult); + importObjectFromFile(COLLECTION_AUDIT_WITH_CONDITION_FILE, initResult); importObjectFromFile(COLLECTION_ASSIGNMENT_HOLDER_WITH_VIEW_FILE, initResult); importObjectFromFile(COLLECTION_SHADOW_WITH_VIEW_FILE, initResult); importObjectFromFile(DASHBOARD_TRIPLE_VIEW_FILE, initResult); + importObjectFromFile(COLLECTION_USER_WITH_CONDITION_FILE, initResult); importObjectFromFile(REPORT_DASHBOARD_WITH_DEFAULT_COLUMN_FILE, initResult); importObjectFromFile(REPORT_DASHBOARD_WITH_VIEW_FILE, initResult); @@ -125,8 +137,10 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti importObjectFromFile(REPORT_AUDIT_COLLECTION_WITH_DEFAULT_COLUMN_FILE, initResult); importObjectFromFile(REPORT_AUDIT_COLLECTION_WITH_VIEW_FILE, initResult); importObjectFromFile(REPORT_AUDIT_COLLECTION_WITH_DOUBLE_VIEW_FILE, initResult); + importObjectFromFile(REPORT_AUDIT_COLLECTION_WITH_CONDITION_FILE, initResult); importObjectFromFile(REPORT_OBJECT_COLLECTION_WITH_FILTER_FILE, initResult); importObjectFromFile(REPORT_OBJECT_COLLECTION_WITH_FILTER_AND_BASIC_COLLECTION_FILE, initResult); + importObjectFromFile(REPORT_OBJECT_COLLECTION_WITH_CONDITION_FILE, initResult); } @Test @@ -151,61 +165,75 @@ public void test003CreateDashboardReportWithTripleView() throws Exception { } @Test - public void test010CreateObjectCollectionReportWithDefaultColumn() throws Exception { - PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_DEFAULT_COLUMN_OID); + public void test101CreateAuditCollectionReportWithDefaultColumn() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_AUDIT_COLLECTION_WITH_DEFAULT_COLUMN_OID); runReport(report, false); basicCheckOutputFile(report); } @Test - public void test011CreateObjectCollectionReportWithView() throws Exception { - PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_VIEW_OID); + public void test102CreateAuditCollectionReportWithView() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_AUDIT_COLLECTION_WITH_VIEW_OID); runReport(report, false); basicCheckOutputFile(report); } @Test - public void test012CreateObjectCollectionReportWithDoubleView() throws Exception { - PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_DOUBLE_VIEW_OID); + public void test103CreateAuditCollectionReportWithDoubleView() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_AUDIT_COLLECTION_WITH_DOUBLE_VIEW_OID); runReport(report, false); basicCheckOutputFile(report); } @Test - public void test013CreateAuditCollectionReportWithDefaultColumn() throws Exception { - PrismObject report = getObject(ReportType.class, REPORT_AUDIT_COLLECTION_WITH_DEFAULT_COLUMN_OID); + public void test104CreateAuditCollectionReportWithCondition() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_AUDIT_COLLECTION_WITH_CONDITION_OID); runReport(report, false); basicCheckOutputFile(report); } @Test - public void test014CreateAuditCollectionReportWithView() throws Exception { - PrismObject report = getObject(ReportType.class, REPORT_AUDIT_COLLECTION_WITH_VIEW_OID); + public void test110CreateObjectCollectionReportWithDefaultColumn() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_DEFAULT_COLUMN_OID); runReport(report, false); basicCheckOutputFile(report); } @Test - public void test015CreateAuditCollectionReportWithDoubleView() throws Exception { - PrismObject report = getObject(ReportType.class, REPORT_AUDIT_COLLECTION_WITH_DOUBLE_VIEW_OID); + public void test111CreateObjectCollectionReportWithView() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_VIEW_OID); runReport(report, false); basicCheckOutputFile(report); } @Test - public void test016CreateObjectCollectionReportWithFilter() throws Exception { + public void test112CreateObjectCollectionReportWithDoubleView() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_DOUBLE_VIEW_OID); + runReport(report, false); + basicCheckOutputFile(report); + } + + @Test + public void test113CreateObjectCollectionReportWithFilter() throws Exception { PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_FILTER_OID); runReport(report, false); basicCheckOutputFile(report); } @Test - public void test017CreateObjectCollectionReportWithFilterAndBasicCollection() throws Exception { + public void test114CreateObjectCollectionReportWithFilterAndBasicCollection() throws Exception { PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_FILTER_AND_BASIC_COLLECTION_OID); runReport(report, false); basicCheckOutputFile(report); } + @Test + public void test115CreateObjectCollectionReportWithCondition() throws Exception { + PrismObject report = getObject(ReportType.class, REPORT_OBJECT_COLLECTION_WITH_CONDITION_OID); + runReport(report, false); + basicCheckOutputFile(report); + } + protected PrismObject runReport(PrismObject report, boolean errorOk) throws Exception { Task task = getTestTask(); OperationResult result = task.getResult(); diff --git a/model/report-impl/src/test/java/com/evolveum/midpoint/report/TestCsvReport.java b/model/report-impl/src/test/java/com/evolveum/midpoint/report/TestCsvReport.java index eaf9abbe842..047330f0063 100644 --- a/model/report-impl/src/test/java/com/evolveum/midpoint/report/TestCsvReport.java +++ b/model/report-impl/src/test/java/com/evolveum/midpoint/report/TestCsvReport.java @@ -45,59 +45,73 @@ public void test003CreateDashboardReportWithTripleView() throws Exception { } @Override - public void test010CreateObjectCollectionReportWithDefaultColumn() throws Exception { - expectedColumns = 6; - expectedRow = 4; - super.test010CreateObjectCollectionReportWithDefaultColumn(); + public void test101CreateAuditCollectionReportWithDefaultColumn() throws Exception { + expectedColumns = 8; + expectedRow = -1; + super.test101CreateAuditCollectionReportWithDefaultColumn(); } @Override - public void test011CreateObjectCollectionReportWithView() throws Exception { + public void test102CreateAuditCollectionReportWithView() throws Exception { expectedColumns = 2; - expectedRow = 2; - super.test011CreateObjectCollectionReportWithView(); + expectedRow = -1; + super.test102CreateAuditCollectionReportWithView(); } @Override - public void test012CreateObjectCollectionReportWithDoubleView() throws Exception { + public void test103CreateAuditCollectionReportWithDoubleView() throws Exception { expectedColumns = 3; - expectedRow = 4; - super.test012CreateObjectCollectionReportWithDoubleView(); + expectedRow = -1; + super.test103CreateAuditCollectionReportWithDoubleView(); } - @Override - public void test013CreateAuditCollectionReportWithDefaultColumn() throws Exception { + @Test + public void test104CreateAuditCollectionReportWithCondition() throws Exception { expectedColumns = 8; - expectedRow = 46; - super.test013CreateAuditCollectionReportWithDefaultColumn(); + expectedRow = 2; + super.test104CreateAuditCollectionReportWithCondition(); + } + + @Override + public void test110CreateObjectCollectionReportWithDefaultColumn() throws Exception { + expectedColumns = 6; + expectedRow = 4; + super.test110CreateObjectCollectionReportWithDefaultColumn(); } @Override - public void test014CreateAuditCollectionReportWithView() throws Exception { + public void test111CreateObjectCollectionReportWithView() throws Exception { expectedColumns = 2; - expectedRow = 48; - super.test014CreateAuditCollectionReportWithView(); + expectedRow = 2; + super.test111CreateObjectCollectionReportWithView(); } @Override - public void test015CreateAuditCollectionReportWithDoubleView() throws Exception { + public void test112CreateObjectCollectionReportWithDoubleView() throws Exception { expectedColumns = 3; - expectedRow = 50; - super.test015CreateAuditCollectionReportWithDoubleView(); + expectedRow = 4; + super.test112CreateObjectCollectionReportWithDoubleView(); } @Override - public void test016CreateObjectCollectionReportWithFilter() throws Exception { + public void test113CreateObjectCollectionReportWithFilter() throws Exception { expectedColumns = 2; expectedRow = 3; - super.test016CreateObjectCollectionReportWithFilter(); + super.test113CreateObjectCollectionReportWithFilter(); } @Override - public void test017CreateObjectCollectionReportWithFilterAndBasicCollection() throws Exception { + public void test114CreateObjectCollectionReportWithFilterAndBasicCollection() throws Exception { expectedColumns = 2; expectedRow = 2; - super.test017CreateObjectCollectionReportWithFilterAndBasicCollection(); + super.test114CreateObjectCollectionReportWithFilterAndBasicCollection(); + } + + @Test + public void test115CreateObjectCollectionReportWithCondition() throws Exception { + expectedColumns = 6; + expectedRow = 2; + super.test115CreateObjectCollectionReportWithCondition(); } private void setExpectedValueForDashboardReport() { @@ -115,10 +129,14 @@ protected ExportConfigurationType getExportConfiguration() { protected List basicCheckOutputFile(PrismObject report) throws IOException, SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException { List lines = super.basicCheckOutputFile(report); - if (lines.size() != expectedRow) { + if (expectedRow != -1 && lines.size() != expectedRow) { fail("Unexpected count of rows of csv report. Expected: " + expectedRow + ", Actual: " + lines.size()); } + if (expectedRow == -1 && lines.size() < 2) { + fail("Unexpected count of rows of csv report. Expected: more as one, Actual: " + lines.size()); + } + int actualColumns = getNumberOfColumns(lines); if (actualColumns != expectedColumns) { diff --git a/model/report-impl/src/test/resources/common/object-collection-all-user-with-condition.xml b/model/report-impl/src/test/resources/common/object-collection-all-user-with-condition.xml new file mode 100644 index 00000000000..16e36027502 --- /dev/null +++ b/model/report-impl/src/test/resources/common/object-collection-all-user-with-condition.xml @@ -0,0 +1,24 @@ + + + + All users with condition + UserType + + + + + + + diff --git a/model/report-impl/src/test/resources/common/object-collection-audit-records-with-condition.xml b/model/report-impl/src/test/resources/common/object-collection-audit-records-with-condition.xml new file mode 100644 index 00000000000..68d6eb07898 --- /dev/null +++ b/model/report-impl/src/test/resources/common/object-collection-audit-records-with-condition.xml @@ -0,0 +1,25 @@ + + + + Audit records with condition + + select * from m_audit_event as aer where aer.eventStage=1 + P1D + + + + + + diff --git a/model/report-impl/src/test/resources/reports/report-audit-collection-with-condition.xml b/model/report-impl/src/test/resources/reports/report-audit-collection-with-condition.xml new file mode 100644 index 00000000000..2afc4f3c14f --- /dev/null +++ b/model/report-impl/src/test/resources/reports/report-audit-collection-with-condition.xml @@ -0,0 +1,16 @@ + + + + Audit Collection report with condition + collection + + + + + + diff --git a/model/report-impl/src/test/resources/reports/report-object-collection-with-condition.xml b/model/report-impl/src/test/resources/reports/report-object-collection-with-condition.xml new file mode 100644 index 00000000000..73c3e5d5e5f --- /dev/null +++ b/model/report-impl/src/test/resources/reports/report-object-collection-with-condition.xml @@ -0,0 +1,16 @@ + + + + Object Collection report with condition + collection + + + + + +