/* * Copyright (c) 2010-2015 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.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; 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.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.PageAdminConfiguration; import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto; import com.evolveum.midpoint.web.security.MidPointApplication; import com.evolveum.midpoint.web.security.WebApplicationConfiguration; 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.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.Radio; import org.apache.wicket.markup.html.form.RadioGroup; import org.apache.wicket.markup.html.form.upload.FileUpload; import org.apache.wicket.markup.html.form.upload.FileUploadField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.file.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; /** * @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.AUTZ_UI_REPORTS_REPORT_CREATE_URL, 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<String> xmlEditorModel; public PageNewReport() { xmlEditorModel = new Model<String>(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<Integer> groupModel = new Model<Integer>(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<Integer> groupModel) { comp.add(new VisibleEnableBehaviour() { @Override public boolean isVisible() { return type.equals(groupModel.getObject()); } }); } private void initButtons(WebMarkupContainer buttonBar, IModel<Integer> 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.logUnexpectedException(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.logUnexpectedException(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()); } }