KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > efs > openreports > providers > impl > ParameterProviderImpl


1 /*
2  * Copyright (C) 2002 Erik Swenson - erik@oreports.com
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the Free
6  * Software Foundation; either version 2 of the License, or (at your option)
7  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16  * Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  */

19
20 package org.efs.openreports.providers.impl;
21
22 import java.math.BigDecimal JavaDoc;
23 import java.sql.*;
24 import java.util.*;
25
26 import com.opensymphony.xwork.ActionContext;
27 import com.opensymphony.xwork.interceptor.component.ComponentManager;
28
29 import org.apache.log4j.Logger;
30 import org.efs.openreports.objects.*;
31 import org.efs.openreports.providers.*;
32 import org.efs.openreports.providers.persistence.ParameterPersistenceProvider;
33 import org.efs.openreports.util.*;
34
35 import net.sf.jasperreports.engine.design.JRDesignQuery;
36 import net.sf.jasperreports.engine.util.JRQueryExecuter;
37
38 public class ParameterProviderImpl
39     implements ParameterProvider, DataSourceProviderAware, DateProviderAware
40 {
41     protected static Logger log =
42         Logger.getLogger(ParameterProviderImpl.class.getName());
43
44     private ParameterPersistenceProvider paramPersistenceProvider;
45
46     private DataSourceProvider dataSourceProvider;
47     private DateProvider dateProvider;
48     
49     // constructor for Spring IOC
50
public ParameterProviderImpl(DataSourceProvider dataSourceProvider, DateProvider dateProvider) throws ProviderException
51     {
52         this.dataSourceProvider = dataSourceProvider;
53         this.dateProvider = dateProvider;
54         
55         init();
56     }
57
58     // constructor for WebWork IOC
59
public ParameterProviderImpl() throws ProviderException
60     {
61         ComponentManager container =
62             (ComponentManager) ActionContext.getContext().get(
63                 "com.opensymphony.xwork.interceptor.component.ComponentManager");
64
65         container.initializeObject(this);
66         
67         init();
68     }
69     
70     protected void init() throws ProviderException
71     {
72         paramPersistenceProvider = new ParameterPersistenceProvider();
73         log.info("Created");
74     }
75
76     public ReportParameterValue[] getParamValues(
77         ReportParameter reportParameter,
78         Map parameters)
79         throws ProviderException
80     {
81         if (reportParameter.getType().equals(ReportParameter.QUERY_PARAM))
82         {
83             return getParamValuesFromDataSource(reportParameter, parameters);
84         }
85         else if (reportParameter.getType().equals(ReportParameter.LIST_PARAM))
86         {
87             return parseListValues(reportParameter);
88         }
89         else if (reportParameter.getType().equals(ReportParameter.BOOLEAN_PARAM))
90         {
91             // default to Yes/No
92
if (reportParameter.getData().indexOf("|") == -1)
93             {
94                 reportParameter.setData("true:Yes|false:No");
95             }
96             
97             return parseListValues(reportParameter);
98         }
99
100         throw new ProviderException(
101             reportParameter.getName()
102                 + ": param-type "
103                 + reportParameter.getType()
104                 + " not supported!");
105     }
106     
107     protected ReportParameterValue[] parseListValues(ReportParameter reportParameter)
108         throws ProviderException
109     {
110         StringTokenizer st =
111             new StringTokenizer(reportParameter.getData(), "|");
112
113         ReportParameterValue[] values =
114             new ReportParameterValue[st.countTokens()];
115
116         int index = 0;
117         while (st.hasMoreTokens())
118         {
119             String JavaDoc token = st.nextToken();
120             String JavaDoc id = token;
121             String JavaDoc description = token;
122             
123             StringTokenizer paramValue = new StringTokenizer(token,":");
124             if (paramValue.countTokens() == 2)
125             {
126                 id = paramValue.nextToken();
127                 description = paramValue.nextToken();
128             }
129                 
130             try
131             {
132                 if (reportParameter.getClassName().equals("java.lang.Integer"))
133                 {
134                     values[index] =
135                         new ReportParameterValue(Integer.valueOf(id), description);
136                 }
137                 else if (
138                     reportParameter.getClassName().equals("java.lang.Double"))
139                 {
140                     values[index] =
141                         new ReportParameterValue(Double.valueOf(id), description);
142                 }
143                 else if (
144                     reportParameter.getClassName().equals("java.lang.Long"))
145                 {
146                     values[index] =
147                         new ReportParameterValue(Long.valueOf(id), description);
148                 }
149                 else if (
150                     reportParameter.getClassName().equals(
151                         "java.math.BigDecimal"))
152                 {
153                     values[index] =
154                         new ReportParameterValue(new BigDecimal JavaDoc(id), description);
155                 }
156                 else
157                 {
158                     values[index] = new ReportParameterValue(id, description);
159                 }
160             }
161             catch (Exception JavaDoc e)
162             {
163                 throw new ProviderException(
164                     reportParameter.getData()
165                         + " contains invalid "
166                         + reportParameter.getClassName());
167             }
168
169             index++;
170         }
171
172         return values;
173     }
174
175     protected ReportParameterValue[] getParamValuesFromDataSource(
176         ReportParameter param,
177         Map parameters)
178         throws ProviderException
179     {
180         Connection conn = null;
181         PreparedStatement pStmt = null;
182         ResultSet rs = null;
183
184         try
185         {
186             ReportDataSource dataSource = param.getDataSource();
187             conn = dataSourceProvider.getConnection(dataSource.getId());
188
189             if (parameters == null || parameters.isEmpty())
190             {
191                 pStmt = conn.prepareStatement(param.getData());
192             }
193             else
194             {
195                 // Use JasperReports Query logic to parse parameters in chart
196
// queries
197

198                 JRDesignQuery query = new JRDesignQuery();
199                 query.setText(param.getData());
200
201                 // convert parameters to JRDesignParameters so they can be
202
// parsed
203
Map jrParameters = ORUtil.buildJRDesignParameters(parameters);
204
205                 pStmt =
206                     JRQueryExecuter.getStatement(
207                         query,
208                         jrParameters,
209                         parameters,
210                         conn);
211             }
212             
213             rs = pStmt.executeQuery();
214
215             ResultSetMetaData rsMetaData = rs.getMetaData();
216
217             boolean multipleColumns = false;
218             if (rsMetaData.getColumnCount() > 1)
219                 multipleColumns = true;
220
221             Vector v = new Vector();
222
223             while (rs.next())
224             {
225                 ReportParameterValue value = new ReportParameterValue();
226
227                 if (param.getClassName().equals("java.lang.String"))
228                 {
229                     value.setId(rs.getString(1));
230                 }
231                 else if (param.getClassName().equals("java.lang.Double"))
232                 {
233                     value.setId(new Double JavaDoc(rs.getDouble(1)));
234                 }
235                 else if (param.getClassName().equals("java.lang.Integer"))
236                 {
237                     value.setId(new Integer JavaDoc(rs.getInt(1)));
238                 }
239                 else if (param.getClassName().equals("java.lang.Long"))
240                 {
241                     value.setId(new Long JavaDoc(rs.getLong(1)));
242                 }
243                 else if (param.getClassName().equals("java.math.BigDecimal"))
244                 {
245                     value.setId(rs.getBigDecimal(1));
246                 }
247                 else if (param.getClassName().equals("java.util.Date"))
248                 {
249                     value.setId(rs.getDate(1));
250                 }
251                 else if (param.getClassName().equals("java.sql.Date"))
252                 {
253                     value.setId(rs.getDate(1));
254                 }
255                 else if (param.getClassName().equals("java.sql.Timestamp"))
256                 {
257                     value.setId(rs.getTimestamp(1));
258                 }
259
260                 if (multipleColumns)
261                 {
262                     value.setDescription(rs.getString(2));
263                 }
264
265                 v.add(value);
266             }
267
268             rs.close();
269
270             ReportParameterValue[] values = new ReportParameterValue[v.size()];
271             v.copyInto(values);
272
273             return values;
274         }
275         catch (Exception JavaDoc e)
276         {
277             throw new ProviderException(
278                 "Error retreiving param values from database: "
279                     + e.getMessage());
280         }
281         finally
282         {
283             try
284             {
285                 if (pStmt != null)
286                     pStmt.close();
287                 if (conn != null)
288                     conn.close();
289             }
290             catch (Exception JavaDoc c)
291             {
292                 log.error("Error closing");
293             }
294         }
295     }
296
297     protected void validateParameter(ReportParameter parameter, String JavaDoc value)
298         throws ProviderException
299     {
300         try
301         {
302             if (parameter.getClassName().equals("java.lang.Double"))
303             {
304                 new Double JavaDoc(value);
305             }
306             else if (parameter.getClassName().equals("java.lang.Integer"))
307             {
308                 new Integer JavaDoc(value);
309             }
310             else if (parameter.getClassName().equals("java.lang.Long"))
311             {
312                 new Long JavaDoc(value);
313             }
314             else if (parameter.getClassName().equals("java.math.BigDecimal"))
315             {
316                 new BigDecimal JavaDoc(value);
317             }
318             else if (
319                 parameter.getClassName().equals("java.util.Date")
320                     || parameter.getClassName().equals("java.sql.Date")
321                     || parameter.getClassName().equals("java.sql.Timestamp"))
322             {
323                 try
324                 {
325                     dateProvider.parseDate(value);
326                 }
327                 catch (Exception JavaDoc e)
328                 {
329                     throw new ProviderException(e.getMessage());
330                 }
331             }
332         }
333         catch (Exception JavaDoc e)
334         {
335             throw new ProviderException(
336                 parameter.getDescription() + " Invalid: " + e.getMessage());
337         }
338     }
339
340     protected Object JavaDoc parseParameter(ReportParameter parameter, String JavaDoc value)
341         throws ProviderException
342     {
343         try
344         {
345             if (parameter.getClassName().equals("java.lang.String"))
346             {
347                 return value;
348             }
349             else if (parameter.getClassName().equals("java.lang.Double"))
350             {
351                 return new Double JavaDoc(value);
352             }
353             else if (parameter.getClassName().equals("java.lang.Integer"))
354             {
355                 return new Integer JavaDoc(value);
356             }
357             else if (parameter.getClassName().equals("java.lang.Long"))
358             {
359                 return new Long JavaDoc(value);
360             }
361             else if (parameter.getClassName().equals("java.math.BigDecimal"))
362             {
363                 return new BigDecimal JavaDoc(value);
364             }
365             else if (parameter.getClassName().equals("java.util.Date"))
366             {
367                 return dateProvider.parseDate(value);
368             }
369             else if (parameter.getClassName().equals("java.sql.Date"))
370             {
371                 return dateProvider.parseDate(value);
372             }
373             else if (parameter.getClassName().equals("java.sql.Timestamp"))
374             {
375                 long time = dateProvider.parseDate(value).getTime();
376                 return new Timestamp(time);
377             }
378             else if (parameter.getClassName().equals("java.lang.Boolean"))
379             {
380                 return new Boolean JavaDoc(value);
381             }
382         }
383         catch (Exception JavaDoc e)
384         {
385             throw new ProviderException(
386                 parameter.getName() + " Invalid: " + e.getMessage());
387         }
388
389         throw new ProviderException(
390             parameter.getName() + " currently unsupported!");
391     }
392
393     public List getReportParameters(Report report, String JavaDoc type)
394         throws ProviderException
395     {
396         List parameters = new ArrayList();
397
398         List allParameters = report.getParameters();
399
400         if (allParameters != null)
401         {
402             Iterator iterator = allParameters.iterator();
403
404             while (iterator.hasNext())
405             {
406                 ReportParameterMap rpMap = (ReportParameterMap) iterator.next();
407
408                 if (rpMap.getReportParameter().getType().equals(type))
409                 {
410                     parameters.add(rpMap.getReportParameter());
411                 }
412             }
413         }
414
415         return parameters;
416     }
417
418     public void loadReportParameterValues(
419         List reportParameters,
420         Map parameters)
421         throws ProviderException
422     {
423         for (int i = 0; i < reportParameters.size(); i++)
424         {
425             ReportParameterMap rpMap =
426                 (ReportParameterMap) reportParameters.get(i);
427             ReportParameter rp = rpMap.getReportParameter();
428
429             try
430             {
431                 if (rp.getType().equals(ReportParameter.LIST_PARAM)
432                         || rp.getType().equals(ReportParameter.QUERY_PARAM)
433                         || rp.getType().equals(ReportParameter.BOOLEAN_PARAM))
434                 {
435                     if (rp.getValues() == null) // only load once...
436
{
437                         log.debug("loading parameter values: " + rp.getName());
438                         rp.setValues(getParamValues(rp, parameters));
439                     }
440                 }
441             }
442             catch (Exception JavaDoc e)
443             {
444                 log.error("Error loading parameter values: " + rp.getName());
445                 throw new ProviderException(
446                     "loadReportParameterValues: " + e.getMessage());
447             }
448         }
449     }
450
451     public Map getReportParametersMap(
452         List reportParameters,
453         Map origParameters)
454         throws ProviderException
455     {
456         Map map = new HashMap();
457
458         // if multiple selections, use origParameters; otherwise, use
459
// parameters
460
Map parameters = new SingleValueMap(origParameters);
461
462         Iterator iterator = reportParameters.iterator();
463         while (iterator.hasNext())
464         {
465             ReportParameterMap rpMap = (ReportParameterMap) iterator.next();
466
467             ReportParameter reportParameter = rpMap.getReportParameter();
468
469             // if we are expecting multiple selections, convert the array of
470
// parameters
471
// into a comma-delimited string so that it can be used in the SQL
472
// where
473
// clause. Otherwise, just expect a simple String
474
if (reportParameter.isMultipleSelect())
475             {
476                 Object JavaDoc[] values =
477                     (String JavaDoc[]) origParameters.get(reportParameter.getName());
478
479                 // load up the StringBuffer with the multiple selections.
480
String JavaDoc s = buildMultipleSelectString(reportParameter, values);
481
482                 // save the parameter into the Map
483
if (rpMap.isRequired() || s.length() > 0)
484                 {
485                     map.put(reportParameter.getName(), s);
486                     
487                     log.debug(
488                             reportParameter.getName()
489                                 + " => "
490                                 + map.get(reportParameter.getName()));
491                 }
492             }
493             else
494             {
495                 String JavaDoc value =
496                     (String JavaDoc) parameters.get(reportParameter.getName());
497                 
498                 if (value != null)
499                 {
500                     try
501                     {
502                         Object JavaDoc object = parseParameter(reportParameter, value);
503                         
504                         if (rpMap.isRequired() || value.length() > 0)
505                         {
506                             map.put(reportParameter.getName(), object);
507                         }
508                     }
509                     catch (Exception JavaDoc e)
510                     {
511                         log.warn(
512                             "Error setting parameter: "
513                                 + reportParameter.getName()
514                                 + " : "
515                                 + e.getMessage());
516                     }
517                 }
518             }
519         }
520         
521         // always pass drilldown chart parameter to reports if it exists
522

523         String JavaDoc value = (String JavaDoc) parameters.get(ReportChart.DRILLDOWN_PARAMETER);
524         
525         if (value != null) map.put(ReportChart.DRILLDOWN_PARAMETER, parameters
526                 .get(ReportChart.DRILLDOWN_PARAMETER));
527         
528         //
529

530         return map;
531     }
532
533     private String JavaDoc buildMultipleSelectString(
534         ReportParameter reportParameter,
535         Object JavaDoc[] values)
536     {
537         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
538         
539         if (values[0].equals("")) return "";
540
541         for (int j = 0; j < values.length; j++)
542         {
543             String JavaDoc value = "";
544
545             if (values[j] instanceof ReportParameterValue)
546             {
547                 value = ((ReportParameterValue) values[j]).getId().toString();
548             }
549             else
550             {
551                 value = (String JavaDoc) values[j];
552             }
553
554             if (j > 0)
555             {
556                 sb.append(",");
557             }
558             
559             if (reportParameter.getClassName().equals("java.lang.String"))
560             {
561                 sb.append("'" + value + "'");
562             }
563             else
564             {
565                 sb.append(value);
566             }
567         }
568
569         return sb.toString();
570     }
571
572     public boolean validateParameters(List reportParameters, Map parameters)
573         throws ProviderException
574     {
575         parameters = new SingleValueMap(parameters);
576
577         if (reportParameters != null && reportParameters.size() > 0)
578         {
579             Iterator iterator = reportParameters.iterator();
580             while (iterator.hasNext())
581             {
582                 ReportParameterMap rpMap = (ReportParameterMap) iterator.next();
583
584                 ReportParameter param = rpMap.getReportParameter();
585
586                 if (!parameters.containsKey(param.getName())
587                     && rpMap.isRequired())
588                 {
589                     throw new ProviderException(LocalStrings
590                             .getString(LocalStrings.ERROR_PARAMETER_REQUIRED)
591                             + ": " + param.getDescription());
592                 }
593
594                 if (param.getType().equals(ReportParameter.TEXT_PARAM)
595                     || param.getType().equals(ReportParameter.DATE_PARAM))
596                 {
597                     String JavaDoc value = (String JavaDoc) parameters.get(param.getName());
598
599                     if (value != null && value.length() > 0)
600                     {
601                         try
602                         {
603                             validateParameter(param, value);
604                         }
605                         catch (Exception JavaDoc e)
606                         {
607                             throw new ProviderException(e.getMessage());
608                         }
609                     }
610                     else if (rpMap.isRequired())
611                     {
612                         throw new ProviderException(LocalStrings
613                                 .getString(LocalStrings.ERROR_PARAMETER_REQUIRED)
614                                 + ": " + param.getDescription());
615                     }
616                 }
617             }
618         }
619
620         return true;
621     }
622
623     public List getAvailableParameters(Report report) throws ProviderException
624     {
625         List parameters = getReportParameters();
626
627         Iterator iterator = parameters.iterator();
628         while (iterator.hasNext())
629         {
630             ReportParameter rp = (ReportParameter) iterator.next();
631
632             Iterator reportIterator = report.getParameters().iterator();
633             while (reportIterator.hasNext())
634             {
635                 ReportParameterMap rpMap =
636                     (ReportParameterMap) reportIterator.next();
637
638                 if (rp.getId().equals(rpMap.getReportParameter().getId()))
639                 {
640                     parameters.remove(rp);
641                     iterator = parameters.iterator();
642                 }
643             }
644         }
645
646         return parameters;
647     }
648
649     public ReportParameter getReportParameter(Integer JavaDoc id)
650         throws ProviderException
651     {
652         return paramPersistenceProvider.getReportParameter(id);
653     }
654     
655     public ReportParameter getReportParameter(String JavaDoc name)
656         throws ProviderException
657     {
658         return paramPersistenceProvider.getReportParameter(name);
659     }
660
661     public List getReportParameters() throws ProviderException
662     {
663         return paramPersistenceProvider.getReportParameters();
664     }
665
666     public ReportParameter insertReportParameter(ReportParameter reportParameter)
667         throws ProviderException
668     {
669         return paramPersistenceProvider.insertReportParameter(reportParameter);
670     }
671
672     public void updateReportParameter(ReportParameter reportParameter)
673         throws ProviderException
674     {
675         paramPersistenceProvider.updateReportParameter(reportParameter);
676     }
677
678     public void deleteReportParameter(ReportParameter reportParameter)
679         throws ProviderException
680     {
681         paramPersistenceProvider.deleteReportParameter(reportParameter);
682     }
683
684     public void setDataSourceProvider(DataSourceProvider dataSourceProvider)
685     {
686         this.dataSourceProvider = dataSourceProvider;
687     }
688
689     public void setDateProvider(DateProvider dateProvider)
690     {
691         this.dateProvider = dateProvider;
692     }
693
694 }
Popular Tags