/* * Copyright (C) 2008 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.openfire.plugin; import java.io.File; import java.io.FileFilter; import com.reucon.openfire.plugin.archive.impl.MucMamPersistenceManager; import com.reucon.openfire.plugin.archive.xep0313.Xep0313Support1; import org.jivesoftware.openfire.XMPPServer; import org.jivesoftware.openfire.archive.ArchiveIndexer; import org.jivesoftware.openfire.archive.ArchiveInterceptor; import org.jivesoftware.openfire.archive.ArchiveSearcher; import org.jivesoftware.openfire.archive.ConversationManager; import org.jivesoftware.openfire.archive.GroupConversationInterceptor; import org.jivesoftware.openfire.archive.MonitoringConstants; import org.jivesoftware.openfire.container.Plugin; import org.jivesoftware.openfire.container.PluginManager; import org.jivesoftware.openfire.reporting.graph.GraphEngine; import org.jivesoftware.openfire.reporting.stats.DefaultStatsViewer; import org.jivesoftware.openfire.reporting.stats.MockStatsViewer; import org.jivesoftware.openfire.reporting.stats.StatisticsModule; import org.jivesoftware.openfire.reporting.stats.StatsEngine; import org.jivesoftware.openfire.reporting.stats.StatsViewer; import org.jivesoftware.openfire.reporting.util.TaskEngine; import org.jivesoftware.util.JiveGlobals; import org.jivesoftware.util.JiveProperties; import org.picocontainer.MutablePicoContainer; import org.picocontainer.defaults.DefaultPicoContainer; import com.reucon.openfire.plugin.archive.ArchiveManager; import com.reucon.openfire.plugin.archive.ArchiveProperties; import com.reucon.openfire.plugin.archive.IndexManager; import com.reucon.openfire.plugin.archive.PersistenceManager; import com.reucon.openfire.plugin.archive.impl.ArchiveManagerImpl; import com.reucon.openfire.plugin.archive.impl.JdbcPersistenceManager; import com.reucon.openfire.plugin.archive.xep0136.Xep0136Support; import com.reucon.openfire.plugin.archive.xep0313.Xep0313Support; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmpp.packet.JID; /** * Openfire Monitoring plugin. * * @author Matt Tucker */ public class MonitoringPlugin implements Plugin { private static final int DEFAULT_CONVERSATION_TIMEOUT = 30; // minutes private MutablePicoContainer picoContainer; private boolean shuttingDown = false; private int conversationTimeout; private static MonitoringPlugin instance; private boolean enabled = true; private PersistenceManager persistenceManager; private PersistenceManager mucPersistenceManager; private ArchiveManager archiveManager; private IndexManager indexManager; private Xep0136Support xep0136Support; private Xep0313Support xep0313Support; private Xep0313Support1 xep0313Support1; private Logger Log; public MonitoringPlugin() { instance = this; // Enable AWT headless mode so that stats will work in headless // environments. System.setProperty("java.awt.headless", "true"); picoContainer = new DefaultPicoContainer(); picoContainer.registerComponentInstance(TaskEngine.getInstance()); picoContainer.registerComponentInstance(JiveProperties.getInstance()); // Stats and Graphing classes picoContainer.registerComponentImplementation(StatsEngine.class); picoContainer.registerComponentImplementation(GraphEngine.class); picoContainer.registerComponentImplementation(StatisticsModule.class); picoContainer.registerComponentImplementation(StatsViewer.class, getStatsViewerImplementation()); // Archive classes picoContainer .registerComponentImplementation(ConversationManager.class); picoContainer.registerComponentImplementation(ArchiveInterceptor.class); picoContainer .registerComponentImplementation(GroupConversationInterceptor.class); picoContainer.registerComponentImplementation(ArchiveSearcher.class); picoContainer.registerComponentImplementation(ArchiveIndexer.class); } private Class<? extends StatsViewer> getStatsViewerImplementation() { if (JiveGlobals.getBooleanProperty("stats.mock.viewer", false)) { return MockStatsViewer.class; } else { return DefaultStatsViewer.class; } } public static MonitoringPlugin getInstance() { return instance; } /* enabled property */ public boolean isEnabled() { return this.enabled; } public ArchiveManager getArchiveManager() { return archiveManager; } public IndexManager getIndexManager() { return indexManager; } public PersistenceManager getPersistenceManager(JID jid) { Log.debug("Getting PersistenceManager for {}", jid); if (XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService(jid) != null) { Log.debug("Using MucPersistenceManager"); return mucPersistenceManager; } return persistenceManager; } /** * Returns the instance of a module registered with the Monitoring plugin. * * @param clazz * the module class. * @return the instance of the module. */ public Object getModule(Class<?> clazz) { return picoContainer.getComponentInstanceOfType(clazz); } public void initializePlugin(PluginManager manager, File pluginDirectory) { Log = LoggerFactory.getLogger(MonitoringPlugin.class); /* Configuration */ conversationTimeout = JiveGlobals.getIntProperty( ArchiveProperties.CONVERSATION_TIMEOUT, DEFAULT_CONVERSATION_TIMEOUT); enabled = JiveGlobals.getBooleanProperty(ArchiveProperties.ENABLED, false); persistenceManager = new JdbcPersistenceManager(); mucPersistenceManager = new MucMamPersistenceManager(); archiveManager = new ArchiveManagerImpl(persistenceManager, indexManager, conversationTimeout); xep0136Support = new Xep0136Support(XMPPServer.getInstance()); xep0136Support.start(); xep0313Support = new Xep0313Support(XMPPServer.getInstance()); xep0313Support.start(); xep0313Support1 = new Xep0313Support1(XMPPServer.getInstance()); xep0313Support1.start(); // Check if we Enterprise is installed and stop loading this plugin if // found File pluginDir = new File(JiveGlobals.getHomeDirectory(), "plugins"); File[] jars = pluginDir.listFiles(new FileFilter() { public boolean accept(File pathname) { String fileName = pathname.getName().toLowerCase(); return (fileName.equalsIgnoreCase("enterprise.jar")); } }); if (jars.length > 0) { // Do not load this plugin since Enterprise is still installed System.out .println("Enterprise plugin found. Stopping Monitoring Plugin"); throw new IllegalStateException( "This plugin cannot run next to the Enterprise plugin"); } shuttingDown = false; // Make sure that the monitoring folder exists under the home directory File dir = new File(JiveGlobals.getHomeDirectory() + File.separator + MonitoringConstants.NAME); if (!dir.exists()) { dir.mkdirs(); } picoContainer.start(); } public void destroyPlugin() { shuttingDown = true; if (picoContainer != null) { picoContainer.stop(); picoContainer.dispose(); picoContainer = null; } instance = null; } public boolean isShuttingDown() { return shuttingDown; } }