You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by cz...@apache.org on 2001/11/13 16:04:48 UTC
cvs commit: jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source SourceParameters.java SourceResolver.java SourceResolverImpl.java URLSource.java
cziegeler 01/11/13 07:04:48
Modified: src/scratchpad/org/apache/avalon/excalibur/source
SourceResolver.java SourceResolverImpl.java
URLSource.java
Added: src/scratchpad/org/apache/avalon/excalibur/source
SourceParameters.java
Log:
Added parameterizing of Sources
Revision Changes Path
1.3 +16 -1 jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source/SourceResolver.java
Index: SourceResolver.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source/SourceResolver.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SourceResolver.java 2001/11/13 12:48:45 1.2
+++ SourceResolver.java 2001/11/13 15:04:48 1.3
@@ -16,7 +16,7 @@
* Base interface for resolving a source by system identifiers.
*
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Revision: 1.2 $ $Date: 2001/11/13 12:48:45 $
+ * @version CVS $Revision: 1.3 $ $Date: 2001/11/13 15:04:48 $
*/
public interface SourceResolver
@@ -45,6 +45,21 @@
* Get a <code>Source</code> object.
*/
Source resolve(URL base, String location)
+ throws MalformedURLException, IOException;
+
+ /**
+ * Get a <code>Source</code> object.
+ */
+ Source resolve(String location,
+ SourceParameters parameters)
+ throws MalformedURLException, IOException;
+
+ /**
+ * Get a <code>Source</code> object.
+ */
+ Source resolve(URL base,
+ String location,
+ SourceParameters parameters)
throws MalformedURLException, IOException;
}
1.3 +22 -2 jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source/SourceResolverImpl.java
Index: SourceResolverImpl.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source/SourceResolverImpl.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SourceResolverImpl.java 2001/11/13 12:48:45 1.2
+++ SourceResolverImpl.java 2001/11/13 15:04:48 1.3
@@ -32,7 +32,7 @@
/**
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version $Id: SourceResolverImpl.java,v 1.2 2001/11/13 12:48:45 cziegeler Exp $
+ * @version $Id: SourceResolverImpl.java,v 1.3 2001/11/13 15:04:48 cziegeler Exp $
*/
public class SourceResolverImpl
extends AbstractLoggable
@@ -146,13 +146,33 @@
*/
public Source resolve(String location)
throws MalformedURLException, IOException {
- return this.resolve(this.baseURL, location);
+ return this.resolve(this.baseURL, location, null);
}
/**
* Get a <code>Source</code> object.
*/
+ public Source resolve(String location,
+ SourceParameters parameters)
+ throws MalformedURLException, IOException {
+ return this.resolve(this.baseURL, location, parameters);
+ }
+
+ /**
+ * Get a <code>Source</code> object.
+ */
public Source resolve(URL base, String location)
+ throws MalformedURLException, IOException {
+ return this.resolve(base, location, null);
+ }
+
+
+ /**
+ * Get a <code>Source</code> object.
+ */
+ public Source resolve(URL base,
+ String location,
+ SourceParameters parameters)
throws MalformedURLException, IOException {
this.getLogger().debug("Resolving '"+location+"' in context '" + base + "'");
if (location == null) throw new MalformedURLException("Invalid System ID");
1.3 +1 -3 jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source/URLSource.java
Index: URLSource.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source/URLSource.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- URLSource.java 2001/11/13 12:48:45 1.2
+++ URLSource.java 2001/11/13 15:04:48 1.3
@@ -25,7 +25,7 @@
* Description of a source which is described by an URL.
*
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Revision: 1.2 $ $Date: 2001/11/13 12:48:45 $
+ * @version CVS $Revision: 1.3 $ $Date: 2001/11/13 15:04:48 $
*/
public final class URLSource implements ModifiableSource, XMLizable {
@@ -226,7 +226,6 @@
/**
* BASE 64 encoding.
* See also RFC 1421
- * @since 1.2
*/
public static String encodeBASE64 ( String s ) {
return encodeBASE64 ( s.getBytes ( ) );
@@ -235,7 +234,6 @@
/**
* BASE 64 encoding.
* See also RFC 1421
- * @since 1.2
*/
public static String encodeBASE64 ( byte [ ] octetString ) {
int bits24;
1.1 jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/source/SourceParameters.java
Index: SourceParameters.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.avalon.excalibur.source;
import org.apache.avalon.framework.parameters.Parameters;
import java.io.*;
import java.util.*;
/**
* This class is holds parameters for a <code>Source</code> object.
* It differs from the usual Parameters object because in can hold
* more than one value for a parameter.
*
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
* @version $Id: SourceParameters.java,v 1.1 2001/11/13 15:04:48 cziegeler Exp $
*/
public final class SourceParameters
implements Serializable {
/** The parameter names are the keys and the value is a List object */
private Map names = new HashMap(5);
/**
* Decode the string
*/
private String parseName(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '+':
sb.append(' ');
break;
case '%':
try {
sb.append((char) Integer.parseInt(s.substring(i+1, i+3),
16));
i += 2;
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
} catch (StringIndexOutOfBoundsException e) {
String rest = s.substring(i);
sb.append(rest);
if (rest.length()==2)
i++;
}
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}
/**
* Standard Constructor
*/
public SourceParameters() {
}
/**
* Construct a new object from a queryString
*/
public SourceParameters(String queryString) {
if (queryString != null) {
StringTokenizer st = new StringTokenizer(queryString, "&");
while (st.hasMoreTokens()) {
String pair = (String)st.nextToken();
int pos = pair.indexOf('=');
if (pos != -1) {
this.setParameter(this.parseName(pair.substring(0, pos)),
this.parseName(pair.substring(pos+1, pair.length())));
}
}
}
}
/**
* Add a parameter.
* The parameter is added with the given value.
* @param name The name of the parameter.
* @param value The value of the parameter.
*/
private void setParameter(String name, String value) {
ArrayList list;
if (names.containsKey(name) == true) {
list = (ArrayList)names.get(name);
} else {
list = new ArrayList(3);
names.put(name, list);
}
list.add(value);
}
/**
* Get the value of a parameter.
* @param name The name of the parameter.
* @return The value of the first parameter with the name
* or <CODE>null</CODE>
*/
public String getParameter(String name) {
if (names.containsKey(name) == true) {
return (String)((ArrayList)names.get(name)).get(0);
}
return null;
}
/**
* Get the value of a parameter.
* @param name The name of the parameter.
* @param defaultValue The default value if the parameter does not exist.
* @return The value of the first parameter with the name
* or <CODE>defaultValue</CODE>
*/
public String getParameter(String name, String defaultValue) {
if (names.containsKey(name) == true) {
return (String)((ArrayList)names.get(name)).get(0);
}
return defaultValue;
}
/**
* Get the integer value of a parameter.
* @param name The name of the parameter.
* @param defaultValue The default value if the parameter does not exist.
* @return The value of the first parameter with the name
* or <CODE>defaultValue</CODE>
*/
public int getParameterAsInteger(String name, int defaultValue) {
if (names.containsKey(name) == true) {
return new Integer((String)((ArrayList)names.get(name)).get(0)).intValue();
}
return defaultValue;
}
/**
* Get the boolean value of a parameter.
* @param name The name of the parameter.
* @param defaultValue The default value if the parameter does not exist.
* @return The value of the first parameter with the name
* or <CODE>defaultValue</CODE>
*/
public boolean getParameterAsBoolean(String name, boolean defaultValue) {
if (names.containsKey(name) == true) {
return new Boolean((String)((ArrayList)names.get(name)).get(0)).booleanValue();
}
return defaultValue;
}
/**
* Test if a value for this parameter exists.
* @param name The name of the parameter.
* @return <CODE>true</CODE> if a value exists, otherwise <CODE>false</CODE>
*/
public boolean containsParameter(String name) {
return names.containsKey(name);
}
/**
* Get all values of a parameter.
* @param name The name of the parameter.
* @return Iterator for the (String) values or null if the parameter
* is not defined.
*/
public Iterator getParameterValues(String name) {
if (names.containsKey(name) == true) {
ArrayList list = (ArrayList)names.get(name);
return list.iterator();
}
return null;
}
/**
* Get all parameter names.
* @return Iterator for the (String) parameter names.
*/
public Iterator getParameterNames() {
return names.keySet().iterator();
}
/**
* Create a Parameters object.
* The first value of each parameter is added to the Parameters object.
* @return An Parameters object - if no parameters are defined this is an
* empty object.
*/
public Parameters getFirstParameters() {
Parameters result = new Parameters();
Iterator iter = this.getParameterNames();
String parName;
while (iter.hasNext()) {
parName = (String)iter.next();
result.setParameter(parName, this.getParameter(parName));
}
return result;
}
/**
* Build a query string.
* The query string can e.g. be used for http connections.
* @return A query string which contains for each parameter/value pair
* a part, like "parameter=value" separated by "&".
* If no parameter is defined <CODE>null</CODE> is returned.
*/
public String getQueryString() {
StringBuffer result = new StringBuffer();
Iterator iter = this.names.keySet().iterator();
Iterator listIterator;
String key;
String value;
boolean first = true;
while (iter.hasNext() == true) {
key = (String)iter.next();
listIterator = ((ArrayList)names.get(key)).iterator();
while (listIterator.hasNext() == true) {
if (first == false) result.append('&');
value = (String)listIterator.next();
result.append(key).append('=').append(value);
first = false;
}
}
return (result.length() == 0 ? null : result.toString());
}
/**
* Build a query string and encode each parameter value
* The query string can e.g. be used for http connections.
* @return A query string which contains for each parameter/value pair
* a part, like "parameter=value" separated by "&".
* If no parameter is defined <CODE>null</CODE> is returned.
*/
public String getEncodedQueryString() {
StringBuffer result = new StringBuffer();
Iterator iter = this.names.keySet().iterator();
Iterator listIterator;
String key;
String value;
boolean first = true;
while (iter.hasNext() == true) {
key = (String)iter.next();
listIterator = ((ArrayList)names.get(key)).iterator();
while (listIterator.hasNext() == true) {
if (first == false) result.append('&');
value = (String)listIterator.next();
result.append(key).append('=').append(this.encode(value));
first = false;
}
}
return (result.length() == 0 ? null : result.toString());
}
/**
* Add all parameters from the incoming parameters object.
*/
public void add(SourceParameters parameters) {
Iterator names = parameters.getParameterNames();
Iterator values;
String name;
String value;
while (names.hasNext() == true) {
name = (String)names.next();
values = parameters.getParameterValues(name);
while (values.hasNext() == true) {
value = (String)values.next();
this.setParameter(name, value);
}
}
}
/**
* Overriding toString
*/
public String toString() {
StringBuffer buffer = new StringBuffer("SourceParameters: {");
Iterator names = this.getParameterNames();
String name;
boolean firstName = true;
Iterator values;
String value;
boolean firstValue;
while (names.hasNext() == true) {
name = (String)names.next();
if (firstName == false) {
buffer.append(", ");
} else {
firstName = false;
}
buffer.append(name).append(" = (");
values = this.getParameterValues(name);
firstValue = true;
while (values.hasNext() == true) {
value = (String)values.next();
if (firstValue == false) {
buffer.append(", ");
} else {
firstValue = false;
}
buffer.append(value);
}
buffer.append(')');
}
buffer.append('}');
return buffer.toString();
}
/**
* Returns a copy of the parameters object.
*/
public Object clone() {
SourceParameters newObject = new SourceParameters();
Iterator names = this.getParameterNames();
Iterator values;
String name, value;
while (names.hasNext() == true) {
name = (String)names.next();
values = this.getParameterValues(name);
while (values.hasNext() == true) {
value = (String)values.next();
newObject.setParameter(name, value);
}
}
return newObject;
}
/**
* Test if there are any parameters.
*/
public boolean hasParameters() {
return (this.names.size() > 0);
}
/**
* Set the value of this parameter to the given value.
* Remove all other values for this parameter.
*/
public void setSingleParameterValue(String name, String value) {
this.removeParameter(name);
this.setParameter(name, value);
}
/**
* Remove all values for this parameter
*/
public void removeParameter(String name) {
if (this.names.containsKey(name) == true) {
this.names.remove(name);
}
}
/** A BitSet defining the characters which don't need encoding */
static BitSet charactersDontNeedingEncoding;
static final int characterCaseDiff = ('a' - 'A');
/** Initialize the BitSet */
static {
charactersDontNeedingEncoding = new BitSet(256);
int i;
for (i = 'a'; i <= 'z'; i++) {
charactersDontNeedingEncoding.set(i);
}
for (i = 'A'; i <= 'Z'; i++) {
charactersDontNeedingEncoding.set(i);
}
for (i = '0'; i <= '9'; i++) {
charactersDontNeedingEncoding.set(i);
}
charactersDontNeedingEncoding.set(' ');
charactersDontNeedingEncoding.set('-');
charactersDontNeedingEncoding.set('_');
charactersDontNeedingEncoding.set('.');
charactersDontNeedingEncoding.set('*');
charactersDontNeedingEncoding.set('"');
}
/**
* Translates a string into <code>x-www-form-urlencoded</code> format.
*
* @param s <code>String</code> to be translated.
* @return the translated <code>String</code>.
*/
private String encode(String s) {
StringBuffer out = new StringBuffer(s.length());
ByteArrayOutputStream buf = new ByteArrayOutputStream(32);
OutputStreamWriter writer = new OutputStreamWriter(buf);
for (int i = 0; i < s.length(); i++) {
int c = (int)s.charAt(i);
if (charactersDontNeedingEncoding.get(c)) {
if (c == ' ') {
out.append("%20");
} else {
out.append((char)c);
}
} else {
try {
writer.write(c);
writer.flush();
} catch(IOException e) {
buf.reset();
continue;
}
byte[] ba = buf.toByteArray();
for (int j = 0; j < ba.length; j++) {
out.append('%');
char ch = Character.forDigit((ba[j] >> 4) & 0xF, 16);
// converting to use uppercase letter as part of
// the hex value if ch is a letter.
if (Character.isLetter(ch)) {
ch -= characterCaseDiff;
}
out.append(ch);
ch = Character.forDigit(ba[j] & 0xF, 16);
if (Character.isLetter(ch)) {
ch -= characterCaseDiff;
}
out.append(ch);
}
buf.reset();
}
}
return out.toString();
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>