001: /*
002: * ============================================================================
003: * GNU Lesser General Public License
004: * ============================================================================
005: *
006: * JasperReports - Free Java report-generating library.
007: * Copyright (C) 2001-2006 JasperSoft Corporation http://www.jaspersoft.com
008: *
009: * This library is free software; you can redistribute it and/or
010: * modify it under the terms of the GNU Lesser General Public
011: * License as published by the Free Software Foundation; either
012: * 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,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: * Lesser General Public License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
022: *
023: * JasperSoft Corporation
024: * 303 Second Street, Suite 450 North
025: * San Francisco, CA 94107
026: * http://www.jaspersoft.com
027: */
028: package net.sf.jasperreports.engine.design;
029:
030: import java.beans.PropertyChangeListener;
031: import java.beans.PropertyChangeSupport;
032: import java.util.ArrayList;
033: import java.util.List;
034:
035: import net.sf.jasperreports.engine.JRConstants;
036: import net.sf.jasperreports.engine.JRQueryChunk;
037: import net.sf.jasperreports.engine.base.JRBaseQuery;
038: import net.sf.jasperreports.engine.util.JRQueryChunkHandler;
039: import net.sf.jasperreports.engine.util.JRQueryParser;
040:
041: /**
042: * @author Teodor Danciu (teodord@users.sourceforge.net)
043: * @version $Id: JRDesignQuery.java 1683 2007-03-29 16:04:15Z lucianc $
044: */
045: public class JRDesignQuery extends JRBaseQuery {
046: /** Property change support mechanism. */
047: private transient PropertyChangeSupport propSupport;
048:
049: /**
050: *
051: */
052: private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
053:
054: public static final String PROPERTY_LANGUAGE = "language";
055:
056: /**
057: *
058: */
059: protected List chunks = new ArrayList();
060:
061: private transient final JRQueryChunkHandler chunkAdder = new JRQueryChunkHandler() {
062: public void handleParameterChunk(String text) {
063: addParameterChunk(text);
064: }
065:
066: public void handleParameterClauseChunk(String text) {
067: addParameterClauseChunk(text);
068: }
069:
070: public void handleTextChunk(String text) {
071: addTextChunk(text);
072: }
073:
074: public void handleClauseChunk(String[] tokens) {
075: addClauseChunk(tokens);
076: }
077: };
078:
079: /**
080: *
081: */
082: public JRQueryChunk[] getChunks() {
083: JRQueryChunk[] chunkArray = null;
084:
085: if (chunks != null && chunks.size() > 0) {
086: chunkArray = new JRQueryChunk[chunks.size()];
087: chunks.toArray(chunkArray);
088: }
089:
090: return chunkArray;
091: }
092:
093: /**
094: *
095: */
096: public void setChunks(List chunks) {
097: this .chunks = chunks;
098: }
099:
100: /**
101: *
102: */
103: public void addChunk(JRDesignQueryChunk chunk) {
104: this .chunks.add(chunk);
105: }
106:
107: /**
108: *
109: */
110: public void addTextChunk(String text) {
111: JRDesignQueryChunk chunk = new JRDesignQueryChunk();
112: chunk.setType(JRQueryChunk.TYPE_TEXT);
113: chunk.setText(text);
114:
115: this .chunks.add(chunk);
116: }
117:
118: /**
119: *
120: */
121: public void addParameterChunk(String text) {
122: JRDesignQueryChunk chunk = new JRDesignQueryChunk();
123: chunk.setType(JRQueryChunk.TYPE_PARAMETER);
124: chunk.setText(text);
125:
126: this .chunks.add(chunk);
127: }
128:
129: /**
130: *
131: */
132: public void addParameterClauseChunk(String text) {
133: JRDesignQueryChunk chunk = new JRDesignQueryChunk();
134: chunk.setType(JRQueryChunk.TYPE_PARAMETER_CLAUSE);
135: chunk.setText(text);
136:
137: this .chunks.add(chunk);
138: }
139:
140: /**
141: * Adds a {@link JRQueryChunk#TYPE_CLAUSE_TOKENS clause chunk} to the query.
142: *
143: * @param tokens the clause tokens
144: * @see JRDesignQueryChunk#setTokens(String[])
145: */
146: public void addClauseChunk(String[] tokens) {
147: JRDesignQueryChunk chunk = new JRDesignQueryChunk();
148: chunk.setType(JRQueryChunk.TYPE_CLAUSE_TOKENS);
149: chunk.setTokens(tokens);
150:
151: this .chunks.add(chunk);
152: }
153:
154: /**
155: *
156: */
157: public void setText(String text) {
158: chunks = new ArrayList();
159: JRQueryParser.instance().parse(text, chunkAdder);
160: }
161:
162: /**
163: * Sets the query language.
164: *
165: * @param language the query language
166: * @see net.sf.jasperreports.engine.JRQuery#getLanguage()
167: */
168: public void setLanguage(String language) {
169: String oldValue = this .language;
170: this .language = language;
171: getPropertyChangeSupport().firePropertyChange(
172: PROPERTY_LANGUAGE, oldValue, this .language);
173: }
174:
175: /**
176: * Get the property change support object for this class. Because the
177: * property change support object has to be transient, it may need to be
178: * created.
179: *
180: * @return the property change support object.
181: */
182: protected PropertyChangeSupport getPropertyChangeSupport() {
183: if (propSupport == null) {
184: propSupport = new PropertyChangeSupport(this );
185: }
186: return propSupport;
187: }
188:
189: /**
190: * Add a property listener to listen to all properties of this class.
191: * @param l The property listener to add.
192: * @see #removePropertyChangeListener(PropertyChangeListener)
193: */
194: public void addPropertyChangeListener(PropertyChangeListener l) {
195: getPropertyChangeSupport().addPropertyChangeListener(l);
196: }
197:
198: /**
199: * Add a property listener to receive property change events for only one specific
200: * property.
201: * @param propName The property to listen to.
202: * @param l The property listener to add.
203: * @see #removePropertyChangeListener(String, PropertyChangeListener)
204: */
205: public void addPropertyChangeListener(String propName,
206: PropertyChangeListener l) {
207: getPropertyChangeSupport().addPropertyChangeListener(propName,
208: l);
209: }
210:
211: /**
212: * Remove a property change listener registered for all properties.
213: *
214: * This will only remove listeners that were added through the
215: * {@link #addPropertyChangeListener(PropertyChangeListener) addPropertyChangeListener(PropertyChangeListener)}
216: * method.
217: *
218: * @param l The listener to remove.
219: */
220: public void removePropertyChangeListener(PropertyChangeListener l) {
221: getPropertyChangeSupport().removePropertyChangeListener(l);
222: }
223:
224: /**
225: * Remove a property change listener registered for a specific property.
226: *
227: * @param propName The property to listen to.
228: * @param l The listener to remove.
229: */
230: public void removePropertyChangeListener(String propName,
231: PropertyChangeListener l) {
232: getPropertyChangeSupport().removePropertyChangeListener(
233: propName, l);
234: }
235: }
|