/** * */ package org.nightlabs.jfire.reporting.admin.ui.layout.action.export; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.jdo.FetchPlan; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.nightlabs.base.ui.composite.FileSelectionComposite; import org.nightlabs.base.ui.composite.LabeledText; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.job.Job; import org.nightlabs.eclipse.ui.dialog.ResizableTrayDialog; import org.nightlabs.jfire.base.JFireEjb3Factory; import org.nightlabs.jfire.reporting.ReportManagerRemote; import org.nightlabs.jfire.reporting.admin.ui.resource.Messages; import org.nightlabs.jfire.reporting.dao.ReportRegistryItemDAO; import org.nightlabs.jfire.reporting.layout.ReportRegistryItem; import org.nightlabs.jfire.reporting.layout.id.ReportRegistryItemID; import org.nightlabs.jfire.security.SecurityReflector; import org.nightlabs.progress.ProgressMonitor; /** * Dialog to export a layout as needed for the initialisation in the server. * * @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de --> */ public class ExportReportLayoutDialog extends ResizableTrayDialog { private XComposite wrapper; private FileSelectionComposite folderComposite; private LabeledText layoutFileName; private ReportRegistryItemID layoutID; /** * @param parentShell */ public ExportReportLayoutDialog(Shell parentShell, ReportRegistryItemID layoutID ) { super(parentShell, null); setShellStyle(getShellStyle() | SWT.RESIZE); this.layoutID = layoutID; } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.action.export.ExportReportLayoutDialog.window.title")); //$NON-NLS-1$ newShell.setSize(400, 400); } @Override protected Control createDialogArea(Composite parent) { wrapper = new XComposite(parent, SWT.NONE); layoutFileName = new LabeledText(wrapper, Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.action.export.ExportReportLayoutDialog.label.selectExportFileName")); //$NON-NLS-1$ folderComposite = new FileSelectionComposite( wrapper, SWT.NONE, FileSelectionComposite.OPEN_DIR, Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.action.export.ExportReportLayoutDialog.label.selectExportFolder"), //$NON-NLS-1$ Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.action.export.ExportReportLayoutDialog.label.selectFolder")); //$NON-NLS-1$ Job job = new Job("Loading Data...") { @Override protected IStatus run(ProgressMonitor monitor) throws Exception { ReportRegistryItemDAO reportRegistryItemDAO = ReportRegistryItemDAO.sharedInstance(); reportRegistryItem = reportRegistryItemDAO.getReportRegistryItem( ExportReportLayoutDialog.this.layoutID, new String[] {FetchPlan.DEFAULT, ReportRegistryItem.FETCH_GROUP_NAME, ReportRegistryItem.FETCH_GROUP_DESCRIPTION, ReportRegistryItem.FETCH_GROUP_PARENT_CATEGORY}, monitor); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { String layoutFileNameStr = reportRegistryItem.getName().getText().replace("-", ""); layoutFileNameStr.replace(" ", ""); layoutFileName.setText(layoutFileNameStr); } }); return Status.OK_STATUS; } }; job.schedule(); return wrapper; } private ReportRegistryItem reportRegistryItem; /** * Saves a file indicated by fileName to the given {@link InputStream}. */ public void saveFile(InputStream io, String fileName) throws IOException { // Should this method be here? File saveFile = new File(fileName); FileOutputStream fos = new FileOutputStream(saveFile); try { byte[] buf = new byte[256]; int read = 0; while ((read = io.read(buf)) > 0) { fos.write(buf, 0, read); } } finally { fos.close(); } } @Override protected void okPressed() { ReportManagerRemote rmr = JFireEjb3Factory.getRemoteBean(ReportManagerRemote.class, SecurityReflector.getInitialContextProperties()); InputStream inputStream = new ByteArrayInputStream(rmr.exportReportLayout(layoutFileName.getText(), layoutID)); if (inputStream != null) { try { if (folderComposite.getFile() != null) { saveFile(inputStream, folderComposite.getFile().getAbsolutePath() + File.separator + layoutFileName.getText() + ".zip"); } } catch (Exception ex) { throw new RuntimeException(ex); } finally { } } super.okPressed(); } }