OpenFire学习(二)内部组件

说明

内部组件就是openfire的插件,因为它必须和openfire所在的进程一起运行,被openfire动态加载,所以叫做openfire插件。
一般来说,都是通过admin管理界面进行导入

添加插件

添加操作说明

删除插件

删除操作说明

项目结构

  • src
  • plugin.xml
  • changelog.html:发布日志,记录插件各版本的变化情况,就是纯HTML,方便阅读即可
  • readme.html:项目描述
  • logo_large.gif:插件大logo
  • logo_small.gif :插件小logo
  • pom.xml:打包的项目

src

不用多说,自然是源码路径,内部就是一个web项目,内部包含java:资源代码,resources:项目配置资源等,webapp:web服务资源、服务配置web.xml等。
最为重要的是assembly,其重要配置项目的xml信息,是否见插件jar的关键


源码结构

assembly.xml




    openfire-plugin-ms-filter
    
        jar
    
    false

    
    
        
            true
            
                org.igniterealtime.openfire.ofmeet:videobridge
            
            
                false
                true
                lib-videobridge
            
        

        
            true
            
                org.igniterealtime.openfire.ofmeet:offocus
            
            
                false
                true
                lib-jicofo
            
        

        
            true
            
                org.igniterealtime.openfire.ofmeet:ofgasi
            
            
                false
                true
                lib-jigasi
            
        
    

    

        
        
            
            ${project.build.sourceDirectory}/../..
            
                *.gif
                *.png
                lib/**
            
        

        
        
            
            ${project.build.sourceDirectory}/../..
            true
            
                *.html
                plugin.xml
            
        

        
        
            
            ${project.build.sourceDirectory}/..
            
                database/**
                i18n/**
                web/**
            
            
            
                **/*.jsp
                i18n/**/*.properties
                web/**/*.xml
                web/**/*.html
                web/**/*.properties
            
        

        
        
            
            ${project.build.sourceDirectory}/..
            true
            
                i18n/**/*.properties
                web/**/*.xml
                web/**/*.html
                web/**/*.properties
            
            
                
                web/WEB-INF/web.xml
            
        

        
        
            web/WEB-INF
            ${project.build.directory}
            
                web.xml
            
        

        
        
            classes
            classes
            true
            
                **/*.xml
                **/*.properties
            
        

        
        
            classes
            classes
            false
            
                **/*.xml
                **/*.properties
            
        
    

    
    
        
            lib
            true
            
            
                org.igniterealtime.openfire.ofmeet:videobridge
                org.igniterealtime.openfire.ofmeet:offocus
                org.igniterealtime.openfire.ofmeet:ofgasi
            
            true
            true
        
    


plugin.xml

是最重要的插件的配置文件。这个文件非常重要,openfire需要读取插件信息,例如插件的启动类是哪一个,需要在plugin.xml中定义

标签 说明
class 插件的启动类,也可以理解为插件的main函数
name 插件的名字
description 插件功能描述字段
author 作者名称
version 插件版本
date 插件书写的日期,这个自己知道就可以了
url 插件的官网
minServerVersion openfire的最小版本
minJavaVersion JDK最小版本

    com.demo.plugin.MessageFilterPlugin
    文本消息过滤插件
    过滤一些敏感词、非法词汇
    机制的我
    ${project.version}
    06/06/2019
    4.3.2
    1.8

实战

1、在父项目中的plugin模块下,创建子项目,然后按照上面的结构,创建项目按照上面结构
2、复制assembly.xml
3、然后编写主要业务类
4、补上pom的配置
一个小插件项目就完成了,然后就是打包命令,在父项目目录下

mvn verify -f plugins/openfire-plugin-ms-filter/pom.xml

最后打包出来的项目openfire-plugin-ms-filter.jar,通过上面添加插件的步骤,通过admin界面进行添加。

插件

下面粘贴部分需要用到的项目的代码和xml。

业务类

package com.demo.plugin;

import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

import java.io.File;

public class MessageFilterPlugin implements Plugin, PacketInterceptor {
    private static final Logger Log = LoggerFactory.getLogger(MessageFilterPlugin.class);
    // 消息拦截器
    private InterceptorManager interceptorManager;

    // 插件初始化函数
    @Override
    public void initializePlugin(PluginManager pluginManager, File file) {
        // 将当前插件加入到消息拦截管理器(interceptorManager )中,当消息到来或者发送出去的时候,会触发本插件的interceptPacket方法。
        interceptorManager = InterceptorManager.getInstance();
        interceptorManager.addInterceptor(this);
    }

    // 插件销毁函数
    @Override
    public void destroyPlugin() {
        // 当插件被卸载的时候,主要通过openfire管理控制台卸载插件时,被调用。注意interceptorManager的addInterceptor和removeInterceptor需要成对调用。
        interceptorManager.removeInterceptor(this);
    }

    // 插件拦截处理函数
    @Override
    public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException {
        // incoming表示本条消息刚进入openfire。processed为false,表示本条消息没有被openfire处理过。这说明这是一条处女消息,也就是没有被处理过的消息。
        if (incoming && processed == false) {
            // packet可能是IQ、Presence、Message,这里当packet是message的时候,进行处理。
            if (packet instanceof Message) {
                // 将packet强制转换为Message
                Message msg = (Message) packet;
                // 取得message中的body内容,就是消息正文
                String body = msg.getBody();
                // 如果内容中包含fuck,则拒绝处理消息
                if (body != null && body.contains("fuck")) {
                    // 这里通过抛出异常的方式,来阻止程序流程继续执行下去。
                    PacketRejectedException rejectedException = new PacketRejectedException();
                    // 设置返回信息
                    rejectedException.setRejectionMessage("信息发送失败,包含侮辱性词语");

                    throw rejectedException;
                }

            }
        }
    }
}

配置pom



    4.0.0
    
        org.igniterealtime.openfire
        plugins
        4.3.2
    
    com.openfire.plugin.demo
    openfire-plugin-ms-filter
    1.0


    
        src/java
        src/test
        
            
                org.apache.maven.plugins
                maven-assembly-plugin
                2.6
                
                    
                        make-assembly
                        package
                        
                            single
                        
                        
                            false
                            ${project.artifactId}
                            false
                            
                                src/assembly/ms-filter-plugin-assembly.xml
                            
                        
                    
                
            
            
            
                org.eclipse.jetty
                jetty-jspc-maven-plugin
                9.2.14.v20151106
                
                    ${project.build.sourceDirectory}/../java
                    ${project.build.sourceDirectory}/../java/WEB-INF/web.xml
                
                
                    
                        jspc
                        
                            jspc
                        
                        
                            
                                org.jivesoftware.openfire.plugin.${project.artifactId}
                            
                        
                    
                
                
                    
                        org.igniterealtime.openfire
                        xmppserver
                        ${openfire.version}
                    
                
            


            
            
            
                org.apache.felix
                maven-bundle-plugin
                3.0.0
                true
            
        
    

    
    



你可能感兴趣的:(OpenFire学习(二)内部组件)