diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java index cea15541617..79b2ce93b82 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.web.page.admin.configuration.*; import com.evolveum.midpoint.web.page.admin.home.PageDashboard; import com.evolveum.midpoint.web.page.admin.reports.PageCreatedReports; +import com.evolveum.midpoint.web.page.admin.reports.PageNewReport; import com.evolveum.midpoint.web.page.admin.reports.PageReports; import com.evolveum.midpoint.web.page.admin.resources.PageResourceEdit; import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard; @@ -151,6 +152,7 @@ private MenuBarItem createResourcesItems() { private MenuBarItem createReportsItems() { MenuBarItem reports = new MenuBarItem(createStringResource("PageAdmin.menu.top.reports"), null); + reports.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.reports.new"), PageNewReport.class)); reports.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.reports.list"), PageReports.class)); reports.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.reports.created"), PageCreatedReports.class)); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties index 692785368dc..45af489a49a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties @@ -101,6 +101,7 @@ PageAdmin.menu.top.serverTasks=Server tasks PageAdmin.menu.top.serverTasks.list=List tasks PageAdmin.menu.top.serverTasks.new=New task PageAdmin.menu.top.reports=Reports +PageAdmin.menu.top.reports.new= New report PageAdmin.menu.top.reports.list=Reports PageAdmin.menu.top.reports.created=Created reports PageAdmin.menu.top.configuration=Configuration diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java index d22069ca29f..826c0aabf90 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java @@ -303,9 +303,9 @@ public void savePerformed(AjaxRequestTarget target) { } //quick fix for now (MID-1910), maybe it should be somewhere in model.. - if (isReport(oldObject)){ - ReportTypeUtil.applyConfigurationDefinition((PrismObject)newObject, delta, getPrismContext()); - } +// if (isReport(oldObject)){ +// ReportTypeUtil.applyConfigurationDefinition((PrismObject)newObject, delta, getPrismContext()); +// } Collection> deltas = (Collection) MiscUtil.createCollection(delta); ModelExecuteOptions options = new ModelExecuteOptions(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.html new file mode 100644 index 00000000000..66f55d86714 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.html @@ -0,0 +1,64 @@ + + + + + + +
+ +
+ + +
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+ + +
+ + +

+
+
+ + + +
+ + \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.java new file mode 100644 index 00000000000..d31e8395c18 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.java @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2010-2013 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.web.page.admin.reports; + +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; +import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; +import com.evolveum.midpoint.prism.query.*; +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.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.AceEditor; +import com.evolveum.midpoint.web.component.AjaxSubmitButton; +import com.evolveum.midpoint.web.component.BasicSearchPanel; +import com.evolveum.midpoint.web.component.data.ObjectDataProvider; +import com.evolveum.midpoint.web.component.data.TablePanel; +import com.evolveum.midpoint.web.component.data.column.DoubleButtonColumn; +import com.evolveum.midpoint.web.component.data.column.LinkColumn; +import com.evolveum.midpoint.web.component.util.LoadableModel; +import com.evolveum.midpoint.web.component.util.SelectableBean; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.page.admin.configuration.PageAdminConfiguration; +import com.evolveum.midpoint.web.page.admin.configuration.component.ImportOptionsPanel; +import com.evolveum.midpoint.web.page.admin.reports.component.AceEditorPanel; +import com.evolveum.midpoint.web.page.admin.reports.component.RunReportPopupPanel; +import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportParameterDto; +import com.evolveum.midpoint.web.page.admin.reports.dto.ReportSearchDto; +import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignablePopupContent; +import com.evolveum.midpoint.web.page.admin.users.component.AssignableRolePopupContent; +import com.evolveum.midpoint.web.security.MidPointApplication; +import com.evolveum.midpoint.web.security.WebApplicationConfiguration; +import com.evolveum.midpoint.web.session.ReportsStorage; +import com.evolveum.midpoint.web.util.Base64Model; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.input.ReaderInputStream; +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.Component; +import org.apache.wicket.Page; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; +import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; +import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; +import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.CheckBox; +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.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.file.File; + +import java.io.DataInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Serializable; +import java.io.StringReader; +import java.util.*; + +/** + * @author lazyman + */ +@PageDescriptor(url = "/admin/reports/create", action = { + @AuthorizationAction(actionUri = PageAdminReports.AUTH_REPORTS_ALL, + label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, + description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.NS_AUTHORIZATION + "#reportCreate", + label = "PageNewReport.auth.reports.label", + description = "PageNewReport.auth.reports.description")}) +public class PageNewReport extends PageAdminReports { + + private static final Trace LOGGER = TraceManager.getTrace(PageNewReport.class); + + private static final String ID_MAIN_FORM = "mainForm"; + private static final String ID_BUTTON_BAR = "buttonBar"; + 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 String OPERATION_IMPORT_REPORT_XML = "Import Report from XML"; + private static final String OPERATION_IMPORT_REPORT = "Import Report from file"; + + private static final Integer INPUT_FILE = 1; + private static final Integer INPUT_XML = 2; + + private Model xmlEditorModel; + + public PageNewReport() { + xmlEditorModel = new Model(null); + + initLayout(); + } + + private void initLayout() { + Form mainForm = new Form(ID_MAIN_FORM); + add(mainForm); + + 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("PageNewReport.button.import")) { + + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + importReportFromFilePerformed(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("PageNewReport.button.import")) { + + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + importReportFromStreamPerformed(target); + } + + @Override + protected void onError(AjaxRequestTarget target, Form form) { + target.add(getFeedbackPanel()); + } + }; + addVisibileForInputType(saveXmlButton, INPUT_XML, inputType); + buttonBar.add(saveXmlButton); + } + + private void importReportFromFilePerformed(AjaxRequestTarget target) { + OperationResult result = new OperationResult(OPERATION_IMPORT_REPORT); + + 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("PageNewReport.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"); +// reader. + stream = new ReaderInputStream(reader, reader.getEncoding()); + byte[] reportIn = IOUtils.toByteArray(stream); + + setResponsePage(new PageReport(new ReportDto(Base64.encodeBase64(reportIn)))); + } 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 importReportFromStreamPerformed(AjaxRequestTarget target) { + String xml = xmlEditorModel.getObject(); + if (StringUtils.isEmpty(xml)) { + error(getString("PageNewReport.message.emptyXml")); + target.add(getFeedbackPanel()); + + return; + } + + OperationResult result = new OperationResult(OPERATION_IMPORT_REPORT_XML); + InputStream stream = null; + try { + + setResponsePage(new PageReport(new ReportDto(Base64.encodeBase64(xml.getBytes())))); + } 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()); + } +} \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.properties new file mode 100644 index 00000000000..5b97a5fc372 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageNewReport.properties @@ -0,0 +1,24 @@ +# +# Copyright (c) 2010-2013 Evolveum +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +page.title=Import Jasper report +page.subTitle=to midPoint +PageNewReport.getObjectsFrom=Create report from +PageNewReport.file=File +PageNewReport.embeddedEditor=Embedded editor +PageNewReport.button.import=Import report +PageNewReport.message.nullFile=Uploaded file is null. +PageNewReport.message.emptyXml=Can't save empty xml. +PageNewReport.message.help=Choose Xml file for import. \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java index a7283243537..502fab7c334 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReport.java @@ -99,13 +99,26 @@ protected ReportDto load() { initLayout(); } + + public PageReport(final ReportDto reportDto) { + model = new LoadableModel(reportDto, false) { + + @Override + protected ReportDto load() { + // never called + return reportDto; + } + + }; + initLayout(); + } private ReportDto loadReport() { StringValue reportOid = getPageParameters().get(OnePageParameterEncoder.PARAMETER); OperationResult result = new OperationResult(OPERATION_LOAD_REPORT); PrismObject prismReport = WebModelUtils.loadObject(ReportType.class, reportOid.toString(), result, this); - + if (prismReport == null) { LOGGER.error("Couldn't load report."); throw new RestartResponseException(PageReports.class); @@ -292,13 +305,23 @@ protected void onSavePerformed(AjaxRequestTarget target) { //TODO TODO TODO PrismObject newReport = model.getObject().getObject(); - PrismObject oldReport = WebModelUtils.loadObject(ReportType.class, newReport.getOid(), - result, this); - - if (oldReport != null) { - ObjectDelta delta = oldReport.diff(newReport); - getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), null, task, result); - } + ObjectDelta delta = null; + if (newReport.getOid() == null) { + getPrismContext().adopt(newReport); + delta = ObjectDelta.createAddDelta(newReport); + delta.setPrismContext(getPrismContext()); + } else { + PrismObject oldReport = WebModelUtils.loadObject(ReportType.class, + newReport.getOid(), result, this); + + if (oldReport != null) { + delta = oldReport.diff(newReport); + } + } + if (delta != null) { + getModelService() + .executeChanges(WebMiscUtil.createDeltaCollection(delta), null, task, result); + } } catch (Exception e) { result.recordFatalError("Couldn't save report.", e); } finally { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.html index 533814640d4..6b71e9f4cf2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.html @@ -19,6 +19,8 @@ +
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java index 223cc7c3f5e..46a8d36cb74 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.web.page.admin.reports; +import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; @@ -34,7 +35,12 @@ import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.page.admin.configuration.PageAdminConfiguration; +import com.evolveum.midpoint.web.page.admin.reports.component.RunReportPopupPanel; +import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportParameterDto; import com.evolveum.midpoint.web.page.admin.reports.dto.ReportSearchDto; +import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignablePopupContent; +import com.evolveum.midpoint.web.page.admin.users.component.AssignableRolePopupContent; import com.evolveum.midpoint.web.session.ReportsStorage; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -42,6 +48,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; +import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; @@ -53,6 +60,7 @@ import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; +import java.io.Serializable; import java.util.*; /** @@ -78,6 +86,8 @@ public class PageReports extends PageAdminReports { private static final String ID_SEARCH_FORM = "searchForm"; private static final String ID_BASIC_SEARCH = "basicSearch"; private static final String ID_SUBREPORTS = "subReportCheckbox"; + + public static final String MODAL_ID_RUN_REPORT = "runReportPopup"; private IModel searchModel; @@ -125,6 +135,8 @@ private void initLayout() { table.setShowPaging(false); table.setOutputMarkupId(true); mainForm.add(table); + + initRunReportModal(); } private void initSearchForm(Form searchForm){ @@ -214,7 +226,7 @@ public String getFirstColorCssClass(){ @Override public void firstClicked(AjaxRequestTarget target, IModel> model){ - runReportPerformed(target, model.getObject().getValue()); + showRunReportPopup(target, model.getObject().getValue()); } @Override @@ -238,13 +250,18 @@ private void reportTypeFilterPerformed(AjaxRequestTarget target, String oid){ setResponsePage(new PageCreatedReports(params, PageReports.this)); } - private void runReportPerformed(AjaxRequestTarget target, ReportType report){ - LOGGER.debug("Run report performed for {}", new Object[]{report.asPrismObject()}); +// @Override + protected void runReportPerformed(AjaxRequestTarget target, ReportType report, List paramsMap){ + + ModalWindow window = (ModalWindow) get(MODAL_ID_RUN_REPORT); + window.close(target); + LOGGER.debug("Run report performed for {}", new Object[]{report.asPrismObject()}); OperationResult result = new OperationResult(OPERATION_RUN_REPORT); try { + Task task = createSimpleTask(OPERATION_RUN_REPORT); - getReportManager().runReport(report.asPrismObject(), task, result); + getReportManager().runReport(report.asPrismObject(), paramsMap, task, result); } catch (Exception ex) { result.recordFatalError(ex); } finally { @@ -252,7 +269,7 @@ private void runReportPerformed(AjaxRequestTarget target, ReportType report){ } showResult(result); - target.add(getFeedbackPanel()); + target.add(getFeedbackPanel(), get(createComponentPath(ID_MAIN_FORM))); } private void configurePerformed(AjaxRequestTarget target, ReportType report){ @@ -333,4 +350,32 @@ private void clearSearchPerformed(AjaxRequestTarget target){ target.add(get(ID_SEARCH_FORM)); target.add(panel); } + + private void initRunReportModal() { + ModalWindow window = createModalWindow(MODAL_ID_RUN_REPORT, + createStringResource("Run report"), 1100, 560); + window.setContent(new RunReportPopupPanel(window.getContentId()){ + + @Override + protected void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType, List params){ + runReportPerformed(target, reportType, params); + } + }); + add(window); + } + + private void showRunReportPopup(AjaxRequestTarget target, ReportType reportType) { + ModalWindow modal = (ModalWindow) get(MODAL_ID_RUN_REPORT); + RunReportPopupPanel content = (RunReportPopupPanel) modal.get(modal.getContentId()); +// ReportDto reportDto = new ReportDto() + content.setReportType(reportType); +// ModalWindow window = (ModalWindow) get(MODAL_ID_RUN_REPORT); + modal.show(target); + target.add(getFeedbackPanel()); +// showModalWindow(MODAL_ID_RUN_REPORT, target); +// target.add(getFeedbackPanel()); + } + + + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/JasperReportConfigurationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/JasperReportConfigurationPanel.java index 3b4ec479b54..82c32822faa 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/JasperReportConfigurationPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/JasperReportConfigurationPanel.java @@ -8,11 +8,14 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.behavior.Behavior; +import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.FormComponent; +import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.validation.IValidatable; @@ -20,7 +23,9 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.TablePanel; +import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn; import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; +import com.evolveum.midpoint.web.component.data.column.CheckBoxPanel; import com.evolveum.midpoint.web.component.data.column.EditableLinkColumn; import com.evolveum.midpoint.web.component.input.TextPanel; import com.evolveum.midpoint.web.component.util.ListDataProvider; @@ -105,8 +110,8 @@ private void initFiledsTable(){ Label filedTitle = new Label(ID_FIELDS_TITLE, JasperReportConfigurationPanel.this.createStringResource("Report fields")); add(filedTitle); ISortableDataProvider provider = new ListDataProvider(this, - new PropertyModel>(getModel(), "jasperReportDto.fields")); - TablePanel table = new TablePanel<>(ID_FIELDS_TABLE, provider, initParameterColumns()); + new PropertyModel>(getModel(), "jasperReportDto.fields")); + TablePanel table = new TablePanel<>(ID_FIELDS_TABLE, provider, initFieldColumns()); table.setOutputMarkupId(true); table.setShowPaging(true); add(table); @@ -228,6 +233,22 @@ public void onClick(AjaxRequestTarget target, IModel r } }); + + CheckBoxColumn forPrompting = new CheckBoxColumn(createStringResource("For prompting"), "forPrompting") { + + @Override + public void populateItem(Item> cellItem, + String componentId, IModel rowModel) { + // TODO Auto-generated method stub + CheckBoxPanel checkBox = new CheckBoxPanel(componentId, new PropertyModel(rowModel, getPropertyExpression()), new PropertyModel(rowModel, getPropertyExpression())); + cellItem.add(checkBox); + } + + }; + + + columns.add(forPrompting); + return columns; } private void parameterEditPerformed(AjaxRequestTarget target, IModel rowModel) { @@ -241,7 +262,7 @@ private TablePanel getParametersTable() { return (TablePanel) get(ID_PARAMETERS_TABLE); } - private List> initFiledColumns() { + private List> initFieldColumns() { List> columns = new ArrayList<>(); IColumn column = new CheckBoxHeaderColumn(); columns.add(column); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java index 5ea5127dac4..83114b68c2a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java @@ -1,86 +1,42 @@ package com.evolveum.midpoint.web.page.admin.reports.component; -import java.io.Serializable; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; -import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; -import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; -import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; -import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.form.DropDownChoice; -import org.apache.wicket.markup.html.form.EnumChoiceRenderer; -import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; -import org.apache.wicket.markup.html.form.IChoiceRenderer; -import org.apache.wicket.markup.html.list.ListItem; -import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; -import com.evolveum.midpoint.model.common.expression.ExpressionUtil; -import com.evolveum.midpoint.model.common.expression.ExpressionVariables; -import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.parser.QueryConvertor; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.TypeFilter; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.web.component.AjaxButton; -import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.component.DateInput; import com.evolveum.midpoint.web.component.data.TablePanel; -import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; -import com.evolveum.midpoint.web.component.data.column.EditableLinkColumn; import com.evolveum.midpoint.web.component.data.column.EditablePropertyColumn; -import com.evolveum.midpoint.web.component.form.DateFormGroup; -import com.evolveum.midpoint.web.component.form.DropDownFormGroup; -import com.evolveum.midpoint.web.component.form.TextAreaFormGroup; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; import com.evolveum.midpoint.web.component.input.TextPanel; -import com.evolveum.midpoint.web.component.prism.InputPanel; -import com.evolveum.midpoint.web.component.prism.PrismPropertyPanel; -import com.evolveum.midpoint.web.component.prism.PropertyWrapper; import com.evolveum.midpoint.web.component.util.ListDataProvider; import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.component.util.SimplePanel; import com.evolveum.midpoint.web.component.util.XmlGregorianCalendarModel; -import com.evolveum.midpoint.web.page.admin.reports.PageReports; import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportParameterDto; import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto; -import com.evolveum.midpoint.web.page.admin.users.component.AssignableRolePopupContent; import com.evolveum.midpoint.web.util.WebMiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; public class RunReportPopupPanel extends SimplePanel{ @@ -146,11 +102,11 @@ private List> initParameterColumns() { //name editing column - columns.add(new PropertyColumn(createStringResource("Parameter name"), "name")); - columns.add(new PropertyColumn(createStringResource("Parameter class"), "typeAsString")); + columns.add(new PropertyColumn(createStringResource("runReportPopupContent.param.name"), "name")); + columns.add(new PropertyColumn(createStringResource("runReportPopupContent.param.class"), "typeAsString")); //class editing column - columns.add(new EditablePropertyColumn(createStringResource("Parameter value"), "value") { + columns.add(new EditablePropertyColumn(createStringResource("runReportPopupContent.param.value"), "value") { @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.properties new file mode 100644 index 00000000000..36bd98ab5ea --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.properties @@ -0,0 +1,22 @@ +# +# Copyright (c) 2010-2013 Evolveum +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +RunReportPopupPanel.title=Report configuration before run + +runReportPopupContent.button.run=Run report +runReportPopupContent.param.name=Parameter name +runReportPopupContent.param.class=Parameter class +runReportPopupContent.param.value=Parameter value \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportDto.java index de7e47a3870..2fa1b9f3757 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportDto.java @@ -31,13 +31,17 @@ public class JasperReportDto implements Serializable{ private byte[] jasperReportXml; - public JasperReportDto(byte[] jasperReportxml) { + public JasperReportDto(byte[] jasperReportxml, boolean onlyForPromptingParams) { this.jasperReportXml = jasperReportxml; - initFileds(); + initFileds(onlyForPromptingParams); } - private void initFileds(){ + public JasperReportDto(byte[] jasperReportxml) { + this(jasperReportxml, false); + } + + private void initFileds(boolean onlyForPromptingParams){ if (jasperReportXml == null){ return; } @@ -60,7 +64,10 @@ private void initFileds(){ if (parameter.isSystemDefined()){ continue; } - parameters.add(new JasperReportParameterDto(parameter.getName(), parameter.getValueClass(), parameter.getValueClassName())); + if (onlyForPromptingParams && !parameter.isForPrompting()){ + continue; + } + parameters.add(new JasperReportParameterDto(parameter.getName(), parameter.getValueClass(), parameter.getValueClassName(), parameter.isForPrompting())); } for (JasperReportParameterDto param : parameters){ @@ -92,8 +99,16 @@ public List getFields() { return fields; } + + public String getQuery() { + return query; + } + public byte[] getTemplate(){ try{ +// design.remadgetFields(). + design.getFieldsList().clear(); + design.getParametersList().clear(); for (JasperReportFieldDto field : fields){ if (field.isEmpty()){ continue; @@ -113,9 +128,11 @@ public byte[] getTemplate(){ p.setValueClassName(param.getTypeAsString()); p.setValueClass(Class.forName(param.getTypeAsString())); p.setName(param.getName()); + p.setForPrompting(param.isForPrompting()); design.addParameter(p); } + JasperDesign oldDesign = ReportTypeUtil.loadJasperDesign(jasperReportXml); oldDesign.getParametersList().clear(); oldDesign.getParametersList().addAll(design.getParametersList()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportParameterDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportParameterDto.java index 5341abd6ae9..39e718d81c2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportParameterDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/JasperReportParameterDto.java @@ -14,16 +14,40 @@ public class JasperReportParameterDto extends Selectable implements Serializable private Class type; private String typeAsString; + private boolean forPrompting = false; + private Object value; + private boolean editing; public JasperReportParameterDto() { // TODO Auto-generated constructor stub } - public JasperReportParameterDto(String name, Class type, String typeAsString) { + public JasperReportParameterDto(String name, Class type, String typeAsString, boolean forPrompting) { this.name = name; this.typeAsString = typeAsString; this.type = type; + this.forPrompting = forPrompting; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public boolean isForPrompting() { + return forPrompting; + } + + public void setForPrompting(boolean forPrompting) { + this.forPrompting = forPrompting; + } + + public boolean getForPrompting(){ + return forPrompting; } public String getName() { @@ -34,7 +58,14 @@ public String getTypeAsString() { return typeAsString; } - public Class getType() { + public Class getType() throws ClassNotFoundException { + if (type == null){ + if (StringUtils.isNotBlank(typeAsString)){ + type = Class.forName(typeAsString); + } else { + type = Object.class; + } + } return type; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/ReportDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/ReportDto.java index 450740741bc..39fa0620860 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/ReportDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/dto/ReportDto.java @@ -55,18 +55,26 @@ public class ReportDto implements Serializable { public ReportDto() { } - public ReportDto(ReportType reportType){ + public ReportDto(byte[] reportJrxml) { + this.jasperReportDto = new JasperReportDto(reportJrxml); + } + + public ReportDto(ReportType reportType, boolean onlyForPromptingParams) { this.oid = reportType.getOid(); this.name = reportType.getName().getOrig(); this.exportType = reportType.getExport(); this.searchOnResource = false; this.description = reportType.getDescription(); // this.xml = new String(Base64.decodeBase64(reportType.getTemplate())); - this.jasperReportDto = new JasperReportDto(reportType.getTemplate()); + this.jasperReportDto = new JasperReportDto(reportType.getTemplate(), onlyForPromptingParams); this.templateStyle = reportType.getTemplateStyle(); this.parent = reportType.isParent(); this.reportType = reportType; } + + public ReportDto(ReportType reportType){ + this(reportType, false); + } public ReportDto(String name, String description) { this.description = description; @@ -92,11 +100,17 @@ public void setParent(boolean parent) { } public PrismObject getObject() { + if (reportType == null){ + reportType = new ReportType(); + //TODO FIXME temporary every new report will be set as parent report + reportType.setParent(Boolean.TRUE); + } reportType.setName(new PolyStringType(name)); reportType.setExport(exportType); reportType.setTemplate(jasperReportDto.getTemplate()); reportType.setTemplateStyle(templateStyle); reportType.setDescription(description); + return reportType.asPrismObject(); } diff --git a/gui/admin-gui/src/main/webapp/WEB-INF/descriptor.xml b/gui/admin-gui/src/main/webapp/WEB-INF/descriptor.xml index 4c35f4b8aef..a31d6034217 100644 --- a/gui/admin-gui/src/main/webapp/WEB-INF/descriptor.xml +++ b/gui/admin-gui/src/main/webapp/WEB-INF/descriptor.xml @@ -111,6 +111,10 @@ PageAdmin.menu.top.reports 70 + + PageAdmin.menu.top.reports.new + com.evolveum.midpoint.web.page.admin.reports.PageNewReport + PageAdmin.menu.top.reports.list com.evolveum.midpoint.web.page.admin.reports.PageReports diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java index 2d8105d8d44..6fb3e251e47 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/PrismBeanConverter.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.prism.xnode.ListXNode; import com.evolveum.midpoint.prism.xnode.MapXNode; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.SchemaXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.util.DOMUtil; @@ -114,6 +115,17 @@ public T unmarshall(MapXNode xnode, QName typeQName) throws SchemaException Class classType = getSchemaRegistry().determineCompileTimeClass(typeQName); return unmarshall(xnode, classType); } + + public T unmarshall(XNode xnode, Class beanClass) throws SchemaException{ + if (xnode instanceof PrimitiveXNode){ + return unmarshallPrimitive((PrimitiveXNode) xnode, beanClass); + } else if (xnode instanceof MapXNode){ + return unmarshall((MapXNode) xnode, beanClass); + } else if (xnode instanceof RootXNode){ + return unmarshall(((RootXNode) xnode).getSubnode(), beanClass); + } else + throw new IllegalStateException("Unexpected xnode " + xnode +". Could not unmarshall value"); + } public T unmarshall(MapXNode xnode, Class beanClass) throws SchemaException { diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java index ed2deaed5ec..1a639ffd12c 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java @@ -143,6 +143,7 @@ private void registerBuiltinSchemas(SchemaRegistry schemaRegistry) throws Schema com.evolveum.midpoint.xml.ns._public.connector.icf_1.resource_schema_3.ObjectFactory.class.getPackage(), true); // declared by default schemaRegistry.registerPrismSchemaResource("xml/ns/public/model/extension-3.xsd", "mext"); + schemaRegistry.registerPrismSchemaResource("xml/ns/public/report/extension-3.xsd", "rext"); schemaRegistry.registerPrismSchemaResource("xml/ns/public/model/context/model-context-3.xsd", "mctx", com.evolveum.midpoint.xml.ns._public.model.model_context_3.ObjectFactory.class.getPackage()); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index 2eedcb1995e..ae0872f4273 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -71,6 +71,7 @@ public abstract class SchemaConstants { public static final QName C_OBJECT_REF = new QName(NS_C, "objectRef"); public static final QName C_VALUE = new QName(NS_C, "value"); public static final QName C_PARAM_VALUE = new QName(NS_C, "paramValue"); + public static final QName C_REPORT_PARAM_VALUE = new QName(NS_C, "reportParamValue"); public static final QName C_OID_ATTRIBUTE = new QName(NS_C, "oid"); public static final QName C_USER_TYPE = new QName(NS_C, "UserType"); public static final QName C_TASK_TYPE = new QName(NS_C, "TaskType"); @@ -154,6 +155,8 @@ public abstract class SchemaConstants { public static final String NS_MODEL = NS_MIDPOINT_PUBLIC + "/model"; public static final String NS_MODEL_WS = NS_MODEL + "/model-3"; + + public static final String NS_REPORT = NS_MIDPOINT_PUBLIC + "/report"; public static final String NS_MODEL_CHANNEL = NS_MODEL + "/channels-3"; public static final QName CHANNEL_WEB_SERVICE_QNAME = new QName(NS_MODEL_CHANNEL, "webService"); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java index 95f9af31a29..56ac1403d98 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java @@ -22,6 +22,7 @@ import javax.xml.bind.JAXBElement; import com.evolveum.midpoint.prism.util.CloneUtil; + import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.w3c.dom.Document; @@ -30,6 +31,7 @@ import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.util.ParamsTypeUtil; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; @@ -929,29 +931,29 @@ public static OperationResult createOperationResult(OperationResultType result) return null; } - Map params = null; - if (result.getParams() != null) { - params = new HashMap(); - for (EntryType entry : result.getParams().getEntry()) { - params.put(entry.getKey(), (Serializable) entry.getEntryValue()); - } - } + Map params = ParamsTypeUtil.fromParamsType(result.getParams()); +// if (result.getParams() != null) { +// params = new HashMap(); +// for (EntryType entry : result.getParams().getEntry()) { +// params.put(entry.getKey(), (Serializable) entry.getEntryValue()); +// } +// } - Map context = null; - if (result.getContext() != null) { - context = new HashMap(); - for (EntryType entry : result.getContext().getEntry()) { - context.put(entry.getKey(), (Serializable) entry.getEntryValue()); - } - } + Map context = ParamsTypeUtil.fromParamsType(result.getContext()); +// if (result.getContext() != null) { +// context = new HashMap(); +// for (EntryType entry : result.getContext().getEntry()) { +// context.put(entry.getKey(), (Serializable) entry.getEntryValue()); +// } +// } - Map returns = null; - if (result.getReturns() != null) { - returns = new HashMap(); - for (EntryType entry : result.getReturns().getEntry()) { - returns.put(entry.getKey(), (Serializable) entry.getEntryValue()); - } - } + Map returns = ParamsTypeUtil.fromParamsType(result.getReturns()); +// if (result.getReturns() != null) { +// returns = new HashMap(); +// for (EntryType entry : result.getReturns().getEntry()) { +// returns.put(entry.getKey(), (Serializable) entry.getEntryValue()); +// } +// } List subresults = null; if (!result.getPartialResults().isEmpty()) { @@ -1020,35 +1022,35 @@ private OperationResultType createOperationResultType(OperationResult opResult) result.setLocalizedMessage(message); } - Set> params = opResult.getParams().entrySet(); - if (!params.isEmpty()) { - ParamsType paramsType = new ParamsType(); +// Set> params = opResult.getParams(); +// if (!params.isEmpty()) { + ParamsType paramsType = ParamsTypeUtil.toParamsType(opResult.getParams()); result.setParams(paramsType); - for (Entry entry : params) { - paramsType.getEntry().add(createEntryElement(entry.getKey(),entry.getValue())); - } - } +// for (Entry entry : params) { +// paramsType.getEntry().add(createEntryElement(entry.getKey(),entry.getValue())); +// } +// } - Set> context = opResult.getContext().entrySet(); - if (!context.isEmpty()) { - ParamsType paramsType = new ParamsType(); +// Set> context = opResult.getContext().entrySet(); +// if (!context.isEmpty()) { + paramsType = ParamsTypeUtil.toParamsType(opResult.getContext()); result.setContext(paramsType); - for (Entry entry : context) { - paramsType.getEntry().add(createEntryElement(entry.getKey(),entry.getValue())); - } - } +// for (Entry entry : context) { +// paramsType.getEntry().add(createEntryElement(entry.getKey(),entry.getValue())); +// } +// } - Set> returns = opResult.getReturns().entrySet(); - if (!returns.isEmpty()) { - ParamsType paramsType = new ParamsType(); +// Set> returns = opResult.getReturns().entrySet(); +// if (!returns.isEmpty()) { + paramsType = ParamsTypeUtil.toParamsType(opResult.getReturns()); result.setReturns(paramsType); - for (Entry entry : returns) { - paramsType.getEntry().add(createEntryElement(entry.getKey(),entry.getValue())); - } - } +// for (Entry entry : returns) { +// paramsType.getEntry().add(createEntryElement(entry.getKey(),entry.getValue())); +// } +// } for (OperationResult subResult : opResult.getSubresults()) { result.getPartialResults().add(opResult.createOperationResultType(subResult)); @@ -1057,71 +1059,71 @@ private OperationResultType createOperationResultType(OperationResult opResult) return result; } - /** - * Temporary workaround, brutally hacked -- so that the conversion - * of OperationResult into OperationResultType 'somehow' works, at least to the point - * where when we: - * - have OR1 - * - serialize it into ORT1 - * - then deserialize into OR2 - * - serialize again into ORT2 - * so we get ORT1.equals(ORT2) - at least in our simple test case :) - * - * FIXME: this should be definitely reworked - * - * @param entry - * @return - */ - private EntryType createEntryElement(String key, Serializable value) { - EntryType entryType = new EntryType(); - entryType.setKey(key); - if (value != null) { - Document doc = DOMUtil.getDocument(); - if (value instanceof ObjectType && ((ObjectType)value).getOid() != null) { - // Store only reference on the OID. This is faster and getObject can be used to retrieve - // the object if needed. Although is does not provide 100% accuracy, it is a good tradeoff. - setObjectReferenceEntry(entryType, ((ObjectType)value)); - // these values should be put 'as they are', in order to be deserialized into themselves - } else if (value instanceof String || value instanceof Integer || value instanceof Long) { - entryType.setEntryValue(new JAXBElement(SchemaConstants.C_PARAM_VALUE, Serializable.class, value)); - } else if (XmlTypeConverter.canConvert(value.getClass())) { -// try { -// entryType.setEntryValue(new JXmlTypeConverter.toXsdElement(value, SchemaConstants.C_PARAM_VALUE, doc, true)); -// } catch (SchemaException e) { -// LOGGER.error("Cannot convert value {} to XML: {}",value,e.getMessage()); -// setUnknownJavaObjectEntry(entryType, value); -// } - } else if (value instanceof Element || value instanceof JAXBElement) { - entryType.setEntryValue((JAXBElement) value); - // FIXME: this is really bad code ... it means that 'our' JAXB object should be put as is - } else if ("com.evolveum.midpoint.xml.ns._public.common.common_2".equals(value.getClass().getPackage().getName())) { - JAXBElement o = new JAXBElement(SchemaConstants.C_PARAM_VALUE, Object.class, value); - entryType.setEntryValue(o); - } else { - setUnknownJavaObjectEntry(entryType, value); - } - } - return entryType; - } - - private void setObjectReferenceEntry(EntryType entryType, ObjectType objectType) { - ObjectReferenceType objRefType = new ObjectReferenceType(); - objRefType.setOid(objectType.getOid()); - ObjectTypes type = ObjectTypes.getObjectType(objectType.getClass()); - if (type != null) { - objRefType.setType(type.getTypeQName()); - } - JAXBElement element = new JAXBElement( - SchemaConstants.C_OBJECT_REF, ObjectReferenceType.class, objRefType); -// entryType.setAny(element); - } - - private void setUnknownJavaObjectEntry(EntryType entryType, Serializable value) { - UnknownJavaObjectType ujo = new UnknownJavaObjectType(); - ujo.setClazz(value.getClass().getName()); - ujo.setToString(value.toString()); - entryType.setEntryValue(new ObjectFactory().createUnknownJavaObject(ujo)); - } +// /** +// * Temporary workaround, brutally hacked -- so that the conversion +// * of OperationResult into OperationResultType 'somehow' works, at least to the point +// * where when we: +// * - have OR1 +// * - serialize it into ORT1 +// * - then deserialize into OR2 +// * - serialize again into ORT2 +// * so we get ORT1.equals(ORT2) - at least in our simple test case :) +// * +// * FIXME: this should be definitely reworked +// * +// * @param entry +// * @return +// */ +// private EntryType createEntryElement(String key, Serializable value) { +// EntryType entryType = new EntryType(); +// entryType.setKey(key); +// if (value != null) { +// Document doc = DOMUtil.getDocument(); +// if (value instanceof ObjectType && ((ObjectType)value).getOid() != null) { +// // Store only reference on the OID. This is faster and getObject can be used to retrieve +// // the object if needed. Although is does not provide 100% accuracy, it is a good tradeoff. +// setObjectReferenceEntry(entryType, ((ObjectType)value)); +// // these values should be put 'as they are', in order to be deserialized into themselves +// } else if (value instanceof String || value instanceof Integer || value instanceof Long) { +// entryType.setEntryValue(new JAXBElement(SchemaConstants.C_PARAM_VALUE, Serializable.class, value)); +// } else if (XmlTypeConverter.canConvert(value.getClass())) { +//// try { +//// entryType.setEntryValue(new JXmlTypeConverter.toXsdElement(value, SchemaConstants.C_PARAM_VALUE, doc, true)); +//// } catch (SchemaException e) { +//// LOGGER.error("Cannot convert value {} to XML: {}",value,e.getMessage()); +//// setUnknownJavaObjectEntry(entryType, value); +//// } +// } else if (value instanceof Element || value instanceof JAXBElement) { +// entryType.setEntryValue((JAXBElement) value); +// // FIXME: this is really bad code ... it means that 'our' JAXB object should be put as is +// } else if ("com.evolveum.midpoint.xml.ns._public.common.common_2".equals(value.getClass().getPackage().getName())) { +// JAXBElement o = new JAXBElement(SchemaConstants.C_PARAM_VALUE, Object.class, value); +// entryType.setEntryValue(o); +// } else { +// setUnknownJavaObjectEntry(entryType, value); +// } +// } +// return entryType; +// } +// +// private void setObjectReferenceEntry(EntryType entryType, ObjectType objectType) { +// ObjectReferenceType objRefType = new ObjectReferenceType(); +// objRefType.setOid(objectType.getOid()); +// ObjectTypes type = ObjectTypes.getObjectType(objectType.getClass()); +// if (type != null) { +// objRefType.setType(type.getTypeQName()); +// } +// JAXBElement element = new JAXBElement( +// SchemaConstants.C_OBJECT_REF, ObjectReferenceType.class, objRefType); +//// entryType.setAny(element); +// } +// +// private void setUnknownJavaObjectEntry(EntryType entryType, Serializable value) { +// UnknownJavaObjectType ujo = new UnknownJavaObjectType(); +// ujo.setClazz(value.getClass().getName()); +// ujo.setToString(value.toString()); +// entryType.setEntryValue(new ObjectFactory().createUnknownJavaObject(ujo)); +// } public void summarize() { Iterator iterator = getSubresults().iterator(); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java index 2e33a02368e..f72a3ee64ff 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ReportTypeUtil.java @@ -33,6 +33,7 @@ import net.sf.jasperreports.engine.xml.JRXmlLoader; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; import org.w3c.dom.Element; import com.evolveum.midpoint.prism.Containerable; @@ -43,6 +44,7 @@ import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.schema.PrismSchema; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportConfigurationType; @@ -69,36 +71,45 @@ public static JasperDesign loadJasperDesign(byte[] template) throws SchemaExcept } } + public static JasperReport loadJasperReport(ReportType reportType) throws SchemaException{ - - if (reportType.getTemplate() == null) { - throw new IllegalStateException("Could not create report. No jasper template defined."); - } - try { -// byte[] reportTemplate = Base64.decodeBase64(reportType.getTemplate()); -// -// InputStream inputStreamJRXML = new ByteArrayInputStream(reportTemplate); - JasperDesign jasperDesign = loadJasperDesign(reportType.getTemplate());//JRXmlLoader.load(inputStreamJRXML); -// LOGGER.trace("load jasper design : {}", jasperDesign); - - if (reportType.getTemplateStyle() != null){ - JRDesignReportTemplate templateStyle = new JRDesignReportTemplate(new JRDesignExpression("$P{" + PARAMETER_TEMPLATE_STYLES + "}")); - jasperDesign.addTemplate(templateStyle); - JRDesignParameter parameter = new JRDesignParameter(); - parameter.setName(PARAMETER_TEMPLATE_STYLES); - parameter.setValueClass(JRTemplate.class); - parameter.setForPrompting(false); - jasperDesign.addParameter(parameter); - } - JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); - return jasperReport; - } catch (JRException ex){ -// LOGGER.error("Couldn't create jasper report design {}", ex.getMessage()); - throw new SchemaException(ex.getMessage(), ex.getCause()); - } + + if (reportType.getTemplate() == null) { + throw new IllegalStateException("Could not create report. No jasper template defined."); + } + try { +// byte[] reportTemplate = Base64.decodeBase64(reportType.getTemplate()); +// +// InputStream inputStreamJRXML = new ByteArrayInputStream(reportTemplate); + JasperDesign jasperDesign = loadJasperDesign(reportType.getTemplate());//JRXmlLoader.load(inputStreamJRXML); +// LOGGER.trace("load jasper design : {}", jasperDesign); + if (reportType.getTemplateStyle() != null){ + JRDesignReportTemplate templateStyle = new JRDesignReportTemplate(new JRDesignExpression("$P{" + PARAMETER_TEMPLATE_STYLES + "}")); + jasperDesign.addTemplate(templateStyle); + JRDesignParameter parameter = new JRDesignParameter(); + parameter.setName(PARAMETER_TEMPLATE_STYLES); + parameter.setValueClass(JRTemplate.class); + parameter.setForPrompting(false); + jasperDesign.addParameter(parameter); + } - } +// if (StringUtils.isNotEmpty(finalQuery)){ + JRDesignParameter parameter = new JRDesignParameter(); + parameter.setName("finalQuery"); + parameter.setValueClass(Object.class); + parameter.setForPrompting(false); + jasperDesign.addParameter(parameter); +// } + JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); + return jasperReport; + } catch (JRException ex){ +// LOGGER.error("Couldn't create jasper report design {}", ex.getMessage()); + throw new SchemaException(ex.getMessage(), ex.getCause()); + } + + +} public static PrismSchema parseReportConfigurationSchema(PrismObject report, PrismContext context) throws SchemaException { diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd index c534ac77c96..0fd18c7b68a 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd @@ -10442,6 +10442,14 @@ + + + + + + + + diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelConstants.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelConstants.java index f81ae973580..11c70d3f290 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelConstants.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelConstants.java @@ -42,5 +42,6 @@ public class ModelConstants { public static final QName INTENT_PROPERTY_NAME = new QName(ModelConstants.NS_EXTENSION, "intent"); public static final QName FILENAME_PROPERTY_NAME = new QName(ModelConstants.NS_EXTENSION, "filename"); - + + } diff --git a/model/report-api/src/main/java/com/evolveum/midpoint/report/api/ReportManager.java b/model/report-api/src/main/java/com/evolveum/midpoint/report/api/ReportManager.java index 1c32f7caedd..23498d8206f 100644 --- a/model/report-api/src/main/java/com/evolveum/midpoint/report/api/ReportManager.java +++ b/model/report-api/src/main/java/com/evolveum/midpoint/report/api/ReportManager.java @@ -21,9 +21,13 @@ import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import java.io.InputStream; +import java.io.Serializable; +import java.util.List; +import java.util.Map; /** * todo comments [lazyman] @@ -31,6 +35,7 @@ * WORK IN PROGRESS * * @author lazyman + * @author katkav */ public interface ReportManager { /** @@ -39,7 +44,7 @@ public interface ReportManager { * @param report * @param parentResult describes report which has to be created */ - void runReport(PrismObject object, Task task, OperationResult parentResult); + void runReport(PrismObject object, List params, Task task, OperationResult parentResult); /** * todo comments [lazyman] diff --git a/model/report-ds-impl/src/main/java/com/evolveum/midpoint/report/ds/impl/MidPointQueryExecutor.java b/model/report-ds-impl/src/main/java/com/evolveum/midpoint/report/ds/impl/MidPointQueryExecutor.java index d3dc88d8bd2..9f9d39999e7 100644 --- a/model/report-ds-impl/src/main/java/com/evolveum/midpoint/report/ds/impl/MidPointQueryExecutor.java +++ b/model/report-ds-impl/src/main/java/com/evolveum/midpoint/report/ds/impl/MidPointQueryExecutor.java @@ -38,19 +38,10 @@ public class MidPointQueryExecutor extends JRAbstractQueryExecuter{ private static final Trace LOGGER = TraceManager.getTrace(MidPointQueryExecutor.class); -// private PrismContext prismContext; -// private ModelService model; -// private TaskManager taskManager; -// private ExpressionFactory expressionFactory; -// private ObjectResolver objectResolver; private ObjectQuery query; private String script; private Class type; private ReportService reportService; -// private ExpressionVariables variables; -// private MidpointFunctions midpointFunctions; -// private AuditService auditService; -// private ReportFunctions reportFunctions; public String getScript() { return script; @@ -62,25 +53,22 @@ public Class getType() { return type; } -// public ExpressionVariables getVariables() { -// return variables; -// } - -// public MidPointQueryExecutor(PrismContext prismContext, TaskManager taskManager, JRDataset dataset) { -// super(null, dataset, new HashMap()); -// this.prismContext = prismContext; -// this.taskManager = taskManager; -//// this.dataset = dataset; -// -// parseQuery(); -// -// } + private Object getObjectQueryFromParameters(){ + JRParameter[] params = dataset.getParameters(); + Map expressionParameters = new HashMap(); + for (JRParameter param : params){ + if ("finalQuery".equals(param.getName())){ + return getParameterValue(param.getName()); + } + } + return null; + } private Map getParameters(){ JRParameter[] params = dataset.getParameters(); Map expressionParameters = new HashMap(); for (JRParameter param : params){ - LOGGER.info(((JRBaseParameter)param).getName()); + LOGGER.trace(((JRBaseParameter)param).getName()); Object v = getParameterValue(param.getName()); try{ expressionParameters.put(new QName(param.getName()), new PrismPropertyValue(v)); @@ -88,7 +76,7 @@ private Map getParameters(){ //just skip properties that are not important for midpoint } - LOGGER.info("p.val: {}", v); + LOGGER.trace("p.val: {}", v); } return expressionParameters; } @@ -96,22 +84,33 @@ private Map getParameters(){ @Override protected void parseQuery() { // TODO Auto-generated method stub + + + String s = dataset.getQuery().getText(); - JRBaseParameter p = (JRBaseParameter) dataset.getParameters()[0]; -// LOGGER.info("dataset param: {}", p.); + JRBaseParameter p = (JRBaseParameter) dataset.getParameters()[0]; Map expressionParameters = getParameters(); LOGGER.info("query: " + s); -// ObjectQuery q; if (StringUtils.isEmpty(s)){ query = null; } else { try { if (s.startsWith("", ""); script = normalized.replace("", ""); @@ -121,68 +120,14 @@ protected void parseQuery() { // TODO Auto-generated catch block e.printStackTrace(); } -// -// if (s.startsWith("", ""); -// script = normalized.replace("", ""); -// -// } -// -// } catch (SchemaException e) { -// throw new RuntimeException(e); -// -// } catch (ObjectNotFoundException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } catch (ExpressionEvaluationException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } } } -// private boolean containsExpression(ObjectFilter subFilter){ -// if (subFilter instanceof PropertyValueFilter){ -// return ((PropertyValueFilter) subFilter).getExpression() != null; -// } else if (subFilter instanceof InOidFilter){ -// return ((InOidFilter) subFilter).getExpression() != null; -// } -// -// return false; -// } public MidPointQueryExecutor(JasperReportsContext jasperReportsContext, JRDataset dataset, Map parametersMap, ReportService reportService){ super(jasperReportsContext, dataset, parametersMap); - - - } protected MidPointQueryExecutor(JasperReportsContext jasperReportsContext, JRDataset dataset, @@ -191,57 +136,24 @@ protected MidPointQueryExecutor(JasperReportsContext jasperReportsContext, JRDat JRFillParameter fillparam = (JRFillParameter) parametersMap.get(JRParameter.REPORT_PARAMETERS_MAP); Map reportParams = (Map) fillparam.getValue(); -// prismContext = (PrismContext) reportParams.get(MidPointQueryExecutorFactory.PARAMETER_PRISM_CONTEXT); -// taskManager = (TaskManager) reportParams.get(MidPointQueryExecutorFactory.PARAMETER_TASK_MANAGER); -// expressionFactory = (ExpressionFactory) reportParams.get(MidPointQueryExecutorFactory.PARAMETER_EXPRESSION_FACTORY); -// objectResolver = (ObjectResolver) reportParams.get(MidPointQueryExecutorFactory.PARAMETER_OBJECT_RESOLVER); -// midpointFunctions = (MidpointFunctions) reportParams.get(MidPointQueryExecutorFactory.PARAMETER_MIDPOINT_FUNCTION); -// auditService = (AuditService) reportParams.get(MidPointQueryExecutorFactory.PARAMETER_AUDIT_SERVICE); -// reportFunctions = (ReportFunctions) reportParams.get(MidPointQueryExecutorFactory.PARAMETER_REPORT_FUNCTIONS); reportService = (ReportService) parametersMap.get(ReportService.PARAMETER_REPORT_SERVICE).getValue(); - -// if (prismContext == null){ -// prismContext = (PrismContext) parametersMap.get(MidPointQueryExecutorFactory.PARAMETER_PRISM_CONTEXT).getValue(); -// taskManager = (TaskManager) parametersMap.get(MidPointQueryExecutorFactory.PARAMETER_TASK_MANAGER).getValue(); -// objectResolver = (ObjectResolver) parametersMap.get(MidPointQueryExecutorFactory.PARAMETER_OBJECT_RESOLVER).getValue(); -// expressionFactory = (ExpressionFactory) parametersMap.get(MidPointQueryExecutorFactory.PARAMETER_EXPRESSION_FACTORY).getValue(); -// midpointFunctions = (MidpointFunctions) parametersMap.get(MidPointQueryExecutorFactory.PARAMETER_MIDPOINT_FUNCTION).getValue(); -// -// } -// if (SecurityContextHolder.getContext().getAuthentication() == null){ -// Authentication principal = (Authentication) reportParams.get("principal"); -// if (principal != null){ -// SecurityContextHolder.getContext().setAuthentication(principal); -// } -// } + parseQuery(); -// TODO Auto-generated constructor stub } @Override public JRDataSource createDatasource() throws JRException { - // TODO Auto-generated method stub - - -// Task task = taskManager.createTaskInstance(); - -// OperationResult parentResult = task.getResult(); Collection> results = new ArrayList<>(); -// Class clazz = UserType.class; - try { - if (query == null && script == null){ throw new JRException("Neither query, nor script defined in the report."); } if (query != null){ results = reportService.searchObjects(query, SelectorOptions.createCollection(GetOperationOptions.createRaw())); -// results = ReportUtils.getReportData(model, type, query, task, parentResult); } else { results = reportService.evaluateScript(script, getParameters()); -// results = ReportUtils.getReportData(prismContext, task, reportFunctions, script, variables, objectResolver); } } catch (SchemaException | ObjectNotFoundException | SecurityViolationException | CommunicationException | ConfigurationException | ExpressionEvaluationException e) { diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java index 5d0f60a56d9..104c94c55a2 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java @@ -3,6 +3,7 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; +import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; @@ -12,6 +13,7 @@ import java.util.Map; import javax.annotation.PostConstruct; +import javax.xml.bind.JAXBElement; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRTemplate; @@ -36,19 +38,29 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; +import org.hibernate.param.ParameterSpecification; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.audit.api.AuditService; import com.evolveum.midpoint.model.api.ModelService; -import com.evolveum.midpoint.model.common.expression.ExpressionFactory; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.parser.XNodeSerializer; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.util.RawTypeUtil; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; +import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; +import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.report.api.ReportService; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectResolver; +import com.evolveum.midpoint.schema.util.ParamsTypeUtil; import com.evolveum.midpoint.schema.util.ReportTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskCategory; @@ -64,10 +76,14 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExportType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ParamsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportOutputType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SubreportType; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import com.evolveum.prism.xml.ns._public.types_3.RawType; @Component public class ReportCreateTaskHandler implements TaskHandler{ @@ -131,12 +147,32 @@ public TaskRunResult run(Task task) { try { ReportType parentReport = objectResolver.resolve(task.getObjectRef(), ReportType.class, null, "resolving report", result); + Map parameters = completeReport(parentReport, result); - JasperReport jasperReport = ReportTypeUtil.loadJasperReport(parentReport); + PrismProperty reportParams = task.getExtensionProperty(ReportConstants.REPORT_PARAMS_PROPERTY_NAME); + if (reportParams != null){ + List> reportParamsValues = reportParams.getValues(); - LOGGER.trace("compile jasper design, create jasper report : {}", jasperReport); - Map parameters = completeReport(parentReport, result); + for (PrismPropertyValue paramValue : reportParamsValues){ + ReportParameterType val = paramValue.getValue(); + Class clazz = Class.forName(val.getType()); + Object value = null; + if (XmlTypeConverter.canConvert(clazz)){ + value = XmlTypeConverter.toJavaValue(val.getValue(), clazz); + } else { + XNode xnode = prismContext.getParserDom().parse(val.getValue()); + value = prismContext.getBeanConverter().unmarshall(xnode, clazz); + + } + parameters.put(val.getName(), value); + } + } + + JasperReport jasperReport = ReportTypeUtil.loadJasperReport(parentReport); + LOGGER.trace("compile jasper design, create jasper report : {}", jasperReport); + + LOGGER.trace("All Report parameters : {}", parameters); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters); LOGGER.trace("fill report : {}", jasperPrint); @@ -243,13 +279,6 @@ private Map prepareReportParameters(ReportType reportType, Opera params.put(PARAMETER_REPORT_OID, reportType.getOid()); params.put(PARAMETER_OPERATION_RESULT, parentResult); params.put(ReportService.PARAMETER_REPORT_SERVICE, reportService); -// params.put(MidPointQueryExecutorFactory.PARAMETER_MIDPOINT_CONNECTION, modelService); -// params.put(MidPointQueryExecutorFactory.PARAMETER_PRISM_CONTEXT, prismContext); -// params.put(MidPointQueryExecutorFactory.PARAMETER_TASK_MANAGER, taskManager); -// params.put(MidPointQueryExecutorFactory.PARAMETER_EXPRESSION_FACTORY, expressionFactory); -// params.put(MidPointQueryExecutorFactory.PARAMETER_AUDIT_SERVICE, auditService); -// ReportFunctions reportFunctions = new ReportFunctions(prismContext, modelService, taskManager, auditService); -// params.put(MidPointQueryExecutorFactory.PARAMETER_REPORT_FUNCTIONS, reportFunctions); return params; } diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java index 723ebaa2679..82d4b809c0e 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportManagerImpl.java @@ -19,11 +19,13 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; +import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Map; import javax.annotation.PostConstruct; import javax.xml.datatype.Duration; @@ -53,6 +55,8 @@ import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.LessFilter; @@ -65,6 +69,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.schema.util.ParamsTypeUtil; import com.evolveum.midpoint.schema.util.ReportTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskManager; @@ -81,6 +86,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportOutputType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ThreadStopActionType; @@ -150,10 +156,24 @@ private boolean isRaw(Collection> options) */ @Override - public void runReport(PrismObject object, Task task, OperationResult parentResult) { + public void runReport(PrismObject object, List params, Task task, OperationResult parentResult) { task.setHandlerUri(ReportCreateTaskHandler.REPORT_CREATE_TASK_URI); task.setObjectRef(object.getOid(), ReportType.COMPLEX_TYPE); - + try { + if (params != null && !params.isEmpty()){ + PrismPropertyDefinition propertyDef = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(ReportConstants.REPORT_PARAMS_PROPERTY_NAME); + PrismProperty paramProperty = propertyDef.instantiate(); + for (ReportParameterType reportParam : params){ + paramProperty.addRealValue(reportParam); + } + + task.addExtensionProperty(paramProperty); + + } + } catch (SchemaException e) { + throw new SystemException(e); + } + task.setThreadStopAction(ThreadStopActionType.CLOSE); task.makeSingle(); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java index 0b2fa7beb4e..9fdd57b52b3 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java @@ -88,8 +88,8 @@ public ObjectQuery parseQuery(String query, Map parameters) throw } ObjectFilter subFilter = ((TypeFilter) f).getFilter(); - if (subFilter instanceof PropertyValueFilter || subFilter instanceof InOidFilter){ - if (containsExpression(subFilter)){ +// if (subFilter instanceof PropertyValueFilter || subFilter instanceof InOidFilter){ +// if (containsExpression(subFilter)){ ObjectQuery q = ObjectQuery.createObjectQuery(subFilter); Task task = taskManager.createTaskInstance(); ExpressionVariables variables = new ExpressionVariables(); @@ -97,8 +97,8 @@ public ObjectQuery parseQuery(String query, Map parameters) throw q = ExpressionUtil.evaluateQueryExpressions(q, variables, expressionFactory, prismContext, "parsing expression values for report", task, task.getResult()); ((TypeFilter) f).setFilter(q.getFilter()); - } - } +// } +// } // if (parsedQuery == null) { parsedQuery = ObjectQuery.createObjectQuery(f); diff --git a/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicReportTest.java b/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicReportTest.java index 625177146bb..b545139ed65 100644 --- a/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicReportTest.java +++ b/model/report-impl/src/test/java/com/evolveum/midpoint/report/BasicReportTest.java @@ -750,7 +750,7 @@ public void test004RunReport() throws Exception { LOGGER.info("jasper report template: " + new String(Base64.decodeBase64(reportType.getTemplateStyle()))); //WHEN TestUtil.displayWhen(TEST_NAME); - reportManager.runReport(reportType.asPrismObject(), task, result); + reportManager.runReport(reportType.asPrismObject(), new HashMap(), task, result); // THEN TestUtil.displayThen(TEST_NAME); @@ -1260,7 +1260,7 @@ public void test013CreateAuditLogsReportFromFile() throws Exception { //WHEN TestUtil.displayWhen(TEST_NAME); - reportManager.runReport(reportType.asPrismObject(), task, result); + reportManager.runReport(reportType.asPrismObject(), new HashMap(), task, result); // THEN TestUtil.displayThen(TEST_NAME); @@ -1365,7 +1365,7 @@ public void test015CreateUserListReportFromFile() throws Exception { //WHEN TestUtil.displayWhen(TEST_NAME); - reportManager.runReport(reportType.asPrismObject(), task, result); + reportManager.runReport(reportType.asPrismObject(), new HashMap(), task, result); // THEN TestUtil.displayThen(TEST_NAME); @@ -1431,7 +1431,7 @@ public void test015ACreateCustomDSReportFromFile() throws Exception { //WHEN TestUtil.displayWhen(TEST_NAME); - reportManager.runReport(reportType.asPrismObject(), task, result); + reportManager.runReport(reportType.asPrismObject(), new HashMap(), task, result); // THEN TestUtil.displayThen(TEST_NAME); @@ -1470,7 +1470,7 @@ public void test016CreateReconciliationReportFromFile() throws Exception { //WHEN TestUtil.displayWhen(TEST_NAME); - reportManager.runReport(reportType.asPrismObject(), task, result); + reportManager.runReport(reportType.asPrismObject(), new HashMap(), task, result); // THEN TestUtil.displayThen(TEST_NAME);