/*
* 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 java.util.ArrayList;
import java.util.List;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.RawValidationError;
import com.evolveum.midpoint.gui.api.component.result.OpResult;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
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.Holder;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.application.AuthorizationAction;
import com.evolveum.midpoint.web.application.PageDescriptor;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.web.component.TabbedPanel;
import com.evolveum.midpoint.web.page.admin.configuration.PageAdminConfiguration;
import com.evolveum.midpoint.web.page.admin.reports.component.AceEditorPanel;
import com.evolveum.midpoint.web.page.admin.reports.component.JasperReportConfigurationPanel;
import com.evolveum.midpoint.web.page.admin.reports.component.ReportConfigurationPanel;
import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto;
import com.evolveum.midpoint.web.page.error.PageError;
import com.evolveum.midpoint.web.util.Base64Model;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType;
/**
* @author shood
*/
@PageDescriptor(url = "/admin/report", encoder = OnePageParameterEncoder.class, action = {
@AuthorizationAction(actionUri = PageAdminReports.AUTH_REPORTS_ALL,
label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL,
description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION),
@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_REPORT_URL,
label = "PageReport.auth.report.label",
description = "PageReport.auth.report.description")})
public class PageReport extends PageAdminReports {
private static Trace LOGGER = TraceManager.getTrace(PageReport.class);
private static final String DOT_CLASS = PageReport.class.getName() + ".";
private static final String OPERATION_LOAD_REPORT = DOT_CLASS + "loadReport";
private static final String OPERATION_SAVE_REPORT = DOT_CLASS + "saveReport";
private static final String OPERATION_VALIDATE_REPORT = DOT_CLASS + "validateReport";
private static final String ID_MAIN_FORM = "mainForm";
private static final String ID_TAB_PANEL = "tabPanel";
private static final String ID_SAVE_BUTTON = "save";
private static final String ID_CANCEL_BUTTON = "cancel";
private LoadableModel<ReportDto> model;
public PageReport() {
model = new LoadableModel<ReportDto>(false) {
@Override
protected ReportDto load() {
return loadReport();
}
};
initLayout();
}
public PageReport(final ReportDto reportDto) {
model = new LoadableModel<ReportDto>(reportDto, false) {
@Override
protected ReportDto load() {
// never called
return reportDto;
}
};
initLayout();
}
private ReportDto loadReport() {
StringValue reportOid = getPageParameters().get(OnePageParameterEncoder.PARAMETER);
Task task = createSimpleTask(OPERATION_LOAD_REPORT);
OperationResult result = task.getResult();
PrismObject<ReportType> prismReport = WebModelServiceUtils.loadObject(ReportType.class, reportOid.toString(),
this, task, result);
if (prismReport == null) {
LOGGER.error("Couldn't load report.");
throw new RestartResponseException(PageReports.class);
}
return new ReportDto(prismReport.asObjectable());
// return prismReport;
}
private void initLayout() {
Form mainForm = new Form(ID_MAIN_FORM);
add(mainForm);
List<ITab> tabs = new ArrayList<>();
tabs.add(new AbstractTab(createStringResource("PageReport.basic")) {
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer getPanel(String panelId) {
return new ReportConfigurationPanel(panelId, model);
}
});
tabs.add(new AbstractTab(createStringResource("PageReport.jasperTemplate")) {
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer getPanel(String panelId) {
return new JasperReportConfigurationPanel(panelId, model);
// IModel<String> title = PageReport.this.createStringResource("PageReport.jasperTemplate");
// IModel<String> data = new Base64Model(new PrismPropertyModel<>(model, ReportType.F_TEMPLATE));
// return new AceEditorPanel(panelId, title, data);
}
});
tabs.add(new AbstractTab(createStringResource("PageReport.jasperTemplateStyle")) {
private static final long serialVersionUID = 1L;
@Override
public WebMarkupContainer getPanel(String panelId) {
IModel<String> title = PageReport.this.createStringResource("PageReport.jasperTemplateStyle");
IModel<String> data = new Base64Model(new PropertyModel(model, "templateStyle"));
return new AceEditorPanel(panelId, title, data);
}
});
// tabs.add(new AbstractTab(createStringResource("PageReport.fullXml")) {
//
// @Override
// public WebMarkupContainer getPanel(String panelId) {
// IModel<String> title = PageReport.this.createStringResource("PageReport.fullXml");
//
// AceEditorPanel panel = new AceEditorPanel(panelId, title, createFullXmlModel());
// panel.getEditor().add(createFullXmlValidator());
// return panel;
// }
// });
TabbedPanel<ITab> reportTabPanel = WebComponentUtil.createTabPanel(ID_TAB_PANEL, this, tabs, null);
reportTabPanel.setOutputMarkupId(true);
mainForm.add(reportTabPanel);
initButtons(mainForm);
}
private IValidator<String> createFullXmlValidator() {
return new IValidator<String>() {
@Override
public void validate(IValidatable<String> validatable) {
String value = validatable.getValue();
OperationResult result = new OperationResult(OPERATION_VALIDATE_REPORT);
Holder<PrismObject<ReportType>> reportHolder = new Holder<>(null);
OpResult opResult = null;
try {
validateObject(value, reportHolder, PrismContext.LANG_XML, true, result);
if(!result.isAcceptable()){
result.recordFatalError("Could not validate object", result.getCause());
opResult = OpResult.getOpResult((PageBase)getPage(),result);
validatable.error(new RawValidationError(opResult));
}
} catch (Exception e){
LOGGER.error("Validation problem occured." + e.getMessage());
result.recordFatalError("Could not validate object.", e);
try {
opResult = OpResult.getOpResult((PageBase) getPage(), result);
validatable.error(new RawValidationError(opResult));
} catch (Exception ex){
error(ex);
}
}
}
};
}
private IModel<String> createFullXmlModel() {
return new IModel<String>() {
@Override
public String getObject() {
PrismObject report = model.getObject().getObject();
if (report == null) {
return null;
}
try {
return getPrismContext().serializeObjectToString(report, PrismContext.LANG_XML);
} catch (SchemaException ex) {
getSession().error(getString("PageReport.message.cantSerializeFromObjectToString") + ex);
throw new RestartResponseException(PageError.class);
}
}
@Override
public void setObject(String object) {
OperationResult result = new OperationResult(OPERATION_VALIDATE_REPORT);
Holder<PrismObject<ReportType>> reportHolder = new Holder<>(null);
try {
validateObject(object, reportHolder, PrismContext.LANG_XML, true, result);
model.getObject().setObject(reportHolder.getValue());
} catch (Exception e){
LOGGER.error("Could not set object. Validation problem occured." + result.getMessage());
result.recordFatalError("Could not set object. Validation problem occured,", e);
showResult(result, "Could not set object. Validation problem occured.");
}
}
@Override
public void detach() {
}
};
}
private void initButtons(Form mainForm) {
AjaxSubmitButton save = new AjaxSubmitButton(ID_SAVE_BUTTON, createStringResource("PageBase.button.save")) {
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.add(getFeedbackPanel());
}
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
onSavePerformed(target);
}
};
mainForm.add(save);
AjaxSubmitButton cancel = new AjaxSubmitButton(ID_CANCEL_BUTTON, createStringResource("PageBase.button.cancel")) {
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.add(getFeedbackPanel());
}
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
onCancelPerformed(target);
}
};
mainForm.add(cancel);
}
protected void onSavePerformed(AjaxRequestTarget target) {
Task task = createSimpleTask(OPERATION_SAVE_REPORT);
OperationResult result = task.getResult();
try {
//TODO TODO TODO
PrismObject<ReportType> newReport = model.getObject().getObject();
ObjectDelta<ReportType> delta = null;
if (newReport.getOid() == null) {
getPrismContext().adopt(newReport);
delta = ObjectDelta.createAddDelta(newReport);
delta.setPrismContext(getPrismContext());
} else {
PrismObject<ReportType> oldReport = WebModelServiceUtils.loadObject(ReportType.class,
newReport.getOid(), this, task, result);
if (oldReport != null) {
delta = oldReport.diff(newReport);
}
}
if (delta != null) {
getPrismContext().adopt(delta);
getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), null, task, result);
}
} catch (Exception e) {
result.recordFatalError("Couldn't save report.", e);
} finally {
result.computeStatusIfUnknown();
}
if (WebComponentUtil.isSuccessOrHandledError(result)) {
showResult(result);
redirectBack();
} else {
showResult(result);
target.add(getFeedbackPanel());
}
}
protected void onCancelPerformed(AjaxRequestTarget target) {
redirectBack();
}
}