You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by wo...@apache.org on 2010/02/05 17:13:36 UTC
svn commit: r906988 - in
/portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed:
container/JetspeedContainerServlet.java util/JetspeedLoggerUtil.java
Author: woonsan
Date: Fri Feb 5 16:13:35 2010
New Revision: 906988
URL: http://svn.apache.org/viewvc?rev=906988&view=rev
Log:
JS2-1099: Making PA's error logs left in PA's log file.
Modified:
portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/container/JetspeedContainerServlet.java
portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/JetspeedLoggerUtil.java
Modified: portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/container/JetspeedContainerServlet.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/container/JetspeedContainerServlet.java?rev=906988&r1=906987&r2=906988&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/container/JetspeedContainerServlet.java (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/container/JetspeedContainerServlet.java Fri Feb 5 16:13:35 2010
@@ -61,8 +61,12 @@
public class JetspeedContainerServlet extends HttpServlet
{
private static final long serialVersionUID = -7900846019170204195L;
+
+ private JetspeedLogger paLogger;
+
private boolean started = false;
private PortalSessionsManager psm;
+
// default visibility for more optimal access by the startTimer
Timer startTimer = null;
String contextName;
@@ -82,6 +86,8 @@
public synchronized final void init(ServletConfig config) throws ServletException
{
+ paLogger = null;
+
synchronized (this.getClass())
{
super.init(config);
@@ -109,21 +115,20 @@
throw new ServletException(JCS + "Portlet Application contextPath must start with a \"/\".");
}
-
String paDir = context.getRealPath("/");
if ( paDir == null )
- {
- throw new ServletException(JCS + " Initialization of PortletApplication at "+contextName+" without access to its real path not supported");
- }
-
- JetspeedLogger jsLogger = JetspeedLoggerUtil.getLogger(getClass());
+ {
+ throw new ServletException(JCS + " Initialization of PortletApplication at "+contextName+" without access to its real path not supported");
+ }
+
+ JetspeedLogger jsLogger = JetspeedLoggerUtil.getSharedLogger(getClass());
jsLogger.info(INIT_START_MSG + contextName);
context.log(INIT_START_MSG + contextName);
System.out.println(INIT_START_MSG + contextName);
try
{
- startPortletApplication(context, paDir, Thread.currentThread().getContextClassLoader());
+ startPortletApplication(context, paDir, Thread.currentThread().getContextClassLoader());
}
catch (Exception e)
{
@@ -133,7 +138,7 @@
System.err.println(message);
throw new ServletException(message, e);
}
-
+
jsLogger.info(INIT_DONE_MSG + contextName);
context.log(INIT_DONE_MSG + contextName);
System.out.println(INIT_DONE_MSG + contextName);
@@ -155,7 +160,7 @@
}
*/
final String START_DELAYED_MSG = JCS + "Could not yet start portlet application at: "+contextName+". Starting back ground thread to start when the portal comes online.";
- JetspeedLogger jsLogger = JetspeedLoggerUtil.getLogger(getClass());
+ JetspeedLogger jsLogger = JetspeedLoggerUtil.getSharedLogger(getClass());
jsLogger.info(START_DELAYED_MSG);
context.log(START_DELAYED_MSG);
startTimer = new Timer(true);
@@ -174,7 +179,7 @@
}
else
{
- JetspeedLogger jsLogger = JetspeedLoggerUtil.getLogger(getClass());
+ JetspeedLogger jsLogger = JetspeedLoggerUtil.getSharedLogger(getClass());
jsLogger.info(START_DELAYED_MSG);
context.log(START_DELAYED_MSG);
}
@@ -186,7 +191,7 @@
boolean attemptStart(ServletContext context, String contextName, String contextPath, String paDir, ClassLoader paClassLoader)
{
- JetspeedLogger jsLogger = JetspeedLoggerUtil.getLogger(getClass());
+ JetspeedLogger jsLogger = JetspeedLoggerUtil.getSharedLogger(getClass());
try
{
@@ -325,7 +330,15 @@
}
catch (Throwable t)
{
- JetspeedLogger jsLogger = JetspeedLoggerUtil.getLogger(getClass());
+ if (paLogger == null)
+ {
+ paLogger = JetspeedLoggerUtil.getLocalLogger(getClass());
+
+ if (paLogger == null)
+ {
+ paLogger = JetspeedLoggerUtil.getSharedLogger(getClass());
+ }
+ }
if ( t instanceof UnavailableException )
{
@@ -336,7 +349,7 @@
if (PortletWindow.Action.RENDER.equals(window.getAction())|| PortletWindow.Action.RESOURCE.equals(window.getAction()))
{
ServletContext context = getServletContext();
- jsLogger.error(JCS + "Error rendering portlet \"" + window.getPortletDefinition().getUniqueName() + "\": " + t.toString(), t);
+ paLogger.error(JCS + "Error rendering portlet \"" + window.getPortletDefinition().getUniqueName() + "\": " + t.toString(), t);
PrintWriter writer = ((PortletMimeResponseContext)window.getPortletResponseContext()).getWriter();
if (writer != null)
{
@@ -423,7 +436,7 @@
PortletApplicationManagement pam = (PortletApplicationManagement) services.getService("PAM");
if ((pam != null) && pam.isStarted())
{
- JetspeedLogger jsLogger = JetspeedLoggerUtil.getLogger(getClass());
+ JetspeedLogger jsLogger = JetspeedLoggerUtil.getSharedLogger(getClass());
jsLogger.info(STOP_MSG + contextName);
getServletContext().log(STOP_MSG + contextName);
try
Modified: portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/JetspeedLoggerUtil.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/JetspeedLoggerUtil.java?rev=906988&r1=906987&r2=906988&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/JetspeedLoggerUtil.java (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/JetspeedLoggerUtil.java Fri Feb 5 16:13:35 2010
@@ -16,27 +16,107 @@
*/
package org.apache.jetspeed.util;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
import org.apache.jetspeed.logger.JetspeedLogger;
import org.apache.jetspeed.logger.JetspeedLoggerFactory;
import org.apache.jetspeed.services.JetspeedPortletServices;
import org.apache.jetspeed.services.PortletServices;
/**
- * JetspeedLoggerUtil
+ * JetspeedLoggerUtil to get access to portlet web application's logger or shared portal logger.
*
* @version $Id$
*/
public class JetspeedLoggerUtil
{
+
+ /**
+ * Default logger factory class name
+ */
+ public static final String DEFAULT_LOGGER_FACTORY = "org.slf4j.LoggerFactory";
+
+ /**
+ * Default logger factory method to create a logger object.
+ */
+ public static final String DEFAULT_LOGGER_FACTORY_METHOD = "getLogger";
+
+ private static JetspeedLogger noopLogger = new NOOPJetspeedLogger();
+
private JetspeedLoggerUtil()
{
}
-
+
+ /**
+ * Returns a JetspeedLogger from the portlet application.
+ * <P>
+ * <EM>Note: This method tries to retrieve slf4j Logger by using current context classloader
+ * to get a portlet application specific logger.</EM>
+ * </P>
+ * <P>
+ * If no portlet application specific slf4j Logger is available, then it returns null.
+ * </P>
+ * @param clazz
+ * @return
+ */
+ public static JetspeedLogger getLocalLogger(Class<?> clazz)
+ {
+ try
+ {
+ Class<?> factoryClazz = Thread.currentThread().getContextClassLoader().loadClass(DEFAULT_LOGGER_FACTORY);
+ Object logger = invokeDeclaredMethod(factoryClazz, DEFAULT_LOGGER_FACTORY_METHOD, new Class [] { Class.class }, new Object [] { clazz });
+
+ if (logger != null)
+ {
+ return new DelegatingByReflectionJetspeedLogger(logger);
+ }
+ }
+ catch (Exception e)
+ {
+ getSharedLogger(clazz).warn("Failed to create PA logger: " + e);
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns a JetspeedLogger from the portlet application.
+ * <P>
+ * <EM>Note: This method tries to retrieve slf4j Logger by using current context classloader
+ * to get a portlet application specific logger.</EM>
+ * </P>
+ * <P>
+ * If no portlet application specific slf4j Logger is available, then it returns null.
+ * </P>
+ * @param name
+ * @return
+ */
+ public static JetspeedLogger getLocalLogger(String name)
+ {
+ try
+ {
+ Class<?> factoryClazz = Thread.currentThread().getContextClassLoader().loadClass(DEFAULT_LOGGER_FACTORY);
+ Object logger = invokeDeclaredMethod(factoryClazz, DEFAULT_LOGGER_FACTORY_METHOD, new Class [] { String.class }, new Object [] { name });
+
+ if (logger != null)
+ {
+ return new DelegatingByReflectionJetspeedLogger(logger);
+ }
+ }
+ catch (Exception e)
+ {
+ getSharedLogger(name).warn("Failed to create PA logger: " + e);
+ }
+
+ return null;
+ }
+
/**
* Returns a JetspeedLogger from the portal services component.
* <P>
- * <EM>Note: A component which wants to use <CODE>JetspeedLogger</CODE> must invoke this method
- * whenever it tries to leave logs. The retrieved logger instance must not be kept for later use.
+ * <EM>Note: A component which wants to use the shared <CODE>JetspeedLogger</CODE> should invoke this method
+ * whenever it tries to leave logs. The retrieved logger instance should not be kept for later use.
* Jetspeed container can be reloaded any time and it can make the old logger instances invalid.</EM>
* </P>
* <P>
@@ -46,7 +126,7 @@
* @param clazz
* @return
*/
- public static JetspeedLogger getLogger(Class<?> clazz)
+ public static JetspeedLogger getSharedLogger(Class<?> clazz)
{
PortletServices ps = JetspeedPortletServices.getSingleton();
@@ -62,12 +142,12 @@
return noopLogger;
}
-
+
/**
* Returns a JetspeedLogger from the portal services component.
* <P>
- * <EM>Note: A component which wants to use <CODE>JetspeedLogger</CODE> must invoke this method
- * whenever it tries to leave logs. The retrieved logger instance must not be kept for later use.
+ * <EM>Note: A component which wants to use the shared <CODE>JetspeedLogger</CODE> should invoke this method
+ * whenever it tries to leave logs. The retrieved logger instance should not be kept for later use.
* Jetspeed container can be reloaded any time and it can make the old logger instances invalid.</EM>
* </P>
* <P>
@@ -77,7 +157,7 @@
* @param name
* @return
*/
- public static JetspeedLogger getLogger(String name)
+ public static JetspeedLogger getSharedLogger(String name)
{
PortletServices ps = JetspeedPortletServices.getSingleton();
@@ -94,86 +174,229 @@
return noopLogger;
}
- private static JetspeedLogger noopLogger = new JetspeedLogger()
+ private static Object invokeDeclaredMethod(Class<?> targetClazz, String methodName, Class<?> [] argTypes, Object ... args)
{
+ try
+ {
+ Method method = targetClazz.getDeclaredMethod(methodName, argTypes);
+ return method.invoke(targetClazz, args);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failed to invoke logging method. " + e);
+ }
+ }
+
+ private static class DelegatingByReflectionJetspeedLogger implements JetspeedLogger, Serializable
+ {
+ private static final long serialVersionUID = 1L;
+
+ private Class<?> targetClazz;
+ private Object targetLogger;
+
+ public DelegatingByReflectionJetspeedLogger(Object targetLogger)
+ {
+ this.targetLogger = targetLogger;
+ this.targetClazz = targetLogger.getClass();
+ }
+
+ public boolean isDebugEnabled()
+ {
+ return ((Boolean) invokeLoggerMethod("isDebugEnabled", null)).booleanValue();
+ }
+
+ public boolean isInfoEnabled()
+ {
+ return ((Boolean) invokeLoggerMethod("isInfoEnabled", null)).booleanValue();
+ }
+
+ public boolean isWarnEnabled()
+ {
+ return ((Boolean) invokeLoggerMethod("isWarnEnabled", null)).booleanValue();
+ }
+
+ public boolean isErrorEnabled()
+ {
+ return ((Boolean) invokeLoggerMethod("isErrorEnabled", null)).booleanValue();
+ }
+
public void debug(String msg)
{
+ invokeLoggerMethod("debug", new Class [] { String.class }, msg);
}
public void debug(String format, Object arg)
{
+ invokeLoggerMethod("debug", new Class [] { String.class, Object.class }, format, arg);
}
public void debug(String format, Object arg1, Object arg2)
{
+ invokeLoggerMethod("debug", new Class [] { String.class, Object.class, Object.class }, format, arg1, arg2);
}
public void debug(String format, Object[] argArray)
{
+ invokeLoggerMethod("debug", new Class [] { String.class, Object [].class }, format, argArray);
}
public void debug(String msg, Throwable t)
{
+ invokeLoggerMethod("debug", new Class [] { String.class, Throwable.class }, msg, t);
+ }
+
+ public void info(String msg)
+ {
+ invokeLoggerMethod("info", new Class [] { String.class }, msg);
+ }
+
+ public void info(String format, Object arg)
+ {
+ invokeLoggerMethod("info", new Class [] { String.class, Object.class }, format, arg);
+ }
+
+ public void info(String format, Object arg1, Object arg2)
+ {
+ invokeLoggerMethod("info", new Class [] { String.class, Object.class, Object.class }, format, arg1, arg2);
+ }
+
+ public void info(String format, Object[] argArray)
+ {
+ invokeLoggerMethod("info", new Class [] { String.class, Object [].class }, format, argArray);
}
+ public void info(String msg, Throwable t)
+ {
+ invokeLoggerMethod("info", new Class [] { String.class, Throwable.class }, msg, t);
+ }
+
+ public void warn(String msg)
+ {
+ invokeLoggerMethod("warn", new Class [] { String.class }, msg);
+ }
+
+ public void warn(String format, Object arg)
+ {
+ invokeLoggerMethod("warn", new Class [] { String.class, Object.class }, format, arg);
+ }
+
+ public void warn(String format, Object arg1, Object arg2)
+ {
+ invokeLoggerMethod("warn", new Class [] { String.class, Object.class, Object.class }, format, arg1, arg2);
+ }
+
+ public void warn(String format, Object[] argArray)
+ {
+ invokeLoggerMethod("warn", new Class [] { String.class, Object [].class }, format, argArray);
+ }
+
+ public void warn(String msg, Throwable t)
+ {
+ invokeLoggerMethod("warn", new Class [] { String.class, Throwable.class }, msg, t);
+ }
+
public void error(String msg)
{
+ invokeLoggerMethod("error", new Class [] { String.class }, msg);
}
public void error(String format, Object arg)
{
+ invokeLoggerMethod("error", new Class [] { String.class, Object.class }, format, arg);
}
public void error(String format, Object arg1, Object arg2)
{
+ invokeLoggerMethod("error", new Class [] { String.class, Object.class, Object.class }, format, arg1, arg2);
}
public void error(String format, Object[] argArray)
{
+ invokeLoggerMethod("error", new Class [] { String.class, Object [].class }, format, argArray);
}
public void error(String msg, Throwable t)
{
+ invokeLoggerMethod("error", new Class [] { String.class, Throwable.class }, msg, t);
+ }
+
+ private Object invokeLoggerMethod(String methodName, Class<?> [] argTypes, Object ... args)
+ {
+ try
+ {
+ Method method = targetClazz.getMethod(methodName, argTypes);
+ return method.invoke(targetLogger, args);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failed to invoke logger method. " + e);
+ }
+ }
+
+ };
+
+ private static class NOOPJetspeedLogger implements JetspeedLogger, Serializable
+ {
+ private static final long serialVersionUID = 1L;
+
+ public boolean isDebugEnabled()
+ {
+ return false;
+ }
+
+ public boolean isInfoEnabled()
+ {
+ return false;
}
- public void info(String msg)
+ public boolean isWarnEnabled()
+ {
+ return false;
+ }
+
+ public boolean isErrorEnabled()
+ {
+ return false;
+ }
+
+ public void debug(String msg)
+ {
+ }
+
+ public void debug(String format, Object arg)
{
}
- public void info(String format, Object arg)
+ public void debug(String format, Object arg1, Object arg2)
{
}
- public void info(String format, Object arg1, Object arg2)
+ public void debug(String format, Object[] argArray)
{
}
- public void info(String format, Object[] arg1)
+ public void debug(String msg, Throwable t)
{
}
- public void info(String msg, Throwable t)
+ public void info(String msg)
{
}
- public boolean isDebugEnabled()
+ public void info(String format, Object arg)
{
- return false;
}
- public boolean isErrorEnabled()
+ public void info(String format, Object arg1, Object arg2)
{
- return false;
}
- public boolean isInfoEnabled()
+ public void info(String format, Object[] argArray)
{
- return false;
}
- public boolean isWarnEnabled()
+ public void info(String msg, Throwable t)
{
- return false;
}
public void warn(String msg)
@@ -195,5 +418,27 @@
public void warn(String msg, Throwable t)
{
}
+
+ public void error(String msg)
+ {
+ }
+
+ public void error(String format, Object arg)
+ {
+ }
+
+ public void error(String format, Object arg1, Object arg2)
+ {
+ }
+
+ public void error(String format, Object[] argArray)
+ {
+ }
+
+ public void error(String msg, Throwable t)
+ {
+ }
+
};
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org