Skip to content

Commit

Permalink
fixing MID-3993
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Jun 22, 2017
1 parent 311d5b2 commit 0149563
Show file tree
Hide file tree
Showing 9 changed files with 335 additions and 101 deletions.
Expand Up @@ -24,6 +24,6 @@
<a wicket:id="newObject" class="btn btn-success btn-sm"/>
<a wicket:id="refresh" class="btn btn-default btn-sm"/>
<a wicket:id="importObject" class="btn btn-primary btn-sm"/>
<a wicket:id="exportData" class="btn btn-primary btn-sm"/>
<span wicket:id="exportData"/>
</wicket:fragment>
</wicket:panel>
Expand Up @@ -15,45 +15,46 @@
*/
package com.evolveum.midpoint.gui.api.component;

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.ModelAuthorizationAction;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthorizationPhaseType;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Component;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEventSink;
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.export.CSVDataExporter;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.ExportToolbar;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.ResourceLink;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.util.resource.IResourceStream;

import com.evolveum.midpoint.gui.api.component.button.CsvDownloadButtonPanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.ModelAuthorizationAction;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.AbstractAjaxDownloadBehavior;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.ObjectNameColumn;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.PageImportObject;
import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import org.apache.wicket.request.resource.ResourceStreamResource;
import org.apache.wicket.util.resource.IResourceStream;

/**
* @author katkav
Expand Down Expand Up @@ -217,18 +218,56 @@ public boolean isVisible(){
}
});
add(importObject);

String fileName = mainObjectListPanel.getType().getSimpleName() +
"_" + mainObjectListPanel.createStringResource("MainObjectListPanel.exportFileName").getString();
CSVDataExporter csvDataExporter = new CSVDataExporter();
ResourceStreamResource resource = (new ResourceStreamResource() {
protected IResourceStream getResourceStream() {
return new ExportToolbar.DataExportResourceStreamWriter(csvDataExporter, mainObjectListPanel.getTable().getDataTable());
}
}).setFileName(fileName + "." + csvDataExporter.getFileNameExtension());
AbstractLink exportDataLink = (new ResourceLink(ID_EXPORT_DATA, resource)).setBody(csvDataExporter.getDataFormatNameModel());

add(exportDataLink);

CsvDownloadButtonPanel exportDataLink = new CsvDownloadButtonPanel(ID_EXPORT_DATA) {

private static final long serialVersionUID = 1L;

@Override
protected DataTable<?, ?> getDataTable() {
return mainObjectListPanel.getTable().getDataTable();
}

@Override
protected String getFilename() {
return mainObjectListPanel.getType().getSimpleName() +
"_" + mainObjectListPanel.createStringResource("MainObjectListPanel.exportFileName").getString();
}

};

add(exportDataLink);

// CSVDataExporter csvDataExporter = new CSVDataExporter();
// final AbstractAjaxDownloadBehavior ajaxDownloadBehavior = new AbstractAjaxDownloadBehavior() {
// private static final long serialVersionUID = 1L;
//
// @Override
// public IResourceStream getResourceStream() {
// return new ExportToolbar.DataExportResourceStreamWriter(csvDataExporter, mainObjectListPanel.getTable().getDataTable());
// }
//
// public String getFileName() {
// return mainObjectListPanel.getType().getSimpleName() +
// "_" + mainObjectListPanel.createStringResource("MainObjectListPanel.exportFileName").getString();
// }
// };
//
// add(ajaxDownloadBehavior);
//
// AjaxIconButton exportDataLink = new AjaxIconButton(ID_EXPORT_DATA, new Model<>("fa fa-download"),
// mainObjectListPanel.createStringResource("MainObjectListPanel.export")) {
//
// private static final long serialVersionUID = 1L;
//
// @Override
// public void onClick(AjaxRequestTarget target) {
// ajaxDownloadBehavior.initiate(target);
// }
// };
//
//
// add(exportDataLink);

}
}
Expand Down
@@ -0,0 +1,22 @@
<!--
~ Copyright (c) 2010-2016 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.
-->

<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
<a wicket:id="exportData" class="btn btn-primary btn-sm"/>
</wicket:panel>
</html>
@@ -0,0 +1,87 @@
package com.evolveum.midpoint.gui.api.component.button;

import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.CSVDataExporter;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.ExportToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.resource.IResourceStream;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.web.component.AbstractAjaxDownloadBehavior;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.page.admin.reports.dto.AuditEventRecordProvider;

public abstract class CsvDownloadButtonPanel extends BasePanel {

private static final String ID_EXPORT_DATA = "exportData";

public CsvDownloadButtonPanel(String id) {
this(id, false);
}

//TODO: temporal HACK.. there is no time to do it properly, just reusing the current implementation
public CsvDownloadButtonPanel(String id, boolean isAudit) {
super(id);
initLayout(isAudit);
}

private static final long serialVersionUID = 1L;

private void initLayout(boolean isAudit) {
CSVDataExporter csvDataExporter = new CSVDataExporter() {
private static final long serialVersionUID = 1L;

@Override
public <T> void exportData(IDataProvider<T> dataProvider, List<IExportableColumn<T, ?>> columns,
OutputStream outputStream) throws IOException {
if (isAudit) {
((AuditEventRecordProvider) dataProvider).setExportSize(true);
super.exportData(dataProvider, columns, outputStream);
((AuditEventRecordProvider) dataProvider).setExportSize(false);

} else {
super.exportData(dataProvider, columns, outputStream);
}

}
};
final AbstractAjaxDownloadBehavior ajaxDownloadBehavior = new AbstractAjaxDownloadBehavior() {
private static final long serialVersionUID = 1L;

@Override
public IResourceStream getResourceStream() {
return new ExportToolbar.DataExportResourceStreamWriter(csvDataExporter, getDataTable());
}

public String getFileName() {
return CsvDownloadButtonPanel.this.getFilename();
}
};

add(ajaxDownloadBehavior);

AjaxIconButton exportDataLink = new AjaxIconButton(ID_EXPORT_DATA, new Model<>("fa fa-download"),
createStringResource("CsvDownloadButtonPanel.export")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
ajaxDownloadBehavior.initiate(target);
}
};
add(exportDataLink);
}

protected abstract DataTable<?,?> getDataTable();

protected abstract String getFilename();

}
@@ -0,0 +1,93 @@
/*
* Copyright (c) 2010-2017 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.component;

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.AbstractResourceStream;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
import org.apache.wicket.util.time.Duration;

public abstract class AbstractAjaxDownloadBehavior extends AbstractAjaxBehavior {

private static final long serialVersionUID = 1L;
private boolean addAntiCache;
private String contentType = "text";
private String fileName = null;

public AbstractAjaxDownloadBehavior() {
this(true);
}

public AbstractAjaxDownloadBehavior(boolean addAntiCache) {
super();
this.addAntiCache = addAntiCache;
}

/**
* Call this method to initiate the download.
*/
public void initiate(AjaxRequestTarget target) {
String url = getCallbackUrl().toString();

if (addAntiCache) {
url = url + (url.contains("?") ? "&" : "?");
url = url + "antiCache=" + System.currentTimeMillis();
}

// the timeout is needed to let Wicket release the channel
target.appendJavaScript("setTimeout(\"window.location.href='" + url + "'\", 100);");
}

public void onRequest() {

IResourceStream resourceStream = getResourceStream();
ResourceStreamRequestHandler reqHandler = new ResourceStreamRequestHandler(resourceStream) {
@Override
public void respond(IRequestCycle requestCycle) {
super.respond(requestCycle);
}
}.setContentDisposition(ContentDisposition.ATTACHMENT)
.setCacheDuration(Duration.ONE_SECOND);
if (StringUtils.isNotEmpty(getFileName())){
reqHandler.setFileName(getFileName());
}
getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(reqHandler);
}

public void setContentType(String contentType) {
this.contentType = contentType;
}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public abstract IResourceStream getResourceStream();
}

0 comments on commit 0149563

Please sign in to comment.