package sushi.application.pages.export; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable; 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.form.Button; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; 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 org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; import org.apache.wicket.util.resource.FileResourceStream; import org.apache.wicket.util.resource.IResourceStream; import sushi.application.components.table.SelectEntryPanel; import sushi.application.pages.AbstractSushiPage; import sushi.application.pages.eventrepository.model.EventFilter; import sushi.application.pages.eventrepository.model.EventProvider; import sushi.csv.importer.CSVExporter; import sushi.event.SushiEvent; import sushi.event.SushiEventType; /** * This class is a page to export {@link SushiEvent}s as CSV files. * It is possible to specify, which events should be exported with a filter. * @author micha */ public class Export extends AbstractSushiPage { private static final long serialVersionUID = 1L; private String selectedEventTypeName; private SushiEventType selectedEventType; private Form<Void> layoutForm; protected String eventTypeNameFromTree; private DropDownChoice<String> eventTypeDropDownChoice; private ArrayList<IColumn<SushiEvent, String>> columns; private DefaultDataTable<SushiEvent, String> dataTable; private EventProvider eventProvider; /** * Constructor for a page to export {@link SushiEvent}s as CSV files. * It is possible to specify, which events should be exported with a filter. */ public Export() { super(); layoutForm = new Form<Void>("layoutForm"); add(layoutForm); eventProvider = new EventProvider(); eventProvider.setEventFilter(new EventFilter("Event Type (ID)", "=", "-1")); addEventTypeSelect(); addExportButton(); addEventTable(); } private void addEventTypeSelect() { List<String> eventTypes = SushiEventType.getAllTypeNames(); eventTypeDropDownChoice = new DropDownChoice<String>("eventTypeDropDownChoice", new PropertyModel<String>(this, "selectedEventTypeName"), eventTypes); eventTypeDropDownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { updateOnChangeOfDropDownChoice(target); } }); layoutForm.add(eventTypeDropDownChoice); } protected void updateOnChangeOfDropDownChoice(AjaxRequestTarget target) { selectedEventType = SushiEventType.findByTypeName(selectedEventTypeName); if (selectedEventType != null) { eventProvider.setEventFilter(new EventFilter("Event Type (ID)", "=", Integer.toString(selectedEventType.getID()))); target.add(dataTable); } } private void addExportButton() { Button filterButton = new Button("exportButton") { private static final long serialVersionUID = 1L; @Override public void onSubmit() { CSVExporter csvExporter = new CSVExporter(); List<SushiEvent> events = (eventProvider.getSelectedEntities().isEmpty()) ? eventProvider.getEntities() : eventProvider.getSelectedEntities(); File csv = csvExporter.generateExportFile(selectedEventType, events); IResourceStream resourceStream = new FileResourceStream(new org.apache.wicket.util.file.File(csv)); // Use whatever file you need here ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(resourceStream); resourceStreamRequestHandler.setFileName("exportCSV.csv"); RequestCycle.get().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); } }; layoutForm.add(filterButton); } @SuppressWarnings({ "rawtypes", "unchecked" }) private void addEventTable() { columns = new ArrayList<IColumn<SushiEvent, String>>(); columns.add(new PropertyColumn<SushiEvent, String>(Model.of("ID"), "ID")); columns.add(new PropertyColumn<SushiEvent, String>(Model.of("Timestamp"), "timestamp")); columns.add(new PropertyColumn<SushiEvent, String>(Model.of("EventType"), "eventType")); columns.add(new PropertyColumn<SushiEvent, String>(Model.of("Values"), "values")); columns.add(new PropertyColumn<SushiEvent, String>(Model.of("Process Instances"), "processInstances")); columns.add(new AbstractColumn<SushiEvent, String>(new Model("Select")) { private static final long serialVersionUID = 1L; @Override public void populateItem(Item cellItem, String componentId, IModel rowModel) { int entryId = ((SushiEvent) rowModel.getObject()).getID(); cellItem.add(new SelectEntryPanel(componentId, entryId, eventProvider)); } }); dataTable = new DefaultDataTable<SushiEvent, String>("events", columns, eventProvider, 20); dataTable.setOutputMarkupId(true); add(dataTable); } }