You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2007/08/09 07:24:41 UTC

svn commit: r564085 - in /openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/ container/openejb-core/src/main/java/org/apache/openejb/util/ server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ server/openejb-ht...

Author: dblevins
Date: Wed Aug  8 22:24:39 2007
New Revision: 564085

URL: http://svn.apache.org/viewvc?view=rev&rev=564085
Log:
Patch from Karan Malhi, OPENEJB-627: Refactor Logging API to tighten Logger creation
Very excellent, Karan!!

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java
    openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/AuthRequestHandler.java
    openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
    openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ServerSideResolver.java
    openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpServer.java
    openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
    openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
    openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java
    openejb/trunk/openejb3/server/openejb-telnet/src/main/java/org/apache/openejb/server/telnet/TextConsole.java
    openejb/trunk/openejb3/server/openejb-webadmin/src/main/java/org/apache/openejb/webadmin/httpd/HttpServer.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java Wed Aug  8 22:24:39 2007
@@ -92,7 +92,7 @@
                 System.out.println("" + versionInfo.getUrl());
             }
 
-            Logger logger2 = Logger.getInstance("OpenEJB", "org.apache.openejb.util.resources");
+            Logger logger2 = Logger.getInstance(LogCategory.OPENEJB, "org.apache.openejb.util.resources");
             logger2.info("startup.banner", versionInfo.getUrl(), new Date(), versionInfo.getCopyright(),
                     versionInfo.getVersion(), versionInfo.getDate(), versionInfo.getTime());
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java Wed Aug  8 22:24:39 2007
@@ -18,31 +18,52 @@
 /**
  * Contains Logger categories used in OpenEJB. Be careful when adding new Categories. For example, if a new Category
  * named OpenEJB.shutdown needs to be added, then the following is not a recommended way
- * String OPENEJB_SHUTDOWN = "OpenEJB.shutdown";
+ * public static final LogCategory OPENEJB_SHUTDOWN = new LogCategory("OpenEJB.shutdown");
  * The above is not recommended because the above logger has a parent logger in OpenEJB. If we change the Parent logger
  * category i.e. lets say to OPENEJB (all uppercase), then to maintain the parent-child relationship, we will need
- * to change other loggers too. In our case, we will not need to change OPENEJB_STARTUP and OPENEJB_SERVER because 
- * of the way they are defined.
+ * to change other loggers too. For example, we will not need to change OPENEJB_STARTUP and OPENEJB_SERVER because 
+ * of the way they are defined (using OPENEJB.name as a prefix).
  * A better way of adding the Category would be
- * String OPENEJB_SHUTDOWN = OPENEJB+".shutdown";
+ * public static final LogCategory OPENEJB_SHUTDOWN = new LogCategory( OPENEJB.name + ".shutdown");
  * 
  *
  */
-public interface LogCategory {
-	String OPENEJB = "OpenEJB";
-	String OPENEJB_STARTUP = OPENEJB + ".startup";
-	String OPENEJB_STARTUP_CONFIG = OPENEJB_STARTUP+".config";
-	String OPENEJB_STARTUP_VALIDATION = OPENEJB_STARTUP+".validation";
-	String OPENEJB_SERVER = OPENEJB + ".server";
-	String OPENEJB_SECURITY = OPENEJB+".security";
-	String OPENEJB_RESOURCE_JDBC = OPENEJB+".resource.jdbc";
-	String OPENEJB_CONNECTOR = OPENEJB+".connector";
-	String OPENEJB_DEPLOY = OPENEJB+".deploy";
-	String TRANSACTION = "Transaction";
-	String ACTIVEMQ = "org.apache.activemq";
-	String GERONIMO = "org.apache.geronimo";
-	String OPENJPA = "openjpa";
-	String CORBA_ADAPTER = "CORBA-Adapter";
-	String TIMER = "Timer";
+public final class LogCategory {
+	private final String name;
+	public static final LogCategory OPENEJB = new LogCategory( "OpenEJB");
+	public static final LogCategory OPENEJB_ADMIN = new LogCategory( OPENEJB.name + ".admin");
+	public static final LogCategory OPENEJB_STARTUP = new LogCategory( OPENEJB.name + ".startup");
+	public static final LogCategory OPENEJB_STARTUP_CONFIG = new LogCategory( OPENEJB_STARTUP.name+".config");
+	public static final LogCategory OPENEJB_STARTUP_VALIDATION = new LogCategory( OPENEJB_STARTUP.name+".validation");
+	public static final LogCategory OPENEJB_SERVER = new LogCategory( OPENEJB.name + ".server");
+	public static final LogCategory OPENEJB_SERVER_REMOTE = new LogCategory( OPENEJB_SERVER.name + ".remote");
+	public static final LogCategory OPENEJB_SECURITY = new LogCategory( OPENEJB.name+".security");
+	public static final LogCategory OPENEJB_RESOURCE_JDBC = new LogCategory( OPENEJB.name+".resource.jdbc");
+	public static final LogCategory OPENEJB_CONNECTOR = new LogCategory( OPENEJB.name+".connector");
+	public static final LogCategory OPENEJB_DEPLOY = new LogCategory( OPENEJB.name+".deploy");
+	public static final LogCategory TRANSACTION = new LogCategory( "Transaction");
+	public static final LogCategory ACTIVEMQ = new LogCategory( "org.apache.activemq");
+	public static final LogCategory GERONIMO = new LogCategory( "org.apache.geronimo");
+	public static final LogCategory OPENJPA = new LogCategory( "openjpa");
+	public static final LogCategory CORBA_ADAPTER = new LogCategory( "CORBA-Adapter");
+	public static final LogCategory TIMER = new LogCategory( "Timer");
+	public static final LogCategory HTTPSERVER = new LogCategory( "HttpServer");
+	public static final LogCategory SERVICEPOOL = new LogCategory( "ServicePool");
+	private LogCategory(String name){
+		this.name = name;
+	}
+	public String getName() {
+		return name;
+	}
+	/**
+	 * Creates a child category of this category. <B>Use this method sparingly</B>. This method is to be used in only those circumstances where the name of the 
+	 * category is not known upfront and is a derived name. If you know the name of the category, it is highly recommended to add a static final field 
+	 * of type LogCategory in this class
+	 * @param child
+	 * @return - LogCategory
+	 */
+	public LogCategory createChild(String child){
+		return new LogCategory(this.name+"."+child);
+	}
 
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/Logger.java Wed Aug  8 22:24:39 2007
@@ -44,7 +44,7 @@
 public class Logger {
 
     protected org.apache.log4j.Logger _logger = null;
-
+    private LogCategory category;
     private String baseName;
 
     private static final String SUFFIX = ".Messages";
@@ -79,12 +79,13 @@
     /**
      * Builds a Logger object and returns it
      */
-    private static final Computable<String[], Logger> loggerResolver = new Computable<String[], Logger>() {
-        public Logger compute(String[] args) throws InterruptedException {
+    private static final Computable<Object[], Logger> loggerResolver = new Computable<Object[], Logger>() {
+        public Logger compute(Object[] args) throws InterruptedException {
 
             Logger logger = new Logger();
-            logger._logger = org.apache.log4j.Logger.getLogger(args[0]);
-            logger.baseName = args[1];
+            logger.category = (LogCategory) args[0];
+            logger._logger = org.apache.log4j.Logger.getLogger(logger.category.getName());
+            logger.baseName = (String) args[1];
             return logger;
 
         }
@@ -113,7 +114,7 @@
     /**
      * Cache of Loggers
      */
-    private static final Computable<String[], Logger> loggerCache = new Memoizer<String[], Logger>(
+    private static final Computable<Object[], Logger> loggerCache = new Memoizer<Object[], Logger>(
             loggerResolver);
     /**
      * Cache of MessageFormats
@@ -178,14 +179,14 @@
     /**
      * Finds a Logger from the cache and returns it. If not found in cache then builds a Logger and returns it.
      *
-     * @param name     - The name of the logger
+     * @param category     - The category of the logger
      * @param baseName - The baseName for the ResourceBundle
      * @return Logger
      */
-    public static Logger getInstance(String name, String baseName) {
+    public static Logger getInstance(LogCategory category, String baseName) {
         try {
             Logger logger = loggerCache
-                    .compute(new String[]{name, baseName});
+                    .compute(new Object[]{category, baseName});
             return logger;
         } catch (InterruptedException e) {
             /*
@@ -194,21 +195,26 @@
                 * same Logger would probably end up in the cache
                 */
             Logger logger = new Logger();
-            logger._logger = org.apache.log4j.Logger.getLogger(name);
+            logger.category = category;
+            logger._logger = org.apache.log4j.Logger.getLogger(category.getName());
             logger.baseName = baseName;
             return logger;
         }
     }
 
-    public static Logger getInstance(String name, Class clazz) {
-        return getInstance(name, packageName(clazz));
+    public static Logger getInstance(LogCategory category, Class clazz) {
+        return getInstance(category, packageName(clazz));
     }
 
     private static String packageName(Class clazz) {
         String name = clazz.getName();
         return name.substring(0, name.lastIndexOf("."));
     }
-
+    
+    public Logger getLogger(String moduleId){
+    	return Logger.getInstance(this.category,this.baseName);
+    	
+    }
     /**
      * Formats a given message
      *

Modified: openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/AuthRequestHandler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/AuthRequestHandler.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/AuthRequestHandler.java (original)
+++ openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/AuthRequestHandler.java Wed Aug  8 22:24:39 2007
@@ -22,6 +22,7 @@
 import org.apache.openejb.client.ResponseCodes;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.spi.SecurityService;
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Messages;
 import org.apache.openejb.util.Logger;
 
@@ -34,7 +35,7 @@
 class AuthRequestHandler {
 
     Messages _messages = new Messages("org.apache.openejb.server.util.resources");
-    Logger logger = Logger.getInstance("OpenEJB.server.remote", "org.apache.openejb.server.util.resources");
+    Logger logger = Logger.getInstance(LogCategory.OPENEJB_SERVER_REMOTE, "org.apache.openejb.server.util.resources");
 
     AuthRequestHandler(EjbDaemon daemon) {
     }

Modified: openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java (original)
+++ openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java Wed Aug  8 22:24:39 2007
@@ -33,6 +33,7 @@
 import org.apache.openejb.client.RequestMethodConstants;
 import org.apache.openejb.client.EjbObjectInputStream;
 import org.apache.openejb.client.ProtocolMetaData;
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
 
@@ -41,7 +42,7 @@
     private static final ProtocolMetaData PROTOCOL_VERSION = new ProtocolMetaData("2.0");
 
     private static final Messages _messages = new Messages("org.apache.openejb.server.util.resources");
-    static final Logger logger = Logger.getInstance("OpenEJB.server.remote", "org.apache.openejb.server.util.resources");
+    static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_SERVER_REMOTE, "org.apache.openejb.server.util.resources");
 
     private ClientObjectFactory clientObjectFactory;
 //    DeploymentIndex deploymentIndex;

Modified: openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ServerSideResolver.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ServerSideResolver.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ServerSideResolver.java (original)
+++ openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ServerSideResolver.java Wed Aug  8 22:24:39 2007
@@ -23,6 +23,7 @@
 import org.apache.openejb.client.EJBObjectHandler;
 import org.apache.openejb.InterfaceType;
 import org.apache.openejb.DeploymentInfo;
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.core.ivm.EjbHomeProxyHandler;
 import org.apache.openejb.core.ivm.EjbObjectProxyHandler;
@@ -36,7 +37,7 @@
  */
 public class ServerSideResolver implements EJBHomeProxyHandle.Resolver, EJBObjectProxyHandle.Resolver {
 
-    private static Logger logger = Logger.getInstance("OpenEJB.server.remote", "org.apache.openejb.server.util.resources");
+    private static Logger logger = Logger.getInstance(LogCategory.OPENEJB_SERVER_REMOTE, "org.apache.openejb.server.util.resources");
 
     public Object resolve(EJBHomeHandler handler) {
         try {

Modified: openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpServer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpServer.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpServer.java (original)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpServer.java Wed Aug  8 22:24:39 2007
@@ -17,6 +17,7 @@
 package org.apache.openejb.server.httpd;
 
 import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.server.ServerService;
 import org.apache.openejb.server.ServiceException;
@@ -36,7 +37,7 @@
  */
 public class HttpServer implements ServerService {
 
-    private static final Logger log = Logger.getInstance("HttpServer", "org.apache.openejb.util.resources");
+    private static final Logger log = Logger.getInstance(LogCategory.HTTPSERVER, "org.apache.openejb.util.resources");
 
     private HttpListener listener;
 

Modified: openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java (original)
+++ openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java Wed Aug  8 22:24:39 2007
@@ -41,9 +41,7 @@
 
     public void init(Properties props) throws Exception {
 
-        String logCategory = "OpenEJB.server.service." + getName();
-
-        logger = Logger.getInstance(logCategory, "org.apache.openejb.server.util.resources");
+        logger = Logger.getInstance(LogCategory.OPENEJB_SERVER.createChild("service."+getName()), "org.apache.openejb.server.util.resources");
 
         next.init(props);
     }

Modified: openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java (original)
+++ openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java Wed Aug  8 22:24:39 2007
@@ -18,6 +18,7 @@
 
 import org.apache.openejb.loader.FileUtils;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
 import org.apache.openejb.spi.ContainerSystem;
@@ -47,7 +48,7 @@
 public class ServiceManager {
 
     static Messages messages = new Messages("org.apache.openejb.server.util.resources");
-    static Logger logger = Logger.getInstance("OpenEJB.server.remote", "org.apache.openejb.server.util.resources");
+    static Logger logger = Logger.getInstance(LogCategory.OPENEJB_SERVER_REMOTE, "org.apache.openejb.server.util.resources");
 
     private static ServiceManager manager;
 

Modified: openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java (original)
+++ openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java Wed Aug  8 22:24:39 2007
@@ -22,6 +22,7 @@
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
 import java.io.IOException;
@@ -31,7 +32,7 @@
 import java.util.Properties;
 
 public class ServicePool implements ServerService {
-    private static final Logger log = Logger.getInstance("ServicePool", "org.apache.openejb.util.resources");
+    private static final Logger log = Logger.getInstance(LogCategory.SERVICEPOOL, "org.apache.openejb.util.resources");
 
     private final ServerService next;
     private final Executor executor;

Modified: openejb/trunk/openejb3/server/openejb-telnet/src/main/java/org/apache/openejb/server/telnet/TextConsole.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-telnet/src/main/java/org/apache/openejb/server/telnet/TextConsole.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-telnet/src/main/java/org/apache/openejb/server/telnet/TextConsole.java (original)
+++ openejb/trunk/openejb3/server/openejb-telnet/src/main/java/org/apache/openejb/server/telnet/TextConsole.java Wed Aug  8 22:24:39 2007
@@ -26,11 +26,12 @@
 
 import java.util.Properties;
 
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
 public class TextConsole {
 
-    Logger logger = Logger.getInstance("OpenEJB.admin", "org.apache.openejb.server.util.resources");
+    Logger logger = Logger.getInstance(LogCategory.OPENEJB_ADMIN, "org.apache.openejb.server.util.resources");
 
     Properties props;
 

Modified: openejb/trunk/openejb3/server/openejb-webadmin/src/main/java/org/apache/openejb/webadmin/httpd/HttpServer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webadmin/src/main/java/org/apache/openejb/webadmin/httpd/HttpServer.java?view=diff&rev=564085&r1=564084&r2=564085
==============================================================================
--- openejb/trunk/openejb3/server/openejb-webadmin/src/main/java/org/apache/openejb/webadmin/httpd/HttpServer.java (original)
+++ openejb/trunk/openejb3/server/openejb-webadmin/src/main/java/org/apache/openejb/webadmin/httpd/HttpServer.java Wed Aug  8 22:24:39 2007
@@ -58,6 +58,7 @@
 import org.apache.openejb.server.ServerService;
 import org.apache.openejb.server.ServiceException;
 import org.apache.openejb.util.Logger;
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.webadmin.HttpHome;
 import org.apache.openejb.webadmin.HttpObject;
 
@@ -71,7 +72,7 @@
  */
 public class HttpServer implements ServerService{
 
-    private static final Logger logger = Logger.getInstance( "OpenEJB.server", "org.apache.openejb.server.util.resources" );
+    private static final Logger logger = Logger.getInstance( LogCategory.OPENEJB_SERVER, HttpServer.class );
     private InitialContext jndiContext;
 
     public void service(InputStream in, OutputStream out) throws ServiceException, IOException {