001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * NamedStaticDataFactory.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.modules.misc.datafactory;
030:
031: import java.util.HashMap;
032: import javax.swing.table.TableModel;
033:
034: import org.jfree.report.DataFactory;
035: import org.jfree.report.DataRow;
036: import org.jfree.report.ReportDataFactoryException;
037:
038: /**
039: * A NamedStaticDataFactory provides an query-aliasing facility to decouple
040: * the report definitions from the underlying datasource implentation. The
041: * reports no longer need to specify the raw-query (which is in fact just an
042: * implementation detail) and can use a symbolic name in the report definition
043: * instead.
044: *
045: * @author Thomas Morgner
046: */
047: public class NamedStaticDataFactory extends StaticDataFactory {
048: private HashMap querymappings;
049:
050: /**
051: * Defaultconstructor.
052: */
053: public NamedStaticDataFactory() {
054: querymappings = new HashMap();
055: }
056:
057: /**
058: * Adds an query-alias to this factory.
059: *
060: * @param alias the alias
061: * @param queryString the real query string that should be used when the
062: * alias is specified as query.
063: */
064: public void setQuery(final String alias, final String queryString) {
065: if (queryString == null) {
066: querymappings.remove(alias);
067: } else {
068: querymappings.put(alias, queryString);
069: }
070: }
071:
072: /**
073: * Derives the factory. The derived factory does no longer share properties
074: * with its parent and changes to either factory will not be reflected in the
075: * other factory.
076: *
077: * @return the derived factory.
078: * @throws ReportDataFactoryException in case something goes wrong.
079: */
080: public DataFactory derive() throws ReportDataFactoryException {
081: try {
082: return (DataFactory) super .clone();
083: } catch (CloneNotSupportedException e) {
084: throw new ReportDataFactoryException(
085: "Failed to deriveForAdvance the factory", e); //$NON-NLS-1$
086: }
087: }
088:
089: /**
090: * Returns a clone of the factory.
091: *
092: * @return the clone.
093: * @throws CloneNotSupportedException if cloning failed.
094: */
095: public Object clone() throws CloneNotSupportedException {
096: final NamedStaticDataFactory nds = (NamedStaticDataFactory) super
097: .clone();
098: nds.querymappings = (HashMap) querymappings.clone();
099: return nds;
100: }
101:
102: /**
103: * Queries a datasource. The string 'query' defines the name of the query. The
104: * Parameterset given here may contain more data than actually needed.
105: * <p/>
106: * The dataset may change between two calls, do not assume anything!
107: *
108: * @param query the alias-name of the query.
109: * @param parameters the set of parameters.
110: * @return the tablemodel.
111: */
112: public TableModel queryData(final String query,
113: final DataRow parameters) throws ReportDataFactoryException {
114: if (query == null) {
115: throw new NullPointerException("Query is null."); //$NON-NLS-1$
116: }
117: final String realQuery = getQuery(query);
118: if (realQuery == null) {
119: throw new ReportDataFactoryException(
120: "Query '" + query + "' is not recognized."); //$NON-NLS-1$ //$NON-NLS-2$
121: }
122: return super .queryData(realQuery, parameters);
123: }
124:
125: /**
126: * Returns the query for the given alias-name or null, if there is no such alias
127: * defined.
128: *
129: * @param name the alias name.
130: * @return the real query or null.
131: */
132: public String getQuery(final String name) {
133: return (String) querymappings.get(name);
134: }
135:
136: /**
137: * Returns all known alias-names.
138: *
139: * @return all alias-names as string-array.
140: */
141: public String[] getQueryNames() {
142: return (String[]) querymappings.keySet().toArray(
143: new String[querymappings.size()]);
144: }
145: }
|