项目研究对象:群发音频
/**
* $RCSfile: BroadcastPlugin.java,v $
* $Revision: 3117 $
* $Date: 2005-11-25 22:57:29 -0300 (Fri, 25 Nov 2005) $
*
* 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 yizhao.voice.server;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.jivesoftware.openfire.SessionManager;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.group.Group;
import org.jivesoftware.openfire.group.GroupManager;
import org.jivesoftware.openfire.group.GroupNotFoundException;
import org.jivesoftware.openfire.user.User;
import org.jivesoftware.openfire.user.UserManager;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.PropertyEventDispatcher;
import org.jivesoftware.util.PropertyEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.component.Component;
import org.xmpp.component.ComponentException;
import org.xmpp.component.ComponentManager;
import org.xmpp.component.ComponentManagerFactory;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
import org.xmpp.packet.PacketError;
import org.xmpp.packet.Presence;
import yizhao.voice.server.dao.PresenceManager;
import yizhao.voice.server.listener.PresenceManagerListener;
/**
* Broadcast service plugin. It accepts messages and broadcasts them out to
* groups of connected users. The address <tt>all@[serviceName].[server]</tt> is
* reserved for sending a broadcast message to all connected users. Otherwise,
* broadcast messages can be sent to groups of users by using addresses in the
* form <tt>[group]@[serviceName].[server]</tt>.
*
* @author Matt Tucker
*/
public class VoiceServerPlugin implements Plugin, Component,PropertyEventListener,PresenceManagerListener {
private static final Logger Log = LoggerFactory.getLogger(VoiceServerPlugin.class);
private String serviceName;
private SessionManager sessionManager;
private String messagePrefix;
private ComponentManager componentManager;
private PluginManager pluginManager;
//状态管理类,用于区分状态信息,状态为在线和离线
private PresenceManager presenceManager;
private String xmppdomain;
private User user;
private UserManager userManager;
public VoiceServerPlugin() {
serviceName = JiveGlobals.getProperty("plugin.broadcast.serviceName",
"broadcast");
messagePrefix = JiveGlobals.getProperty(
"plugin.broadcast.messagePrefix", null);
xmppdomain = "@" + JiveGlobals.getProperty("xmpp.domain");
}
public void initializePlugin(PluginManager manager, File pluginDirectory) {
System.out.println("VoiceServerPlugin start plugin");
pluginManager = manager;
sessionManager = SessionManager.getInstance();
componentManager = ComponentManagerFactory.getComponentManager();
presenceManager=PresenceManager.getInstance();
userManager = UserManager.getInstance();
try {
componentManager.addComponent(serviceName, this);
} catch (Exception e) {
Log.error(e.getMessage(), e);
}
PropertyEventDispatcher.addListener(this);
}
public void initialize(JID jid, ComponentManager componentManager) {
}
public void start() {
}
public void shutdown() {
}
public String getName() {
return pluginManager.getName(this);
}
public String getDescription() {
return pluginManager.getDescription(this);
}
public void processPacket(Packet packet) {
System.out.println(packet.toXML());
boolean canProceed = true;
String toNode = packet.getTo().getNode();
boolean targetAll = "all".equals(toNode);
if (packet instanceof Message) {
Message message = (Message) packet;
processMessage(message, targetAll, canProceed);
}
}
private void processMessage(Message message, boolean targetAll,
boolean canProceed) {
try {
String messagexml = message.toXML().replace("<", "<")
.replace(">", ">");
Log.info("xml=" + messagexml);
Document doc = DocumentHelper.parseText(messagexml);
Element root = doc.getRootElement();
List list = root.selectNodes("/message/body");
Element iqElement = (Element) list.get(0);
String uList = iqElement.elementText("List").trim();
String[] ujidList = null;
if(uList.length() >1){
ujidList= uList.split("[|]");
}else{
ujidList[0]= uList;
}
String fileName = iqElement.elementText("fileName").trim();
String filesize = iqElement.elementText("filesize").trim();
String file = iqElement.elementText("file").trim();
Log.info(file);
if (targetAll) {
if (!canProceed) {
Message error = new Message();
if (message.getID() != null) {
error.setID(message.getID());
}
error.setError(PacketError.Condition.not_allowed);
error.setTo(message.getFrom());
error.setFrom(message.getTo());
error.setSubject("Error sending broadcast message");
error.setBody("Not allowed to send a broadcast message to "
+ message.getTo());
try {
componentManager.sendPacket(this, error);
} catch (Exception e) {
Log.error(e.getMessage(), e);
}
return;
}
if ((messagePrefix != null) && (message.getBody() != null)) {
message.setBody(messagePrefix + " " + message.getBody());
}
//如果是在线的话,则对线上的人进行地址解析后,发送信息
try {
message = new Message();
message.setBody(toXML(fileName, file, filesize));
JID toUserJID=null;
//无论在线或者离线,都必须发送
for (int i = 0; i < ujidList.length; i++) {
//离线
// if(true==(presenceManager.isAvailable(ujidList[i]))){
// //离线发送
// Message newMessage=message.createCopy();
// toUserJID=new JID(ujidList[i] + xmppdomain);
// //获取从哪里来的地址
// newMessage.setFrom(message.getFrom());
// //获取到发往对方的地址
// newMessage.setTo(toUserJID);
// newMessage.setBody(message.getBody());
// System.out.println("正在向离线用户传输数据");
// XMPPServer.getInstance().getOfflineMessageStrategy().storeOffline(newMessage);
// }else{
//发送在线
toUserJID = new JID(ujidList[i] + xmppdomain);
System.out.println("正在向在线用户传输数据");
sessionManager.sendServerMessage(toUserJID, null, message.getBody());
// }
}
} catch (Exception e) {
Log.error("processMessage_for_componentManager"+ e.getMessage(), e);
}
for (int i = 0; i < ujidList.length; i++) {
Log.debug("获取到UJID的值为:"+ujidList[i]);
}
}
// }
} catch (Exception e) {
e.printStackTrace();
}
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
JiveGlobals.setProperty("plugin.broadcast.serviceName", serviceName);
}
public void xmlPropertySet(String property, Map<String, Object> params) {
}
public void xmlPropertyDeleted(String property, Map<String, Object> params) {
}
/**
* Changes the service name to a new value.
*
* @param serviceName
* the service name.
*/
private void changeServiceName(String serviceName) {
if (serviceName == null) {
throw new NullPointerException("Service name cannot be null");
}
if (this.serviceName.equals(serviceName)) {
return;
}
try {
componentManager.removeComponent(this.serviceName);
} catch (Exception e) {
Log.error(e.getMessage(), e);
}
try {
componentManager.addComponent(serviceName, this);
} catch (Exception e) {
Log.error(e.getMessage(), e);
}
this.serviceName = serviceName;
}
public void propertySet(String arg0, Map<String, Object> arg1) {
}
@Override
public void propertyDeleted(String arg0, Map<String, Object> arg1) {
}
@Override
public void destroyPlugin() {
sessionManager=null;
messagePrefix=null;
componentManager=null;
pluginManager=null;
//状态管理类,用于区分状态信息,状态为在线和离线
PresenceManager presenceManager=null;
user=null;
userManager=null;
}
/**
*
* @Title: toXML
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param fileName
* 文件名
* @param file
* 文件内容
* @param fileSize
* 文件大小
* @param 设定文件
* @return String 返回类型
* @throws
*/
private String toXML(String fileName, String file, String fileSize) {
StringBuffer str = new StringBuffer();
str.append("<fileName>");
str.append(fileName);
str.append("</fileName>");
str.append("<filesize>");
str.append(fileSize);
str.append(" </filesize>");
str.append("<file>");
str.append(file);
str.append("</file>");
return str.toString();
}
@Override
public void taskPresence() {
}
}