001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.jmeter.protocol.http.parser;
020:
021: import java.net.MalformedURLException;
022: import java.net.URL;
023: import java.util.Collection;
024: import java.util.Iterator;
025:
026: import org.apache.commons.lang.StringEscapeUtils;
027:
028: /**
029: * Collection class designed for handling URLs
030: *
031: * Before a URL is added to the collection, it is wrapped in a URLString class.
032: * The iterator unwraps the URL before return.
033: *
034: * N.B. Designed for use by HTMLParser, so is not a full implementation - e.g.
035: * does not support remove()
036: *
037: * @version $Revision: 519689 $ $Date: 2007-03-18 20:47:27 +0000 (Sun, 18 Mar 2007) $
038: */
039: public class URLCollection {
040: Collection coll;
041:
042: // Inaccessible default constructor
043: private URLCollection() {
044: }
045:
046: /**
047: * Creates a new URLCollection from an existing Collection
048: *
049: */
050: public URLCollection(Collection c) {
051: coll = c;
052: }
053:
054: /**
055: * Adds the URL to the Collection, first wrapping it in the URLString class
056: *
057: * @param u
058: * URL to add
059: * @return boolean condition returned by the add() method of the underlying
060: * collection
061: */
062: public boolean add(URL u) {
063: return coll.add(new URLString(u));
064: }
065:
066: /*
067: * Adds the string to the Collection, first wrapping it in the URLString
068: * class
069: *
070: * @param s string to add @return boolean condition returned by the add()
071: * method of the underlying collection
072: */
073: private boolean add(String s) {
074: return coll.add(new URLString(s));
075: }
076:
077: /**
078: * Convenience method for adding URLs to the collection If the url parameter
079: * is null or empty, nothing is done
080: *
081: * @param url
082: * String, may be null or empty
083: * @param baseUrl
084: * @return boolean condition returned by the add() method of the underlying
085: * collection
086: */
087: public boolean addURL(String url, URL baseUrl) {
088: if (url == null || url.length() == 0)
089: return false;
090: //url.replace('+',' ');
091: url = StringEscapeUtils.unescapeXml(url);
092: boolean b = false;
093: try {
094: b = this .add(new URL(baseUrl, url));
095: } catch (MalformedURLException mfue) {
096: // TODO log a warning message?
097: b = this .add(url);// Add the string if cannot create the URL
098: }
099: return b;
100: }
101:
102: public Iterator iterator() {
103: return new UrlIterator(coll.iterator());
104: }
105:
106: /*
107: * Private iterator used to unwrap the URL from the URLString class
108: *
109: */
110: private static class UrlIterator implements Iterator {
111: Iterator iter;
112:
113: UrlIterator(Iterator i) {
114: iter = i;
115: }
116:
117: public boolean hasNext() {
118: return iter.hasNext();
119: }
120:
121: /*
122: * Unwraps the URLString class to return the URL
123: */
124: public Object next() {
125: return ((URLString) iter.next()).getURL();
126: }
127:
128: public void remove() {
129: throw new UnsupportedOperationException();
130: }
131: }
132: }
|