package jpaoletti.jpm.core.operations; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import jpaoletti.jpm.core.EntityFilter; import jpaoletti.jpm.core.Field; import jpaoletti.jpm.core.PMContext; import jpaoletti.jpm.core.PMException; import jpaoletti.jpm.core.exporter.Exporter; import jpaoletti.jpm.core.message.MessageFactory; /** * Operation for export. <br/> * * Parameters: <br/> * * <dl> * <dt>exporters</dt><dd>Comma separated list with exporter classes</dd> * </dl> * * @author jpaoletti * @since 25/11/2011 * @version * @issue * */ public class Export extends OperationCommandSupport { public Export(String operationId) { super(operationId); } public Export() { super("export"); } protected List<Field> getExportFields(PMContext ctx) { final Object[] fieldIds = ctx.getParameters("fields"); final List<Field> fields = new ArrayList<Field>(); for (Object object : fieldIds) { final String fieldId = (String) object; final Field field = ctx.getEntity().getFieldById(fieldId); fields.add(field); } return fields; } @Override protected boolean prepare(PMContext ctx) throws PMException { super.prepare(ctx); final List<Exporter> exporterList = getExporterList(ctx); ctx.put("exporters", exporterList); return true; } @Override protected void doExecute(PMContext ctx) throws PMException { if (finished(ctx)) { final OutputStream out = (OutputStream) ctx.get("out"); if (out == null) { throw new PMException("exporter.out.undefined"); } else { final List<Exporter> exporterList = getExporterList(ctx); final String _exporter = (String) ctx.getParameter("exporter"); Exporter exporter = null; for (Exporter e : exporterList) { if (e.getId().equalsIgnoreCase(_exporter)) { exporter = e; } } if (exporter != null) { final List<Field> fields = getExportFields(ctx); final List<String> headers = getHeaders(ctx, fields); final List<List<String>> toExport = new ArrayList<List<String>>(); EntityFilter filter = null; if (ctx.getParameter("filter") != null) { filter = ctx.getEntityContainer().getFilter(); } final List<?> list = ctx.getEntity().getDataAccess().list(ctx, filter, ctx.getList().getListFilter(), ctx.getList().getSort(), null, null); for (Object item : list) { ctx.setEntityInstance(item); final List<String> row = new ArrayList<String>(); for (Field field : fields) { field.visualize(ctx, ctx.getOperation(), ctx.getEntity()); final Object visualize = ctx.getFieldValue(); final String cell = (visualize == null) ? "" : visualize.toString(); row.add(cell); } toExport.add(row); } try { exporter.export(toExport, headers, out); } catch (IOException ex) { ctx.addMessage(MessageFactory.error(ctx.getEntity(), "exporter.error", ex.getMessage(), _exporter)); } } else { ctx.addMessage(MessageFactory.error(ctx.getEntity(), "exporter.undefined", _exporter)); } } } } protected List<Exporter> getExporterList(PMContext ctx) { final String _exporters = ctx.getOperation().getConfig("exporters", "jpaoletti.jpm.core.exporter.ExporterCSV"); final String[] exporters = _exporters.split("[,]"); final List<Exporter> exporterList = new ArrayList<Exporter>(); for (String string : exporters) { exporterList.add((Exporter) ctx.getPresentationManager().newInstance(string)); } return exporterList; } protected List<String> getHeaders(PMContext ctx, List<Field> fields) { final List<String> headers = new ArrayList<String>(); for (Field field : fields) { headers.add(field.getTitle()); } return headers; } @Override protected boolean checkEntity() { return true; } }