1 /** 2 * 3 */ 4 package ar.com.jiji.kaya.reports; 5 6 import java.util.Collection; 7 import java.util.Collections; 8 import java.util.Enumeration; 9 import java.util.HashMap; 10 import java.util.Map; 11 import java.util.PropertyResourceBundle; 12 import java.util.ResourceBundle; 13 import java.util.regex.Matcher; 14 import java.util.regex.Pattern; 15 16 /** 17 * Mantiene una lista de los reportes definidos para el sistema. 18 * 19 * TODO: documentar y hacer tests 20 * 21 * @author lparra 22 * 23 */ 24 public class ReportSpecManager { 25 private static final Object REPORT_PKG = "package"; 26 27 private static final Object DS_PROPERTY = "ds"; 28 29 private static final Object LOCATION_PROPERTY = "location"; 30 31 private static final Object DOWNLOAD_NAME_PROPERTY = "downloadName"; 32 33 private static final Object COLUMNS_PROPERTY = "columns"; 34 35 private String reportPkg = ""; 36 37 private Map<String, ReportSpec> specs = new HashMap<String, ReportSpec>(); 38 39 public ReportSpecManager() { 40 } 41 42 public ReportSpecManager(String resource) throws ReportException { 43 PropertyResourceBundle props = (PropertyResourceBundle) ResourceBundle 44 .getBundle(resource); 45 46 Map<String, ReportSpec> aux = new HashMap<String, ReportSpec>(); 47 48 Pattern p = Pattern.compile("([\\w_-]+)\\.(\\w+)"); 49 for (Enumeration e = props.getKeys(); e.hasMoreElements();) { 50 String k = (String) e.nextElement(); 51 String value = props.getString(k); 52 53 if (REPORT_PKG.equals(k)) { 54 setReportPkg(value); 55 continue; 56 } 57 58 Matcher m = p.matcher(k); 59 if (m.matches()) { 60 String rep = m.group(1); 61 String prop = m.group(2); 62 63 ReportSpec spec = aux.get(rep); 64 if (spec == null) 65 spec = new ReportSpec(rep); 66 if (DS_PROPERTY.equals(prop)) 67 spec.setDsExtractor(value); 68 else if (LOCATION_PROPERTY.equals(prop)) 69 spec.setLocation(value); 70 else if (DOWNLOAD_NAME_PROPERTY.equals(prop)) 71 spec.setDownloadName(value); 72 else if (COLUMNS_PROPERTY.equals(prop)) 73 spec.setColumns(value.split(",")); 74 aux.put(rep, spec); 75 } 76 } 77 78 for (ReportSpec spec : aux.values()) { 79 if (spec.getDsExtractor() == null) 80 throw new ReportException("Report " + spec.getName() 81 + " has no data source extractor."); 82 if (spec.getLocation() == null) 83 spec.setLocation(getDefaultLocation(spec.getName())); 84 } 85 86 specs.putAll(aux); 87 } 88 89 public void add(String name, ReportSpec spec) { 90 specs.put(name, spec); 91 } 92 93 public void add(String name, String dsExtractor) throws ReportException { 94 add(name, dsExtractor, getDefaultLocation(name)); 95 } 96 97 private String getDefaultLocation(String name) { 98 return reportPkg + '/' + name + ".jasper"; 99 } 100 101 public void add(String name, String dsExtractor, String location) 102 throws ReportException { 103 specs.put(name, new ReportSpec(name, dsExtractor, location)); 104 } 105 106 public ReportSpec get(String name) { 107 return specs.get(name); 108 } 109 110 public void remove(String name) { 111 specs.remove(name); 112 } 113 114 public Collection<ReportSpec> getReports() { 115 return Collections.unmodifiableCollection(specs.values()); 116 } 117 118 public String getReportPkg() { 119 return reportPkg; 120 } 121 122 public void setReportPkg(String reportPkg) { 123 this.reportPkg = reportPkg; 124 } 125 }