May 17, 2006

[Library] Java Plugin Framework(JPF) にチャレンジ

Java Plugin Framework(JPF) とは

JPF は、Plugin アーキテクチャをサポートするためのライブラリ。 ZIP や JAR 形式で Plugin を作成し、アプリケーションからその Plugin を読み込み利用する。

Java Plugin Framework(JPF)
http://jpf.sourceforge.net/
Tutorial
http://jpf.sourceforge.net/tutorial.html

デモアプリケーションの起動

JPF にはデモアプリケーションが用意されている。 デモアプリケーションは簡単に起動し、Plugin のロードを試すことができる。

jpf-demo
http://sourceforge.net/project/showfiles.php?group_id=110394&package_id=121489
jpf-demo-bin-0.8> set JAVA_HOME=c:\_java\jdk\1.5.0_06
jpf-demo-bin-0.8> set PATH=%JAVA_HOME%\bin;%PATH%
jpf-demo-bin-0.8> run.bat
[デモアプリケーションのウィンドウ]

サンプルコード

PluginManager を初期化し、Plugin をロードするサンプルコード。

package jp.in_vitro.codelets.jpf;

import java.io.InputStream;
import java.util.Collection;

import org.java.plugin.ObjectFactory;
import org.java.plugin.PluginManager;
import org.java.plugin.PluginManager.PluginLocation;
import org.java.plugin.boot.DefaultPluginsCollector;
import org.java.plugin.boot.PluginsCollector;
import org.java.plugin.registry.ExtensionPoint;
import org.java.plugin.registry.PluginDescriptor;
import org.java.plugin.util.ExtendedProperties;

public class Codelet {

    public Codelet() {
        super();
    }

    protected void execute() throws Exception {
        ExtendedProperties config = new ExtendedProperties(System
                .getProperties());
        InputStream is = null;
        try {
            String configFile = "/"
                    + this.getClass().getPackage().getName().replaceAll("\\.",
                            "/") + "/" + "config.properties";
            is = this.getClass().getResourceAsStream(configFile);
            config.load(is);
        } finally {
            if (is != null) {
                is.close();
            }
        }
        PluginManager pluginManager = ObjectFactory.newInstance(config)
                .createManager();

        PluginsCollector collector = new DefaultPluginsCollector();
        collector.configure(config);
        Collection pluginLocations = collector.collectPluginLocations();

        pluginManager.publishPlugins((PluginLocation[]) pluginLocations
                .toArray(new PluginLocation[pluginLocations.size()]));

        for (Object pdObj : pluginManager.getRegistry().getPluginDescriptors()) {
            PluginDescriptor pd = (PluginDescriptor) pdObj;
            System.out.println("" + pd);
            for (Object epObj : pd.getExtensionPoints()) {
                ExtensionPoint ep = (ExtensionPoint) epObj;
                System.out.println("    " + ep);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        Codelet me = new Codelet();
        me.execute();
    }
}

config.properties

org.java.plugin.PathResolver=org.java.plugin.standard.ShadingPathResolver
org.java.plugin.standard.ShadingPathResolver.shadowFolder=${applicationRoot}/temp/.jpf-shadow
org.java.plugin.standard.ShadingPathResolver.unpackMode=smart
org.java.plugin.boot.pluginsRepositories=./plugins/

サンプルコードの実行結果

plugins ディレクトリにデモアプリケーションの Plugin をいくつか登録して読み込ませてみた。

2006/05/16 23:58:37 org.java.plugin.registry.xml.ManifestParser 
情報: got SAX parser factory - com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl@16a55fa
2006/05/16 23:58:37 org.java.plugin.registry.xml.PluginRegistryImpl configure
情報: configured, stopOnError=false, isValidating=true
2006/05/16 23:58:37 org.java.plugin.standard.ShadingPathResolver configure
情報: configured, shadow folder is C:\Codelets\${applicationRoot}\temp\.jpf-shadow
2006/05/16 23:58:37 org.java.plugin.registry.xml.PluginRegistryImpl register
情報: plug-in and fragment descriptors registered - 2
{PluginDescriptor: uid=org.jpf.demo.toolbox.pluginbrowser@0.0.4}
{PluginDescriptor: uid=org.jpf.demo.toolbox.core@0.0.4}
    {ExtensionPoint: uid=org.jpf.demo.toolbox.core@Tool}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |