geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jlaskow...@apache.org
Subject svn commit: r390520 - in /geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail: store/nntp/NNTPStore.java transport/nntp/NNTPConnection.java transport/nntp/NNTPTransport.java
Date Fri, 31 Mar 2006 22:07:09 GMT
Author: jlaskowski
Date: Fri Mar 31 14:07:07 2006
New Revision: 390520

URL: http://svn.apache.org/viewcvs?rev=390520&view=rev
Log:
GERONIMO-1798 - Bring NNTPStore and NNTPTransport to same level of debugging tracing added
to SMTP
Submitted by Rick McGuire

Modified:
    geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java
    geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java
    geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java

Modified: geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java?rev=390520&r1=390519&r2=390520&view=diff
==============================================================================
--- geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java
(original)
+++ geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java
Fri Mar 31 14:07:07 2006
@@ -1,6 +1,6 @@
 /**
  *
- * Copyright 2003-2005 The Apache Software Foundation
+ * Copyright 2006 The Apache Software Foundation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -19,24 +19,19 @@
 package org.apache.geronimo.javamail.store.nntp;
 
 import java.io.File;
-import java.io.IOException;
 import java.io.PrintStream;
-
 import java.util.Iterator;
 
-import javax.mail.AuthenticationFailedException;
 import javax.mail.Folder;
 import javax.mail.MessagingException;
 import javax.mail.Session;
 import javax.mail.Store;
 import javax.mail.URLName;
 
-import org.apache.geronimo.javamail.transport.nntp.NNTPConnection;
-import org.apache.geronimo.javamail.transport.nntp.NNTPReply;
-
 import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrc;
 import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrcFile;
 import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrcGroup;
+import org.apache.geronimo.javamail.transport.nntp.NNTPConnection;
 import org.apache.geronimo.mail.util.SessionUtil;
 
 /**
@@ -46,12 +41,13 @@
  *
  * @version $Rev$ $Date$
  */
-
 public class NNTPStore extends Store{
 
-    protected static final String NNTP_AUTH = "mail.nntp.auth";
-    protected static final String NNTP_PORT = "mail.nntp.port";
-    protected static final String NNTP_NEWSRC = "mail.nntp.newsrc";
+    protected static final String NNTP_AUTH = "auth";
+    protected static final String NNTP_PORT = "port";
+    protected static final String NNTP_NEWSRC = "newsrc";
+
+    protected static final String protocol = "nntp";
 
     protected static final int DEFAULT_NNTP_PORT = 119;
 
@@ -120,7 +116,7 @@
 
         // first check to see if we need to authenticate.  If we need this, then we must
have a username and
         // password specified.  Failing this may result in a user prompt to collect the information.
-        boolean mustAuthenticate = SessionUtil.getBooleanProperty(session, NNTP_AUTH, false);
+        boolean mustAuthenticate = getBooleanProperty(NNTP_AUTH, false);
 
         // if we need to authenticate, and we don't have both a userid and password, then
we fail this
         // immediately.  The Service.connect() method will try to obtain the user information
and retry the
@@ -134,16 +130,16 @@
         // if not configured, we just use the default default.
         if (port == -1) {
             // check for a property and fall back on the default if it's not set.
-            port = SessionUtil.getIntProperty(session, NNTP_PORT, DEFAULT_NNTP_PORT);
+            port = getIntProperty(NNTP_PORT, DEFAULT_NNTP_PORT);
         }
 
 
         // create socket and connect to server.
-        connection = new NNTPConnection(session, host, port, username, password, debug);
+        connection = new NNTPConnection(protocol, session, host, port, username, password,
debug);
         connection.connect();
 
         // see if we have a newsrc file location specified
-        String newsrcFile = session.getProperty(NNTP_NEWSRC);
+        String newsrcFile = getProperty(NNTP_NEWSRC);
 
         File source = null;
 
@@ -257,4 +253,71 @@
         return newsrc.getGroup(name);
     }
 
+
+    /**
+     * Get a property associated with this mail protocol.
+     *
+     * @param name   The name of the property.
+     *
+     * @return The property value (returns null if the property has not been set).
+     */
+    String getProperty(String name) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return session.getProperty(fullName);
+    }
+
+    /**
+     * Get a property associated with this mail session.  Returns
+     * the provided default if it doesn't exist.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value (returns defaultValue if the property has not been set).
+     */
+    String getProperty(String name, String defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getProperty(session, fullName, defaultValue);
+    }
+
+
+    /**
+     * Get a property associated with this mail session as an integer value.  Returns
+     * the default value if the property doesn't exist or it doesn't have a valid int value.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value converted to an int.
+     */
+    int getIntProperty(String name, int defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getIntProperty(session, fullName, defaultValue);
+    }
+
+
+    /**
+     * Get a property associated with this mail session as an boolean value.  Returns
+     * the default value if the property doesn't exist or it doesn't have a valid int value.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value converted to a boolean
+     */
+    boolean getBooleanProperty(String name, boolean defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getBooleanProperty(session, fullName, defaultValue);
+    }
 }

Modified: geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java?rev=390520&r1=390519&r2=390520&view=diff
==============================================================================
--- geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java
(original)
+++ geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java
Fri Mar 31 14:07:07 2006
@@ -1,6 +1,6 @@
 /**
  *
- * Copyright 2003-2005 The Apache Software Foundation
+ * Copyright 2006 The Apache Software Foundation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -17,46 +17,34 @@
 
 package org.apache.geronimo.javamail.transport.nntp;
 
-import java.io.IOException;
 import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.OutputStreamWriter;
 import java.io.PrintStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.HashMap;
+import java.util.List;
 import java.util.StringTokenizer;
 
-import javax.mail.Address;
-import javax.mail.AuthenticationFailedException;
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.URLName;
-import javax.mail.event.TransportEvent;
-import javax.mail.internet.NewsAddress;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.geronimo.javamail.authentication.ClientAuthenticator;
 import org.apache.geronimo.javamail.authentication.CramMD5Authenticator;
 import org.apache.geronimo.javamail.authentication.DigestMD5Authenticator;
 import org.apache.geronimo.javamail.authentication.LoginAuthenticator;
 import org.apache.geronimo.javamail.authentication.PlainAuthenticator;
+import org.apache.geronimo.javamail.util.MIMEOutputStream;
+import org.apache.geronimo.javamail.util.TraceInputStream;
+import org.apache.geronimo.javamail.util.TraceOutputStream;
 import org.apache.geronimo.mail.util.Base64;
 import org.apache.geronimo.mail.util.SessionUtil;
-import org.apache.geronimo.javamail.util.MIMEOutputStream;
 
 /**
  * Simple implementation of NNTP transport.  Just does plain RFC977-ish
@@ -80,16 +68,17 @@
     /**
      * property keys for protocol properties.
      */
-    protected static final String MAIL_NNTP_AUTH = "mail.nntp.auth";
-    protected static final String MAIL_NNTP_PORT = "mail.nntp.port";
-    protected static final String MAIL_NNTP_TIMEOUT = "mail.nntp.timeout";
-    protected static final String MAIL_NNTP_SASL_REALM = "mail.nntp.sasl.realm";
-    protected static final String MAIL_NNTP_FACTORY_CLASS = "mail.nntp.socketFactory.class";
-    protected static final String MAIL_NNTP_FACTORY_FALLBACK = "socketFactory.fallback";
+    protected static final String MAIL_NNTP_AUTH = "auth";
+    protected static final String MAIL_NNTP_PORT = "port";
+    protected static final String MAIL_NNTP_TIMEOUT = "timeout";
+    protected static final String MAIL_NNTP_SASL_REALM = "sasl.realm";
+    protected static final String MAIL_NNTP_FACTORY_CLASS = "socketFactory.class";
+    protected static final String MAIL_NNTP_FACTORY_FALLBACK = "fallback";
     protected static final String MAIL_NNTP_LOCALADDRESS = "localaddress";
     protected static final String MAIL_NNTP_LOCALPORT = "localport";
     protected static final String MAIL_NNTP_QUITWAIT = "quitwait";
     protected static final String MAIL_NNTP_FACTORY_PORT = "socketFactory.port";
+    protected static final String MAIL_NNTP_ENCODE_TRACE = "encodetrace";
 
     protected static final int MIN_MILLIS = 1000 * 60;
     protected static final int TIMEOUT = MIN_MILLIS * 5;
@@ -101,6 +90,8 @@
     protected static final String AUTHENTICATION_CRAMMD5 = "CRAM-MD5";
     protected static final String AUTHENTICATION_DIGESTMD5 = "DIGEST-MD5";
 
+    // the protocol in use (either nntp or nntp-post).
+    String protocol;
     // the target host
     protected String host;
     // the target server port.
@@ -159,7 +150,8 @@
      *                 authentication is not required.
      * @param debug    The session debug flag.
      */
-    public NNTPConnection(Session session, String host, int port, String username, String
password, boolean debug) {
+    public NNTPConnection(String protocol, Session session, String host, int port, String
username, String password, boolean debug) {
+        this.protocol = protocol;
         this.session = session;
         this.host = host;
         this.port = port;
@@ -234,9 +226,10 @@
             port = socket.getPort();
             host = socket.getInetAddress().getHostName();
         }
+
         // now set up the input/output streams.
-        inputStream = socket.getInputStream();
-        outputStream = socket.getOutputStream();
+        inputStream = new TraceInputStream(socket.getInputStream(), debugStream, debug, getBooleanProperty(MAIL_NNTP_ENCODE_TRACE,
false)); ;
+        outputStream = new TraceOutputStream(socket.getOutputStream(), debugStream, debug,
getBooleanProperty(MAIL_NNTP_ENCODE_TRACE, false));
 
         // get a reader to read the input as lines
         in = new BufferedReader(new InputStreamReader(inputStream));
@@ -272,20 +265,20 @@
 
         // the socket factory can be specified via a session property.  By default, we just
directly
         // instantiate a socket without using a factor.
-        String socketFactory = session.getProperty(MAIL_NNTP_FACTORY_CLASS);
+        String socketFactory = getProperty(MAIL_NNTP_FACTORY_CLASS);
 
         // there are several protocol properties that can be set to tune the created socket.
 We need to
         // retrieve those bits before creating the socket.
-        int timeout = SessionUtil.getIntProperty(session, MAIL_NNTP_TIMEOUT, -1);
+        int timeout = getIntProperty(MAIL_NNTP_TIMEOUT, -1);
         InetAddress localAddress = null;
         // see if we have a local address override.
-        String localAddrProp = session.getProperty(MAIL_NNTP_LOCALADDRESS);
+        String localAddrProp = getProperty(MAIL_NNTP_LOCALADDRESS);
         if (localAddrProp != null) {
             localAddress = InetAddress.getByName(localAddrProp);
         }
 
         // check for a local port...default is to allow socket to choose.
-        int localPort = SessionUtil.getIntProperty(session, MAIL_NNTP_LOCALPORT, 0);
+        int localPort = getIntProperty(MAIL_NNTP_LOCALPORT, 0);
 
         socket = null;
 
@@ -296,7 +289,7 @@
 
         else {
             try {
-                int socketFactoryPort = SessionUtil.getIntProperty(session, MAIL_NNTP_FACTORY_PORT,
-1);
+                int socketFactoryPort = getIntProperty(MAIL_NNTP_FACTORY_PORT, -1);
 
                 // we choose the port used by the socket based on overrides.
                 Integer portArg = new Integer(socketFactoryPort == -1 ? port : socketFactoryPort);
@@ -332,7 +325,7 @@
             } catch (Throwable e) {
                 // if a socket factor is specified, then we may need to fall back to a default.
 This behavior
                 // is controlled by (surprise) more session properties.
-                if (SessionUtil.getBooleanProperty(session, MAIL_NNTP_FACTORY_FALLBACK, false))
{
+                if (getBooleanProperty(MAIL_NNTP_FACTORY_FALLBACK, false)) {
                     if (debug) {
                         debugOut("First plain socket attempt faile, falling back to default
factory", e);
                     }
@@ -395,7 +388,7 @@
     public void sendQuit() throws MessagingException {
         // there's yet another property that controls whether we should wait for a
         // reply for a QUIT command.  If on, just send the command and get outta here.
-        if (SessionUtil.getBooleanProperty(session, MAIL_NNTP_QUITWAIT, false)) {
+        if (getBooleanProperty(MAIL_NNTP_QUITWAIT, false)) {
             sendLine("QUIT");
         }
         else {
@@ -648,9 +641,6 @@
      * appropriate CRLF
      */
     public void sendLine(String data) throws MessagingException {
-        if (debug) {
-            debugOut("sending line to server >>>" + data + "<<<");
-        }
         if (socket == null || !socket.isConnected()) {
             throw new MessagingException("no connection");
         }
@@ -722,7 +712,7 @@
     public String getSASLRealm() {
         // if the realm is null, retrieve it using the realm session property.
         if (realm == null) {
-            realm = session.getProperty(MAIL_NNTP_SASL_REALM);
+            realm = getProperty(MAIL_NNTP_SASL_REALM);
         }
         return realm;
     }
@@ -965,6 +955,74 @@
      */
     public String getHost() {
         return host;
+    }
+
+
+    /**
+     * Get a property associated with this mail protocol.
+     *
+     * @param name   The name of the property.
+     *
+     * @return The property value (returns null if the property has not been set).
+     */
+    String getProperty(String name) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return session.getProperty(fullName);
+    }
+
+    /**
+     * Get a property associated with this mail session.  Returns
+     * the provided default if it doesn't exist.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value (returns defaultValue if the property has not been set).
+     */
+    String getProperty(String name, String defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getProperty(session, fullName, defaultValue);
+    }
+
+
+    /**
+     * Get a property associated with this mail session as an integer value.  Returns
+     * the default value if the property doesn't exist or it doesn't have a valid int value.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value converted to an int.
+     */
+    int getIntProperty(String name, int defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getIntProperty(session, fullName, defaultValue);
+    }
+
+
+    /**
+     * Get a property associated with this mail session as an boolean value.  Returns
+     * the default value if the property doesn't exist or it doesn't have a valid int value.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value converted to a boolean
+     */
+    boolean getBooleanProperty(String name, boolean defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getBooleanProperty(session, fullName, defaultValue);
     }
 }
 

Modified: geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java?rev=390520&r1=390519&r2=390520&view=diff
==============================================================================
--- geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java
(original)
+++ geronimo/trunk/modules/javamail-transport/src/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java
Fri Mar 31 14:07:07 2006
@@ -17,27 +17,10 @@
 
 package org.apache.geronimo.javamail.transport.nntp;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
 import java.io.PrintStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.StringTokenizer;
 
 import javax.mail.Address;
-import javax.mail.AuthenticationFailedException;
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import javax.mail.Session;
@@ -45,8 +28,8 @@
 import javax.mail.URLName;
 import javax.mail.event.TransportEvent;
 import javax.mail.internet.InternetAddress;
-import javax.mail.internet.NewsAddress;
 import javax.mail.internet.MimeMessage;
+import javax.mail.internet.NewsAddress;
 
 import org.apache.geronimo.mail.util.SessionUtil;
 
@@ -66,9 +49,11 @@
     /**
      * property keys for protocol properties.
      */
-    protected static final String NNTP_AUTH = "mail.nntp.auth";
-    protected static final String NNTP_PORT = "mail.nntp.port";
-    protected static final String NNTP_FROM = "mail.nntp.from";
+    protected static final String NNTP_AUTH = "auth";
+    protected static final String NNTP_PORT = "port";
+    protected static final String NNTP_FROM = "from";
+
+    protected static final String protocol = "nntp-post";
 
     protected static final int DEFAULT_NNTP_PORT = 119;
 
@@ -137,7 +122,7 @@
 
 
         // create socket and connect to server.
-        connection = new NNTPConnection(session, host, port, username, password, debug);
+        connection = new NNTPConnection(protocol, session, host, port, username, password,
debug);
         connection.connect();
 
         // we're going to return success here, but in truth, the server may end up asking
for our
@@ -292,5 +277,73 @@
         debugOut("Received exception -> " + message);
         debugOut("Exception message -> " + e.getMessage());
         e.printStackTrace(debugStream);
+    }
+
+
+    /**
+     * Get a property associated with this mail protocol.
+     *
+     * @param name   The name of the property.
+     *
+     * @return The property value (returns null if the property has not been set).
+     */
+    String getProperty(String name) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return session.getProperty(fullName);
+    }
+
+    /**
+     * Get a property associated with this mail session.  Returns
+     * the provided default if it doesn't exist.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value (returns defaultValue if the property has not been set).
+     */
+    String getProperty(String name, String defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getProperty(session, fullName, defaultValue);
+    }
+
+
+    /**
+     * Get a property associated with this mail session as an integer value.  Returns
+     * the default value if the property doesn't exist or it doesn't have a valid int value.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value converted to an int.
+     */
+    int getIntProperty(String name, int defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getIntProperty(session, fullName, defaultValue);
+    }
+
+
+    /**
+     * Get a property associated with this mail session as an boolean value.  Returns
+     * the default value if the property doesn't exist or it doesn't have a valid int value.
+     *
+     * @param name   The name of the property.
+     * @param defaultValue
+     *               The default value to return if the property doesn't exist.
+     *
+     * @return The property value converted to a boolean
+     */
+    boolean getBooleanProperty(String name, boolean defaultValue) {
+        // the name we're given is the least qualified part of the name.  We construct the
full property name
+        // using the protocol (either "nntp" or "nntp-post").
+        String fullName = "mail." + protocol + "." + name;
+        return SessionUtil.getBooleanProperty(session, fullName, defaultValue);
     }
 }



Mime
View raw message