/*
* Copyright (C) 2004-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.fastpath;
import java.io.File;
import java.io.FileFilter;
import org.jivesoftware.openfire.cluster.ClusterEventListener;
import org.jivesoftware.openfire.cluster.ClusterManager;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.fastpath.util.TaskEngine;
import org.jivesoftware.openfire.user.UserNameManager;
import org.jivesoftware.openfire.user.UserNameProvider;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.xmpp.workgroup.Workgroup;
import org.jivesoftware.xmpp.workgroup.WorkgroupManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.component.ComponentException;
import org.xmpp.component.ComponentManagerFactory;
import org.xmpp.packet.JID;
/**
* Openfire Fastpath plugin.
*
* @author Matt Tucker
*/
public class FastpathPlugin implements Plugin, ClusterEventListener {
private static final Logger Log = LoggerFactory.getLogger(FastpathPlugin.class);
/**
* Keep a reference to Fastpath only when the service is up and running in this JVM.
*/
private WorkgroupManager workgroupManager;
public void initializePlugin(PluginManager manager, File pluginDirectory) {
// 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 Fastpath Plugin");
throw new IllegalStateException("This plugin cannot run next to the Enterprise plugin");
}
// Make sure that the fastpath folder exists under the home directory
File fastpathDir = new File(JiveGlobals.getHomeDirectory() +
File.separator + "fastpath");
if (!fastpathDir.exists()) {
fastpathDir.mkdirs();
}
workgroupManagerStart();
// Listen to cluster events
ClusterManager.addListener(this);
}
public void destroyPlugin() {
workgroupManagerStop();
// Stop listen to cluster events
ClusterManager.removeListener(this);
// Dispose pending tasks
TaskEngine.getInstance().dispose();
}
private void workgroupManagerStart() {
workgroupManager = WorkgroupManager.getInstance();
// Register Fastpath service
try {
ComponentManagerFactory.getComponentManager().addComponent("workgroup", workgroupManager);
}
catch (ComponentException e) {
// Do nothing. Should never happen.
Log.error(e.getMessage(), e);
}
// Register the provider of workgroup names
UserNameManager.addUserNameProvider(workgroupManager.getAddress().toString(),
new UserNameProvider() {
public String getUserName(JID entity) {
try {
Workgroup workgroup = workgroupManager.getWorkgroup(entity);
return workgroup.getDisplayName();
}
catch (UserNotFoundException e) {
return entity.toString();
}
}
});
// Start the Fastpath module
workgroupManager.start();
}
private void workgroupManagerStop() {
// Unregister workgroup component
try {
ComponentManagerFactory.getComponentManager().removeComponent("workgroup");
}
catch (ComponentException e) {
Log.error("Error unregistering workgroup component", e);
}
if (workgroupManager != null) {
// Unregister the provider of workgroup names
UserNameManager.removeUserNameProvider(workgroupManager.getAddress().toString());
// Stop the Fastpath module
workgroupManager.stop();
}
// Clean up the reference to the workgroup manager as a way to say that FP is no longer running in this JVM
workgroupManager = null;
}
public void joinedCluster() {
workgroupManagerStop();
}
public void joinedCluster(byte[] nodeID) {
// Do nothing
}
public void leftCluster() {
workgroupManagerStart();
}
public void leftCluster(byte[] nodeID) {
// Do nothing
}
public void markedAsSeniorClusterMember() {
workgroupManagerStart();
}
}