Hello,
After taking a cursory look at the code I would suggest to stick with NOPLog and
Log4jCategoryLog. Moreover, you probably want to delegate the category look up to
log4j instead of maintaining your own hashtable/hashmap. Not only will this be faster
but also safer. Just my 2c, Ceki
At 16:27 02.08.2001 +0000, [EMAIL PROTECTED] wrote:
>rwaldhoff 01/08/02 09:27:06
>
> Modified: httpclient/src/conf .cvsignore log4j.properties.sample
> httpclient/src/java/org/apache/commons/httpclient
> Base64.java HeaderElement.java HttpClient.java
> Added: httpclient/src/conf simplelog.properties.sample
> httpclient/src/java/org/apache/commons/httpclient/log
> Log.java Log4JCategoryLog.java LogSource.java
> NoOpLog.java SimpleLog.java
> httpclient/src/test/org/apache/commons/httpclient
> TestBase64.java
> Log:
> refactored logging so that log4j is no longer a runtime depedency
> updates to documentation to come
>
> Revision Changes Path
> 1.2 +2 -1 jakarta-commons/httpclient/src/conf/.cvsignore
>
> Index: .cvsignore
> ===================================================================
> RCS file: /home/cvs/jakarta-commons/httpclient/src/conf/.cvsignore,v
> retrieving revision 1.1
> retrieving revision 1.2
> diff -u -r1.1 -r1.2
> --- .cvsignore 2001/07/27 22:53:52 1.1
> +++ .cvsignore 2001/08/02 16:27:06 1.2
> @@ -1 +1,2 @@
> -log4j.properties
> \ No newline at end of file
> +log4j.properties
> +simplelog.properties
> \ No newline at end of file
>
>
>
> 1.2 +3 -3 jakarta-commons/httpclient/src/conf/log4j.properties.sample
>
> Index: log4j.properties.sample
> ===================================================================
> RCS file: /home/cvs/jakarta-commons/httpclient/src/conf/log4j.properties.sample,v
> retrieving revision 1.1
> retrieving revision 1.2
> diff -u -r1.1 -r1.2
> --- log4j.properties.sample 2001/07/27 22:53:52 1.1
> +++ log4j.properties.sample 2001/08/02 16:27:06 1.2
> @@ -1,6 +1,6 @@
> -######################################
> -# Configure the log4j logging system
> -######################################
> +###################################################
> +# Sample configuraion for the log4j logging system
> +###################################################
>
> # Set the root output level and appenders
> log4j.rootCategory=INFO, consoleAppender
>
>
>
> 1.1 jakarta-commons/httpclient/src/conf/simplelog.properties.sample
>
> Index: simplelog.properties.sample
> ===================================================================
> ####################################################
> # Sample configuraion for the simple logging system
> ####################################################
>
> # httpclient.simplelog.defaultlog
> # - Default log level for all SimpleLogs.
> httpclient.simplelog.defaultlog=FATAL
>
> # httpclient.simplelog.showlogname
> # - When true, show the name of the log in log output.
> httpclient.simplelog.showlogname=false
>
> # httpclient.simplelog.showdate
> # - When true, show a timestamp the log in log output.
> httpclient.simplelog.showdate=true
>
> # httpclient.simplelog.dateformat
> # - A SimpleDateFormat format string for timestamps in the log output
> httpclient.simplelog.dateformat=yyyy/MM/dd HH:mm:ss:SSS zzz
>
> # httpclient.simplelog.log.*
> # - Sets the logging level for specific logs.
> # Note that if that if you set the log level
> # for a log named "a.b", it will apply to all
> # logs with names of the form "a.b.c[.d]*"
> # unless overriden by a more specific log setting.
> #httpclient.simplelog.log.org.apache.commons.httpclient=DEBUG
> #httpclient.simplelog.log.org.apache.commons.httpclient.HttpClient=DEBUG
> #httpclient.simplelog.log.org.apache.commons.httpclient.HeaderElement=DEBUG
> #httpclient.simplelog.log.org.apache.commons.httpclient.Base64=DEBUG
>
>
>
> 1.3 +6 -6
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/Base64.java
>
> Index: Base64.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/Base64.java,v
> retrieving revision 1.2
> retrieving revision 1.3
> diff -u -r1.2 -r1.3
> --- Base64.java 2001/07/27 22:53:53 1.2
> +++ Base64.java 2001/08/02 16:27:06 1.3
> @@ -1,7 +1,7 @@
> /*
> - * $Header:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/Base64.java,v
> 1.2 2001/07/27 22:53:53 rwaldhoff Exp $
> - * $Revision: 1.2 $
> - * $Date: 2001/07/27 22:53:53 $
> + * $Header:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/Base64.java,v
> 1.3 2001/08/02 16:27:06 rwaldhoff Exp $
> + * $Revision: 1.3 $
> + * $Date: 2001/08/02 16:27:06 $
> *
> * ====================================================================
> *
> @@ -64,7 +64,7 @@
>
> package org.apache.commons.httpclient;
>
> -import org.apache.log4j.Category;
> +import org.apache.commons.httpclient.log.*;
>
> /**
> * This class provides encode/decode for RFC 2045 Base64 as
> @@ -75,7 +75,7 @@
> * This class is used by XML Schema binary format validation
> *
> * @author Jeffrey Rodriguez
> - * @version $Id: Base64.java,v 1.2 2001/07/27 22:53:53 rwaldhoff Exp $
> + * @version $Id: Base64.java,v 1.3 2001/08/02 16:27:06 rwaldhoff Exp $
> */
>
> public final class Base64 {
> @@ -90,7 +90,7 @@
> static private final byte PAD = ( byte ) '=';
> static private byte [] base64Alphabet = new byte[BASELENGTH];
> static private byte [] lookUpBase64Alphabet = new byte[LOOKUPLENGTH];
> - static private final Category log =
>Category.getInstance("org.apache.commons.httpclient.Base64");
> + static private final Log log =
>LogSource.getInstance("org.apache.commons.httpclient.Base64");
>
> static {
>
>
>
>
> 1.3 +5 -5
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HeaderElement.java
>
> Index: HeaderElement.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HeaderElement.java,v
> retrieving revision 1.2
> retrieving revision 1.3
> diff -u -r1.2 -r1.3
> --- HeaderElement.java 2001/07/27 22:53:53 1.2
> +++ HeaderElement.java 2001/08/02 16:27:06 1.3
> @@ -1,7 +1,7 @@
> /*
> - * $Header:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HeaderElement.java,v
> 1.2 2001/07/27 22:53:53 rwaldhoff Exp $
> - * $Revision: 1.2 $
> - * $Date: 2001/07/27 22:53:53 $
> + * $Header:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HeaderElement.java,v
> 1.3 2001/08/02 16:27:06 rwaldhoff Exp $
> + * $Revision: 1.3 $
> + * $Date: 2001/08/02 16:27:06 $
> *
> * ====================================================================
> *
> @@ -67,7 +67,7 @@
> import java.util.NoSuchElementException;
> import java.util.StringTokenizer;
> import java.util.Vector;
> -import org.apache.log4j.Category;
> +import org.apache.commons.httpclient.log.*;
>
> /**
> * Some HTTP headers (such as the set-cookie header) have values that
> @@ -131,7 +131,7 @@
> }
>
> // -------------------------------------------------------- Class Variables
> - static private final Category log =
>Category.getInstance("org.apache.commons.httpclient.HeaderElement");
> + static private final Log log =
>LogSource.getInstance("org.apache.commons.httpclient.HeaderElement");
>
> private static final BitSet SEPARATORS = new BitSet(128);
> private static final BitSet TOKEN_CHAR = new BitSet(128);
>
>
>
> 1.22 +5 -5
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpClient.java
>
> Index: HttpClient.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpClient.java,v
> retrieving revision 1.21
> retrieving revision 1.22
> diff -u -r1.21 -r1.22
> --- HttpClient.java 2001/07/27 22:53:53 1.21
> +++ HttpClient.java 2001/08/02 16:27:06 1.22
> @@ -1,7 +1,7 @@
> /*
> - * $Header:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpClient.java,v
> 1.21 2001/07/27 22:53:53 rwaldhoff Exp $
> - * $Revision: 1.21 $
> - * $Date: 2001/07/27 22:53:53 $
> + * $Header:
>/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpClient.java,v
> 1.22 2001/08/02 16:27:06 rwaldhoff Exp $
> + * $Revision: 1.22 $
> + * $Date: 2001/08/02 16:27:06 $
> *
> * ====================================================================
> *
> @@ -76,7 +76,7 @@
> import java.lang.reflect.Method;
> import javax.net.ssl.SSLSocket;
> import javax.net.ssl.SSLSocketFactory;
> -import org.apache.log4j.Category;
> +import org.apache.commons.httpclient.log.*;
>
> /**
> * HTTP client main class.
> @@ -104,7 +104,7 @@
>
> // -------------------------------------------------------------- Constants
>
> - static private final Category log =
>Category.getInstance("org.apache.commons.httpclient.HttpClient");
> + static private final Log log =
>LogSource.getInstance("org.apache.commons.httpclient.HttpClient");
>
> /**
> * HTTP Date format pattern (RFC 2068, 822, 1123).
>
>
>
> 1.1
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/log/Log.java
>
> Index: Log.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.commons.httpclient.log;
>
> /**
> * A simple logging interface abstracting log4j.
> * @author Rod Waldhoff
> * @version $Id: Log.java,v 1.1 2001/08/02 16:27:06 rwaldhoff Exp $
> */
> public interface Log {
> public void assert(boolean assertion, String msg);
> public void debug(Object message);
> public void debug(Object message, Throwable t);
> public void info(Object message);
> public void info(Object message, Throwable t);
> public void warn(Object message);
> public void warn(Object message, Throwable t);
> public void error(Object message);
> public void error(Object message, Throwable t);
> public void fatal(Object message);
> public void fatal(Object message, Throwable t);
> }
>
>
>
> 1.1
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/log/Log4JCategoryLog.java
>
> Index: Log4JCategoryLog.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.commons.httpclient.log;
>
> import org.apache.log4j.Category;
>
> /**
> * @author Rod Waldhoff
> * @version $Id: Log4JCategoryLog.java,v 1.1 2001/08/02 16:27:06 rwaldhoff Exp $
> */
> public class Log4JCategoryLog implements Log {
> Category _category = null;
>
> public Log4JCategoryLog(String name) {
> _category = Category.getInstance(name);
> }
>
> public final void assert(boolean assertion, String msg) {
> _category.assert(assertion,msg);
> }
>
> public final void debug(Object message) {
> _category.debug(message);
> }
>
> public final void debug(Object message, Throwable t) {
> _category.debug(message,t);
> }
>
> public final void info(Object message) {
> _category.info(message);
> }
>
> public final void info(Object message, Throwable t) {
> _category.info(message,t);
> }
>
> public final void warn(Object message) {
> _category.warn(message);
> }
> public final void warn(Object message, Throwable t) {
> _category.warn(message,t);
> }
>
> public final void error(Object message) {
> _category.error(message);
> }
>
> public final void error(Object message, Throwable t) {
> _category.error(message,t);
> }
>
> public final void fatal(Object message) {
> _category.fatal(message);
> }
>
> public final void fatal(Object message, Throwable t) {
> _category.fatal(message,t);
> }
> }
>
>
>
> 1.1
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/log/LogSource.java
>
> Index: LogSource.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.commons.httpclient.log;
>
> import java.util.HashMap;
> import java.lang.reflect.Constructor;
>
> /**
> * @author Rod Waldhoff
> * @version $Id: LogSource.java,v 1.1 2001/08/02 16:27:06 rwaldhoff Exp $
> */
> public class LogSource {
> static protected HashMap _logs = new HashMap();
> static protected boolean _log4jIsAvailable = false;
> static {
> try {
> if(null != Class.forName("org.apache.log4j.Category")) {
> _log4jIsAvailable = true;
> } else {
> _log4jIsAvailable = false;
> }
> } catch(ClassNotFoundException e) {
> _log4jIsAvailable = false;
> }
> }
>
> private LogSource() {
> }
>
> static public Log getInstance(String name) {
> Log log = (Log)(_logs.get(name));
> if(null == log) {
> log = makeNewLogInstance(name);
> _logs.put(name,log);
> }
> return log;
> }
>
> static public Log getInstance(Class clazz) {
> return getInstance(clazz.getName());
> }
>
> /**
> * Create a new {@link Log} implementation, based
> * on the given <i>name</i>
> * <p>
> * The specific {@link Log} implementation returned
> * is determined by the value of the
> * <tt>httpclient.log</tt> property.
> * The value of <tt>httpclient.log</tt> may be set to
> * the fully specified name of a class that implements
> * the {@link Log} interface. This class must also
> * have a public constructor that takes a single
> * {@link String} argument (containing the <i>name</i>
> * of the {@link Log} to be constructed.
> * <p>
> * When <tt>httpclient.log</tt> is not set,
> * or when no corresponding class can be found,
> * this method will return a {@link Log4JCategoryLog}
> * if the log4j {@link org.apache.log4j.Category} class is
> * available in the {@link LogSource}'s classpath, or
> * a {@link NoOpLog} if it is not.
> *
> * @param name the log name (or category)
> */
> static public Log makeNewLogInstance(String name) {
> Log log = null;
> String logclassname =
>System.getProperty("httpclient.log","org.apache.commons.httpclient.log.NoOpLog");
> try {
> Class logclass = Class.forName(logclassname);
> Class[] argtypes = new Class[1];
> argtypes[0] = "".getClass();
> Constructor ctor = logclass.getConstructor(argtypes);
> Object[] args = new Object[1];
> args[0] = name;
> log = (Log)(ctor.newInstance(args));
> } catch(Exception e) {
> log = null;
> }
> if(null == log) {
> if(_log4jIsAvailable) {
> return new Log4JCategoryLog(name);
> } else {
> log = new NoOpLog(name);
> }
> }
> return log;
> }
> }
>
>
>
> 1.1
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/log/NoOpLog.java
>
> Index: NoOpLog.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.commons.httpclient.log;
>
> /**
> * @author Rod Waldhoff
> * @version $Id: NoOpLog.java,v 1.1 2001/08/02 16:27:06 rwaldhoff Exp $
> */
> public final class NoOpLog implements Log {
> public NoOpLog() { }
> public NoOpLog(String name) { }
> public void assert(boolean assertion, String msg) { }
> public void debug(Object message) { }
> public void debug(Object message, Throwable t) { }
> public void info(Object message) { }
> public void info(Object message, Throwable t) { }
> public void warn(Object message) { }
> public void warn(Object message, Throwable t) { }
> public void error(Object message) { }
> public void error(Object message, Throwable t) { }
> public void fatal(Object message) { }
> public void fatal(Object message, Throwable t) { }
> }
>
>
>
> 1.1
>jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/log/SimpleLog.java
>
> Index: SimpleLog.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.commons.httpclient.log;
>
> import java.util.Properties;
> import java.util.Enumeration;
> import java.io.InputStream;
> import java.text.SimpleDateFormat;
> import java.text.DateFormat;
> import java.util.Date;
>
> /**
> * @author Rod Waldhoff
> * @version $Id: SimpleLog.java,v 1.1 2001/08/02 16:27:06 rwaldhoff Exp $
> */
> public class SimpleLog implements Log {
> static protected final Properties _simplelogProps = new Properties();
> static protected boolean _showlogname = false;
> static protected boolean _showtime = false;
> static protected DateFormat _df = null;
>
> static {
> // add all system props that start with "httpclient."
> Enumeration enum = System.getProperties().propertyNames();
> while(enum.hasMoreElements()) {
> String name = (String)(enum.nextElement());
> if(null != name && name.startsWith("httpclient.")) {
> _simplelogProps.setProperty(name,System.getProperty(name));
> }
> }
>
> // add props from the resource simplelog.properties
> InputStream in =
>ClassLoader.getSystemResourceAsStream("simplelog.properties");
> if(null != in) {
> try {
> _simplelogProps.load(in);
> in.close();
> } catch(java.io.IOException e) {
> // ignored
> }
> }
> try {
> } catch(Throwable t) {
> // ignored
> }
> _showlogname =
>"true".equalsIgnoreCase(_simplelogProps.getProperty("httpclient.simplelog.showlogname","true"));
> _showtime =
>"true".equalsIgnoreCase(_simplelogProps.getProperty("httpclient.simplelog.showdate","true"));
> if(_showtime) {
> _df = new
>SimpleDateFormat(_simplelogProps.getProperty("httpclient.simplelog.dateformat","yyyy/MM/dd
> HH:mm:ss:SSS zzz"));
> }
> }
>
> protected static final int DEBUG = 5;
> protected static final int INFO = 4;
> protected static final int WARN = 3;
> protected static final int ERROR = 2;
> protected static final int FATAL = 1;
> protected int _logLevel = 2;
>
> protected String _name = null;
>
> public SimpleLog(String name) {
> _name = name;
>
> String lvl = _simplelogProps.getProperty("httpclient.simplelog.log." +
>_name);
> int i = String.valueOf(name).lastIndexOf(".");
> while(null == lvl && i > -1) {
> name = name.substring(0,i);
> lvl = _simplelogProps.getProperty("httpclient.simplelog.log." + name);
> i = String.valueOf(name).lastIndexOf(".");
> }
> if(null == lvl) {
> lvl = _simplelogProps.getProperty("httpclient.simplelog.defaultlog");
> }
>
> if("debug".equalsIgnoreCase(lvl)) {
> _logLevel = DEBUG;
> } else if("info".equalsIgnoreCase(lvl)) {
> _logLevel = INFO;
> } else if("warn".equalsIgnoreCase(lvl)) {
> _logLevel = WARN;
> } else if("error".equalsIgnoreCase(lvl)) {
> _logLevel = ERROR;
> } else if("fatal".equalsIgnoreCase(lvl)) {
> _logLevel = FATAL;
> }
> }
>
> protected void log(int type, Object message, Throwable t) {
> if(_logLevel >= type) {
> StringBuffer buf = new StringBuffer();
> if(_showtime) {
> buf.append(_df.format(new Date()));
> buf.append(" ");
> }
> switch(type) {
> case DEBUG: buf.append("[DEBUG] "); break;
> case INFO: buf.append("[INFO] "); break;
> case WARN: buf.append("[WARN] "); break;
> case ERROR: buf.append("[ERROR] "); break;
> case FATAL: buf.append("[FATAL] "); break;
> }
> if(_showlogname) {
> buf.append(String.valueOf(_name)).append(" - ");
> }
> buf.append(String.valueOf(message));
> if(t != null) {
> buf.append(" <");
> buf.append(t.toString());
> buf.append(">");
> t.printStackTrace();
> }
> System.out.println(buf.toString());
> }
> }
>
> public final void assert(boolean assertion, String msg) {
> if(!assertion) { error(msg); }
> }
>
> public final void debug(Object message) {
> log(DEBUG,message,null);
> }
>
> public final void debug(Object message, Throwable t) {
> log(DEBUG,message,t);
> }
>
> public final void info(Object message) {
> log(INFO,message,null);
> }
>
> public final void info(Object message, Throwable t) {
> log(INFO,message,t);
> }
>
> public final void warn(Object message) {
> log(WARN,message,null);
> }
> public final void warn(Object message, Throwable t) {
> log(WARN,message,t);
> }
>
> public final void error(Object message) {
> log(ERROR,message,null);
> }
>
> public final void error(Object message, Throwable t) {
> log(ERROR,message,t);
> }
>
> public final void fatal(Object message) {
> log(FATAL,message,null);
> }
>
> public final void fatal(Object message, Throwable t) {
> log(FATAL,message,t);
> }
> }
>
>
>
> 1.1
>jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestBase64.java
>
> Index: TestBase64.java
> ===================================================================
> /*
> * $Header:
>/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestBase64.java,v
> 1.1 2001/08/02 16:27:06 rwaldhoff Exp $
> * $Revision: 1.1 $
> * $Date: 2001/08/02 16:27:06 $
> * ====================================================================
> * 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.commons.httpclient;
>
> import junit.framework.*;
> import java.util.Random;
>
> /**
> * Simple tests of Base64.
> *
> * @author Rodney Waldhoff
> * @version $Id: TestBase64.java,v 1.1 2001/08/02 16:27:06 rwaldhoff Exp $
> */
> public class TestBase64 extends TestCase {
>
> // ------------------------------------------------------------ Constructor
> public TestBase64(String testName) {
> super(testName);
> }
>
> // ------------------------------------------------------------------- Main
> public static void main(String args[]) {
> String[] testCaseName = { TestBase64.class.getName() };
> junit.textui.TestRunner.main(testCaseName);
> }
>
> // ------------------------------------------------------- TestCase Methods
> public static Test suite() {
> return new TestSuite(TestBase64.class);
> }
>
> public void setUp() throws Exception {
> }
>
> private Random _rand = new Random();
>
> // encode/decode random arrays from size 1 to size 11
> public void testEncodeDecodeSmall() {
> for(int i=1;i<12;i++) {
> byte[] data = new byte[i];
> _rand.nextBytes(data);
> byte[] enc = Base64.encode(data);
> assert(Base64.isBase64(new String(enc)));
> byte[] data2 = Base64.decode(enc);
> assert(toString(data) + ";" + toString(data2),isEqual(data,data2));
> }
> }
>
> // encode/decode a large random array
> public void testEncodeDecodeRandom() {
> for(int i=1;i<5;i++) {
> byte[] data = new byte[_rand.nextInt(10000)+1];
> _rand.nextBytes(data);
> byte[] enc = Base64.encode(data);
> assert(Base64.isBase64(new String(enc)));
> byte[] data2 = Base64.decode(enc);
> assert(isEqual(data,data2));
> }
> }
>
> public void testBrownFox() {
> String str = "The quick brown fox jumped over the lazy dogs.";
> byte[] strbytes = str.getBytes();
> String enc =
>"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2dzLg==";
> byte[] encbytes = enc.getBytes();
>
> assert(!Base64.isBase64(str));
> assert(Base64.isBase64(enc));
>
> byte[] encstrbytes = Base64.encode(strbytes);
>
> assertEquals(enc,new String(encstrbytes));
>
> assert(isEqual(strbytes,Base64.decode(encstrbytes)));
>
> assertEquals(enc,new String(encstrbytes));
> }
>
> // --------------------------------------------------------- Privae Methods
> private boolean isEqual(byte[] a, byte[] b) {
> if(a.length < 1) { return false; }
> if(a.length != b.length) { return false; }
> for(int i=0;i<a.length;i++) {
> if(a[i] != b[i]) { return false; }
> }
> return true;
> }
>
> private String toString(byte[] data) {
> StringBuffer buf = new StringBuffer();
> for(int i=0;i<data.length;i++) {
> buf.append(data[i]);
> if(i != data.length-1) {
> buf.append(",");
> }
> }
> return buf.toString();
> }
> }
>
>
>
--
Ceki Gülcü - http://qos.ch