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: * URLFilter.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.filter;
030:
031: import java.io.File;
032: import java.net.MalformedURLException;
033: import java.net.URL;
034:
035: import org.jfree.report.function.ExpressionRuntime;
036: import org.jfree.util.Log;
037:
038: /**
039: * The URLFilter forms URLs from Strings ,Files and URLs. If an URL is relative, the
040: * missing contents can be obtained by a default url, called the baseURL.
041: * <p/>
042: *
043: * @author Thomas Morgner
044: */
045: public class URLFilter implements DataFilter {
046: /**
047: * The datasource used to form the urls. This datasource should return strings, files or
048: * urls
049: */
050: private DataSource source;
051:
052: /**
053: * The base url is used to form the complete url if the given url is relative.
054: *
055: * @see java.net.URL#URL(java.net.URL, java.lang.String)
056: */
057: private URL baseURL;
058:
059: /**
060: * DefaultConstructor.
061: */
062: public URLFilter() {
063: }
064:
065: /**
066: * Returns the data source for the filter.
067: *
068: * @return The data source.
069: */
070: public DataSource getDataSource() {
071: return source;
072: }
073:
074: /**
075: * Sets the data source.
076: *
077: * @param ds The data source.
078: */
079: public void setDataSource(final DataSource ds) {
080: if (ds == null) {
081: throw new NullPointerException();
082: }
083:
084: source = ds;
085: }
086:
087: /**
088: * Tries to form a url from the object returned from the datasource. This function will
089: * return null if the datasource is null or returned null when getValue was called.
090: * <p/>
091: * Null is also returned if the datasources value is not an url, a String or a file. If
092: * the creation of the url failed with an MalformedURLException or the datasource
093: * returned a file which is not readable, also null is returned.
094: *
095: * @param runtime the expression runtime that is used to evaluate formulas and expressions when computing the value of
096: * this filter.
097: * @return created url or null if something went wrong on url creation.
098: */
099: public Object getValue(final ExpressionRuntime runtime) {
100: if (getDataSource() == null) {
101: return null;
102: }
103:
104: final Object o = getDataSource().getValue(runtime);
105: if (o == null) {
106: return null;
107: }
108: if (o instanceof URL) {
109: return o;
110: }
111:
112: try {
113: if (o instanceof File) {
114: final File f = (File) o;
115: if (f.canRead()) {
116: return f.toURL();
117: }
118: } else if (o instanceof String) {
119: if (getBaseURL() == null) {
120: return new URL((String) o);
121: } else {
122: return new URL(getBaseURL(), (String) o);
123: }
124: }
125: } catch (MalformedURLException mfe) {
126: Log.info("URLFilter.getValue(): MalformedURLException!");
127: }
128: return null;
129:
130: }
131:
132: /**
133: * Gets the base url used to make relative URLs absolute.
134: *
135: * @return the base url used to complete relative urls.
136: */
137: public URL getBaseURL() {
138: return baseURL;
139: }
140:
141: /**
142: * Defines the base url used to complete relative urls.
143: *
144: * @param baseURL the base URL.
145: */
146: public void setBaseURL(final URL baseURL) {
147: this .baseURL = baseURL;
148: }
149:
150: /**
151: * Creates a clone of the URL filter.
152: *
153: * @return A clone.
154: *
155: * @throws CloneNotSupportedException should never happen.
156: */
157: public Object clone() throws CloneNotSupportedException {
158: final URLFilter f = (URLFilter) super .clone();
159: if (source != null) {
160: f.source = (DataSource) source.clone();
161: }
162: return f;
163: }
164:
165: }
|