/* * Copyright 2008-2011 the original author or authors. * * 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 org.jdal.swing.report; import java.awt.event.ActionEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import javax.sql.DataSource; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.filechooser.FileFilter; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.util.JRLoader; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdal.reporting.Report; import org.jdal.reporting.ReportingException; import org.jdal.service.ReportService; import org.jdal.swing.AbstractView; /** * * @author Jose A. Corbacho */ public class ReportFileView extends AbstractView<Report> { private final static Log log = LogFactory.getLog(ReportFileView.class); private JTextField fileName = new JTextField(); private Icon addIcon; private ReportService reportService; private DataSource dataSource; public ReportFileView(Report model){ setModel(model); } public ReportFileView(){ this(new Report()); } public void init() { getPanel(); refresh(); } @Override protected JComponent buildPanel() { Box box = Box.createHorizontalBox(); fileName.setEditable(false); box.add(new JLabel("Fichero")); box.add(fileName); box.add(Box.createHorizontalStrut(5)); box.add(Box.createHorizontalStrut(5)); box.add(new JButton(new FileAction())); return box; } /** * Add a file to this report * @throws ReportingException */ private void addAttachment() throws ReportingException { Report report = getModel(); JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new ReportFileFilter()); if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(getPanel())) { File file = chooser.getSelectedFile(); try { getModel().setData(FileUtils.readFileToByteArray(file)); getModel().setFileName(file.getName()); fileName.setText(file.getName()); // Update hidden value hasSQL to determine whether this report requires a Connection // to be displayed. InputStream reportStream = null; try { reportStream = new FileInputStream(file); } catch (FileNotFoundException e) { throw new ReportingException("Error cargando fichero"); } JasperReport jasperReport = null; try { String suffix = ReportManager.getSuffix(file.getName()); if (".jrxml".equals(suffix)) jasperReport = JasperCompileManager.compileReport(reportStream); else if (".jasper".equals(suffix)) jasperReport = (JasperReport) JRLoader.loadObject(reportStream); else { throw new ReportingException("Archivos del tipo " + suffix + " no pueden ser procesados"); } if (jasperReport.getQuery() != null) report.setHasQuery(new Boolean(true)); else report.setHasQuery(new Boolean(false)); } catch (JRException e) { log.error(e); e.printStackTrace(); throw new ReportingException("Error procesando fichero"); } } catch (IOException e) { throw new ReportingException("No se puede leer el Fichero: " + file.getName()); } } } /** * GETTERS AND SETTERS */ public Icon getAddIcon() { return addIcon; } public void setAddIcon(Icon addIcon) { this.addIcon = addIcon; } public ReportService getService() { return reportService; } public void setService(ReportService service) { this.reportService = service; } @SuppressWarnings("serial") private class FileAction extends AbstractAction { public FileAction() { putValue(Action.SMALL_ICON, addIcon); } public void actionPerformed(ActionEvent e) { try { addAttachment(); } catch (ReportingException e1) { JOptionPane.showMessageDialog(getPanel(), e1.getMessage()); } } } public JTextField getFileName() { return fileName; } public void setFileName(JTextField fileName) { this.fileName = fileName; } public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } /** * This class filters the types of files the system can handle to create reports * * @author Jose A. Corbacho * */ class ReportFileFilter extends FileFilter { private String[] allowedFileTypes = {"jasper", "jrxml"}; public boolean accept(File file) { if (file.isDirectory()) return true; String s = file.getName(); int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1){ for (String fileType : allowedFileTypes) if (s.substring(i + 1).toLowerCase().equals(fileType)) return true; } return false; } public String getDescription() { StringBuffer sb = new StringBuffer(); for (String fileType: allowedFileTypes) sb.append(" " + fileType); return sb.toString(); } } }