/* * Copyright (C) 2002 Erik Swenson - erik@oreports.com * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have reserved a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. * */ package org.efs.openreports.providers.impl; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.commons.io.filefilter.WildcardFileFilter; import org.apache.log4j.Logger; import org.efs.openreports.objects.Report; import org.efs.openreports.objects.ReportGroup; import org.efs.openreports.objects.ReportLog; import org.efs.openreports.objects.ReportTemplate; import org.efs.openreports.providers.DirectoryProvider; import org.efs.openreports.providers.HibernateProvider; import org.efs.openreports.providers.ProviderException; import org.efs.openreports.providers.ReportProvider; import org.efs.openreports.util.LocalStrings; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; public class ReportProviderImpl implements ReportProvider { protected static Logger log = Logger.getLogger(ReportProviderImpl.class.getName()); private DirectoryProvider directoryProvider; private HibernateProvider hibernateProvider; public ReportProviderImpl(DirectoryProvider directoryProvider, HibernateProvider hibernateProvider) throws ProviderException { this.directoryProvider = directoryProvider; this.hibernateProvider = hibernateProvider; log.info("ReportProviderImpl created"); } public List<String> getReportFileNames() throws ProviderException { File file = new File(directoryProvider.getReportDirectory()); if (!file.exists()) { throw new ProviderException( "BaseDirectory Invalid: Set baseDirectory in openreports.properties to full path " + " of directory containing your JasperReports files "); } File[] files = file.listFiles(); ArrayList<String> fileNames = new ArrayList<String>(files.length); for (int i = 0; i < files.length; i++) { if (files[i].getName().endsWith(".jasper") || files[i].getName().endsWith(".rptdesign") || files[i].getName().endsWith(".vm") || files[i].getName().endsWith(".xml") || files[i].getName().endsWith(".ftl") || files[i].getName().endsWith(".xls")) { fileNames.add(files[i].getName()); } } Collections.sort(fileNames); return fileNames; } public List<ReportTemplate> getReportTemplates() throws ProviderException { List<String> fileNames = getReportFileNames(); ArrayList<ReportTemplate> reportTemplates = new ArrayList<ReportTemplate>(); for (String fileName : fileNames) { ReportTemplate template = getReportTemplate(fileName); reportTemplates.add(template); } return reportTemplates; } public ReportTemplate getReportTemplate(String templateName) throws ProviderException { File reportDirectory = new File(directoryProvider.getReportDirectory()); FileFilter templateFilter = new WildcardFileFilter(templateName + "*"); File[] templateFiles = reportDirectory.listFiles(templateFilter); String[] revisions = new String[templateFiles.length]; for (int i=0; i < templateFiles.length; i++) { revisions[i] = templateFiles[i].getName(); } Arrays.sort(revisions); ReportTemplate template = new ReportTemplate(templateName); template.setRevisions(revisions); return template; } public Report getReport(Integer id) throws ProviderException { return (Report) hibernateProvider.load(Report.class, id); } public Report getReport(String name) throws ProviderException { Session session = null; try { session = hibernateProvider.openSession(); Criteria criteria = session.createCriteria(Report.class); criteria.add(Restrictions.eq("name", name)); return (Report) criteria.uniqueResult(); } catch (HibernateException he) { throw new ProviderException(he); } finally { hibernateProvider.closeSession(session); } } @SuppressWarnings("unchecked") public List<Report> getReports() throws ProviderException { String fromClause = "from org.efs.openreports.objects.Report report order by report.name "; return (List<Report>) hibernateProvider.query(fromClause); } public Report insertReport(Report report) throws ProviderException { return (Report) hibernateProvider.save(report); } public void updateReport(Report report) throws ProviderException { hibernateProvider.update(report); } public void deleteReport(Report report) throws ProviderException { Session session = hibernateProvider.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); //delete report session.delete(report); //delete report log entries for report Iterator<?> iterator = session .createQuery( "from org.efs.openreports.objects.ReportLog reportLog where reportLog.report.id = ? ") .setInteger(0, report.getId().intValue()).iterate(); while(iterator.hasNext()) { ReportLog reportLog = (ReportLog) iterator.next(); session.delete(reportLog); } //remove report from groups iterator = session .createQuery( "from org.efs.openreports.objects.ReportGroup reportGroup").iterate(); while(iterator.hasNext()) { ReportGroup reportGroup = (ReportGroup) iterator.next(); List<Report> reports = reportGroup.getReports(); if (reports.contains(report)) { reports.remove(report); } } tx.commit(); } catch (HibernateException he) { hibernateProvider.rollbackTransaction(tx); if (he.getCause() != null && he.getCause().getMessage() != null && he.getCause().getMessage().toUpperCase().indexOf("CONSTRAINT") > 0) { throw new ProviderException(LocalStrings.ERROR_REPORT_DELETION); } log.error("deleteReport", he); throw new ProviderException(LocalStrings.ERROR_SERVERSIDE); } finally { hibernateProvider.closeSession(session); } } }