/* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.wiki; import org.hibernate.jmx.StatisticsService; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.*; import org.jboss.seam.annotations.Name; import org.jboss.seam.core.Events; import org.jboss.seam.log.Log; import org.jboss.seam.wiki.util.DBUnitImporter; import javax.management.ObjectName; import javax.naming.*; import java.lang.management.ManagementFactory; import java.lang.reflect.Proxy; import java.util.Properties; /** * Doesn't do much useful stuff except printing a log message and firing the "Wiki.startup" event. * * @author Christian Bauer */ @Name("wikiInit") @Scope(ScopeType.APPLICATION) public class WikiInit { @Logger static Log log; private String appname; private String adminContact; private boolean debug; private boolean hibernateStatistics = true; private int authenticatedSessionTimeoutMinutes = 0; @In(required = false) DBUnitImporter dbunitImporter; private ObjectName hibernateMBeanName; @Observer("org.jboss.seam.postInitialization") public void initWiki() throws Exception { log.info(">>>>>>>>>>>> Starting LaceWiki for application '"+appname+"'..."); if (dbunitImporter != null) { log.info("Importing development test data"); dbunitImporter.importDatasets(); } if (hibernateStatistics) { log.info("registering Hibernate statistics MBean"); hibernateMBeanName = new ObjectName("Hibernate:type=statistics,application="+appname); StatisticsService mBean = new StatisticsService(); mBean.setSessionFactoryJNDIName("SessionFactories/"+appname+"SF"); ManagementFactory.getPlatformMBeanServer().registerMBean(mBean, hibernateMBeanName); } Events.instance().raiseEvent("Wiki.startup"); log.info("Started LaceWiki for application '"+appname+"'..."); //System.out.println(listJNDITree("java:")); } @Destroy public void shutdown() throws Exception { log.info("<<<<<<<<<<<<< Stopping LaceWiki for application '"+appname+"'..."); if (hibernateStatistics) { log.info("unregistering Hibernate statistics MBean"); ManagementFactory.getPlatformMBeanServer().unregisterMBean(hibernateMBeanName); } log.info("Stopped LaceWiki for application '"+appname+"'..."); } public String getAppname() { return appname; } public void setAppname(String appname) { this.appname = appname; } public String getAdminContact() { return adminContact; } public void setAdminContact(String adminContact) { this.adminContact = adminContact; } public boolean isDebug() { return debug; } public void setDebug(boolean debug) { this.debug = debug; } public boolean isHibernateStatistics() { return hibernateStatistics; } public void setHibernateStatistics(boolean hibernateStatistics) { this.hibernateStatistics = hibernateStatistics; } public int getAuthenticatedSessionTimeoutMinutes() { return authenticatedSessionTimeoutMinutes; } public void setAuthenticatedSessionTimeoutMinutes(int authenticatedSessionTimeoutMinutes) { this.authenticatedSessionTimeoutMinutes = authenticatedSessionTimeoutMinutes; } /** Utility to debug JBoss JNDI problems */ public static String listJNDITree(String namespace) { StringBuffer buffer = new StringBuffer(4096); try { Properties props = new Properties(); Context context = new InitialContext(props); // From jndi.properties if (namespace!= null) context = (Context) context.lookup(namespace); buffer.append("Namespace: " + namespace +"\n"); buffer.append("#####################################\n"); list(context, " ", buffer, true); buffer.append("#####################################\n"); } catch (NamingException e) { buffer.append("Failed to get InitialContext, " + e.toString(true)); } return buffer.toString(); } private static void list(Context ctx, String indent, StringBuffer buffer, boolean verbose) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); try { NamingEnumeration ne = ctx.list(""); while (ne.hasMore()) { NameClassPair pair = (NameClassPair) ne.next(); String name = pair.getName(); String className = pair.getClassName(); boolean recursive = false; boolean isLinkRef = false; boolean isProxy = false; Class c = null; try { c = loader.loadClass(className); if (Context.class.isAssignableFrom(c)) recursive = true; if (LinkRef.class.isAssignableFrom(c)) isLinkRef = true; isProxy = Proxy.isProxyClass(c); } catch (ClassNotFoundException cnfe) { // If this is a $Proxy* class its a proxy if (className.startsWith("$Proxy")) { isProxy = true; // We have to get the class from the binding try { Object p = ctx.lookup(name); c = p.getClass(); } catch (NamingException e) { Throwable t = e.getRootCause(); if (t instanceof ClassNotFoundException) { // Get the class name from the exception msg String msg = t.getMessage(); if (msg != null) { // Reset the class name to the CNFE class className = msg; } } } } } buffer.append(indent + " +- " + name); // Display reference targets if (isLinkRef) { // Get the try { Object obj = ctx.lookupLink(name); LinkRef link = (LinkRef) obj; buffer.append("[link -> "); buffer.append(link.getLinkName()); buffer.append(']'); } catch (Throwable t) { buffer.append("invalid]"); } } // Display proxy interfaces if (isProxy) { buffer.append(" (proxy: " + pair.getClassName()); if (c != null) { Class[] ifaces = c.getInterfaces(); buffer.append(" implements "); for (int i = 0; i < ifaces.length; i++) { buffer.append(ifaces[i]); buffer.append(','); } buffer.setCharAt(buffer.length() - 1, ')'); } else { buffer.append(" implements " + className + ")"); } } else if (verbose) { buffer.append(" (class: " + pair.getClassName() + ")"); } buffer.append('\n'); if (recursive) { try { Object value = ctx.lookup(name); if (value instanceof Context) { Context subctx = (Context) value; list(subctx, indent + " | ", buffer, verbose); } else { buffer.append(indent + " | NonContext: " + value); buffer.append('\n'); } } catch (Throwable t) { buffer.append("Failed to lookup: " + name + ", errmsg=" + t.getMessage()); buffer.append('\n'); } } } ne.close(); } catch (NamingException ne) { buffer.append("error while listing context " + ctx.toString() + ": " + ne.toString(true)); } } }