You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by bu...@apache.org on 2015/03/19 19:35:40 UTC

svn commit: r1667846 - in /uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user: common/main/DuccJobService.java jp/DuccAbstractProcessContainer.java

Author: burn
Date: Thu Mar 19 18:35:40 2015
New Revision: 1667846

URL: http://svn.apache.org/r1667846
Log:
UIMA-4253 Establish user's logger early ... hide 4 logging properties from DUCC

Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/DuccJobService.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/jp/DuccAbstractProcessContainer.java

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/DuccJobService.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/DuccJobService.java?rev=1667846&r1=1667845&r2=1667846&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/DuccJobService.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/common/main/DuccJobService.java Thu Mar 19 18:35:40 2015
@@ -24,6 +24,9 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.apache.uima.ducc.user.common.investment.Investment;
 import org.apache.uima.ducc.user.jp.iface.IProcessContainer;
@@ -35,6 +38,7 @@ import org.apache.uima.ducc.user.jp.ifac
 public class DuccJobService {
 	boolean DEBUG = false;
 	private Investment investment = null;
+	private HashMap<String, String> savedPropsMap;
 	
 	public static URLClassLoader create(String classPath)
 			throws MalformedURLException {
@@ -85,16 +89,6 @@ public class DuccJobService {
 
 	public void start(String[] args) throws Exception {
 		try {
-			String log4jConfigurationFile = System.getProperty("log4j.configuration");
-			// if user provided log4j configuration file via -D, save it for later
-			// under a different property name. Remove "log4j.configuration" from System
-			// properties to prevent Ducc from using it to configure its logger. 
-			// The user's log4j configuration property will be restored before crossing
-			// class loader boundary from ducc to user.
-			if ( log4jConfigurationFile != null ) {
-				System.setProperty("ducc.user.log4j.saved.configuration",log4jConfigurationFile);
-				System.getProperties().remove("log4j.configuration");
-			}
 	        investment = new Investment();
 	        
 	        // cache current context classloader
@@ -117,16 +111,21 @@ public class DuccJobService {
 			Method registerInvestmentInstanceMethod = duccServiceClass.getMethod("registerInvestmentInstance", Object.class);
 			Method startMethod = duccServiceClass.getMethod("start");
 
-			System.out.println("DuccJobService.boot() >>>>>>>>> booting Ducc Container");
+			// Establish user's logger early to prevent the DUCC code from accidentally doing so
+			Logger logger = Logger.getLogger(DuccJobService.class.getName());
+			logger.log(Level.INFO, ">>>>>>>>> Booting Ducc Container");
 
+			hideLoggingProperties();  // Ensure DUCC doesn't try to use the user's logging setup
+			
 			// Construct & initialize Ducc fenced container. 
 			// It calls component's Configuration class
 			Thread.currentThread().setContextClassLoader(ucl);
 			Object duccContainerInstance = duccServiceClass.newInstance();
 			bootMethod.invoke(duccContainerInstance, (Object) args);
 
-			System.out.println("DuccJobService.boot()  <<<<<<<< Ducc Container initialized");
-
+			logger.log(Level.INFO, "<<<<<<<< Ducc Container booted");
+			restoreLoggingProperties();  // May not be necessary as user's logger has been established
+			
 			// below property is set by component's Configuration class. It can also
 			// be provided on the command line in case a custom processor is needed.
 			String processorClass = System.getProperty("ducc.deploy.JpProcessorClass");
@@ -144,7 +143,7 @@ public class DuccJobService {
 			Class<?> processorClz = sysCL.loadClass(processorClass);
 			IProcessContainer pc = (IProcessContainer) processorClz.newInstance();
 
-			System.out.println("DuccJobService.start() >>>>>>>>> Starting Ducc Container");
+			logger.log(Level.INFO, ">>>>>>>>> Running Ducc Container");
  
 			// Call DuccService.setProcessor() to hand-off instance of the 
 			// process container to the component along with this process args
@@ -156,7 +155,7 @@ public class DuccJobService {
 	        // Call DuccService.start() to initialize the process and begin processing
 			startMethod.invoke(duccContainerInstance);
 
-			System.out.println("DuccJobService.start()  <<<<<<<< Ducc Container ended");
+			logger.log(Level.INFO, "<<<<<<<< Ducc Container ended");
 			
 		} catch( Throwable t) {
 			t.printStackTrace();
@@ -165,7 +164,31 @@ public class DuccJobService {
 		}
 
 	}
+	
+	private void hideLoggingProperties() {
+		String[] propsToSave = { "log4j.configuration", 
+				                 "java.util.logging.config.file",
+							     "java.util.logging.config.class",
+							     "org.apache.uima.logger.class"};
+		savedPropsMap = new HashMap<String,String>();
+		for (String prop : propsToSave) {
+			String val = System.getProperty(prop);
+			if (val != null) {
+				savedPropsMap.put(prop,  val);
+				System.getProperties().remove(prop);
+				//System.out.println("!!!! Saved prop " + prop + " = " + val);
+			}
+		}
 
+	}
+	
+	private void restoreLoggingProperties() {
+		for (String prop : savedPropsMap.keySet()) {
+			System.setProperty(prop, savedPropsMap.get(prop));
+			//System.out.println("!!!! Restored prop " + prop + " = " + System.getProperty(prop));
+		}
+	}
+	
 	public static void main(String[] args) {
 		try {
 			DuccJobService service = new DuccJobService();

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/jp/DuccAbstractProcessContainer.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/jp/DuccAbstractProcessContainer.java?rev=1667846&r1=1667845&r2=1667846&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/jp/DuccAbstractProcessContainer.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-user/src/main/java/org/apache/uima/ducc/user/jp/DuccAbstractProcessContainer.java Thu Mar 19 18:35:40 2015
@@ -50,7 +50,7 @@ public abstract class DuccAbstractProces
     // Map to store DuccUimaSerializer instances. Each has affinity to a thread
 	protected static Map<Long, DuccUimaSerializer> serializerMap =
 			new HashMap<Long, DuccUimaSerializer>();
-	
+
 	protected final boolean debug = System.getProperty("ducc.debug") != null;
 
 	/**
@@ -90,26 +90,17 @@ public abstract class DuccAbstractProces
     	return serializerMap.get(Thread.currentThread().getId());
     }
 
-    private void restoreLog4j() {
-		String log4jConfigurationFile="";
-		if ( (log4jConfigurationFile = System.getProperty("ducc.user.log4j.saved.configuration")) != null ) {
-			System.setProperty("log4j.configuration", log4jConfigurationFile);
-		}
-    }
     public int initialize(Properties p, String[] arg) throws Exception {
     	System.out.println("DuccAbstractProcessContainer.initialize() >>>>>>>>> Initializing User Container");
 		// save current context cl and inject System classloader as
 		// a context cl before calling user code. This is done in 
 		// user code needs to load resources 
-    	// Restore user's log4j setting (was hidden from ducc-side logger)
 		ClassLoader savedCL = Thread.currentThread().getContextClassLoader();
-		restoreLog4j();
 		Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 		try {
     		return doInitialize(p, arg);
         }finally {
 			Thread.currentThread().setContextClassLoader(savedCL);
-			System.getProperties().remove("log4j.configuration");
  	 		System.out.println("DuccAbstractProcessContainer.initialize() <<<<<<<< User Container initialized");
         }
     }
@@ -118,9 +109,7 @@ public abstract class DuccAbstractProces
     	System.out.println("DuccAbstractProcessContainer.deploy() >>>>>>>>> Deploying User Container");
     	// save current context cl and inject System classloader as
  		// a context cl before calling user code. 
-    	// Restore user's log4j setting (was hidden from ducc-side logger)
  		ClassLoader savedCL = Thread.currentThread().getContextClassLoader();
- 		restoreLog4j();
  		Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
          try {
      		doDeploy();
@@ -128,8 +117,6 @@ public abstract class DuccAbstractProces
  			Thread.currentThread().setContextClassLoader(savedCL);
  			//	Pin thread to its own CAS serializer instance
  			serializerMap.put( Thread.currentThread().getId(), new DuccUimaSerializer());
- 			// remove log4j configuration property after calling user code
- 			System.getProperties().remove("log4j.configuration");
 			System.out.println("DuccAbstractProcessContainer.deploy() <<<<<<<< User Container deployed");
          }
      }
@@ -137,7 +124,6 @@ public abstract class DuccAbstractProces
     	if (debug) System.out.println("DuccAbstractProcessContainer.process() >>>>>>>>> Processing User Container");
  		// save current context cl and inject System classloader as
  		// a context cl before calling user code. 
-    	// No need to restore log4j properties here
  		ClassLoader savedCL = Thread.currentThread().getContextClassLoader();
  		Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
          try {
@@ -175,4 +161,5 @@ public abstract class DuccAbstractProces
 			throw e;
 		}
 	}
+    
 }