プラグむン䜜成

プラグむン䜜成

Requires Platform 4.2+

Plug-ins

Nexaweb Client プラグむンアヌキテクチャは、開発者が独自のタグや属性、XML シンタックスを実装できるよう蚭蚈されおおり、これによっおNexaweb Java アプリケヌション甚Nexaweb Client の機胜を拡匵できたす。通垞、開発者は新しいUI コンポヌネントを通じお機胜を拡匵したすが、論理挔算やレむアりトペむンなどのカスタムロゞックを実装するこずも可胜です。

Nexaweb Client での䞀般的な䜿甚䟋の1 ぀ずしお、高床なチャヌト機胜の䜿甚が挙げられたす。Nexaweb Client には組み蟌みのチャヌト機胜が付属しおいたすが、この機胜は財務アプリケヌションに芋られるような高床なチャヌトの衚瀺には䞍十分な堎合がありたす。プラ グむンアヌキテクチャを䜿甚するず、開発者はサヌドパヌティのチャヌトコンポヌネントを統合しお独自のXML タグを定矩し、フォヌマット蚭定しおそのチャヌトを衚瀺するこずができたす。その埌このチャヌトを暙準のXAL の内郚に組み蟌むこずができたす。

䟋:

<window>
    <borderPane/>
    <label text="A custom chart" borderPosition="north" />   
    <!-- a specialized chart created via the plug-in architecture -->
    <financialChart title="Dow Jones by year" borderPosition="center" onSelect="myPage.jsp>
    <xAxis start="1950" end="2005"/>
    <yAxis start="0" y="5000"/>
    <pointData points="1900,2000,2020 ... "/>
    </financialChart>
</window>

技術的な抂芁

最も基本的なレベルでは、プラグむンはcom.nexaweb.client.tags.AbstractTagImpl を拡匵するクラスであり、XML 芁玠に察する倉曎をリスンしたす。このような倉曎は、

com.nexaweb.xml.events.StructureChangeEventおよび
com.nexaweb.xml.events.AttributeChangeEventの圢匏で行われたす。これらのクラスは、各タグ名にそれぞれが凊理するクラスが含たれるため、タグハンドラず呌ばれたす。たた、これらのクラスは、XML ず実装クラス(ピア) 間のブリッゞを圢成するため、ブリッゞクラスずも呌ばれたす。

AbstractTagImpl は、すべおのプラグむンの基本クラスです。たた、プラグむンをタむプ別に簡単に䜜成できるように、倚数のサブクラスが存圚したす。たずえば、ContainerBridge たたはSwingBridge をサブクラスずしお䜿甚すれば、

java.awt.Component たたはjavax.swing.JComponent に基づいたUI コンポヌネントを䜜成できたす。さらに、JComponent を䜿甚しお、独自のjava.awt.LayoutManager クラスを実装するこずもできたす。

䞊蚘の䟋では、開発者は、ピアずしお機胜するサヌドパヌティ補チャヌトコンポヌネントをいく぀か䜿っおいたす。AbstractTagImpl を拡匵するハンドラクラスは、ピアクラスでの倉曎に応答するだけでなく、XML での倉曎に基づいおこれらのピアを操䜜したす。
AbstractTagImpl ずこのサブクラスは、StructureChangeEvents ずAttributeChangeEvents、関連するXML 芁玠を自動的にリスンしたす。属性が倉曎されたり、子タグの远加や削陀が行われた際には、各サブクラスが適切な操䜜を実行したす。同様にサブクラスは、ピ アオブゞェクトぞの倉曎をリスンしおむベントを発生させたり、倉曎に基づいおUI DOM (Document Object Model) を曎新するこずができたす。ブリッゞクラスは、双方向のブリッゞです。䞀方ではXML の倉曎をリスンしおピアに枡し、他方ではピアの倉曎をリスンしおむベントを発生させたり、倉曎に基づいおDOM を曎新したす。

このプラグむンを目的のJVM で実行するには、泚意が必芁です。Swing に基づいお䜜成されたUI コンポヌネントプラグむンは、Swing ず互換性のある(1.2+) JVM でしか実行できたせん。

JButton プラグむンの開発

ここでは、JButton コンポヌネントに<jButton> タグをマップする簡単なプラグむンを開発したす。<jButton> タグは、backGroundColor などの基本的な属性を認識したす。たた、<jButton> タグは"armed" ずいう名前のブヌル型の属性を実装し、有効化された際にonCommand むベントを発生させたす。
<jButton> タグの開発での最初の手順では、<jButton> タグにマップするタグハンドラを䜜成したす。JButton はSwing に基づいたコンポヌネントなので、クラスはSwingBridge を拡匵したす。パヌサヌは、初めお<jButton> タグを怜出した際に、このJButtonBridge のむンスタンスをむンスタンス化し、これに察する初期化メ゜ッドを呌び出したす。これらのメ゜ッドの1 ぀であるinit() が、順にcreateUiComponent() を呌び出したす。目的のUI コンポヌネントを䜜成するには、次のようにこのメ゜ッドをオヌバヌラむドする必芁がありたす。

public class JButtonBridge extends SwingBridge {
        public void createUiComponent(){
        setUiComponent(new JButton() );
    }
}

この時点で、ブリッゞクラスがJButton コンポヌネントを䜜成し、bgColor などの基本的な属性に自動的に応答したす。たた、このタグを"armed" 属性に応答させる必芁がありたす。これには、onAttributeSet() をオヌバヌラむドしお、新しい属性を凊理させたす。

public void attributeSet(AttributeChangeEvent e) throws AttributeConversionException {
    String attributeName = e.getName();
    String attributeValue = e.getNewValue();
    //if the attribute is "armed" set it to true or false
    if ("armed".equals(attributeName) ){
        ( (JButton)getUiComponent() ).getModel().setArmed(AttributeConverter.toBoolean(attributeValue));
    }
    //otherwise just fall through
    else super.attributeSet(e);
}

AttributeConverter は、文字列をブヌル型、Color、列挙型などのデヌタタむプに倉換するメ゜ッドを提䟛するナヌティリティクラスです。attributeSet をオヌバヌラむドしおAttributeConverter を䜿甚するず、XML の゚ラヌが通垞の方法で報告されたす。

<jButton> が属性の倉曎に応答できるようになったので、次は、JButton ActionListener が呌び出された際に<jButton> が"onCommand" むベントを報告するようにしたす。これには、ActionListener を実装しお、自身をJButton のリスナずしお远加したす。こうしおおけば、actionPerformed() が呌び出された際に、むベントの発生を凊理するAbstractTagImpl からメ゜ッドを呌び出すだけで枈みたす。JButtonBridge の最終的なコヌドは次のずおりです。最新の倉曎が匷調衚瀺されおいたす。

public class JButtonBridge extends SwingBridge implements ActionListener{
    public void createUiComponent(){
        JButton b = new JButton();
        setUiComponent(b);
        //listen for action events so we can report them
        b.addActionListener(this); 
    }
     
    public void actionPerformed(ActionEvent e){
        //call the method from AbstractTagImpl that reports the event
        //fill in a ClientEvent object and calls the appropriate MCO/JSP/event handler
        fireEvent("onCommand",null);
    }
     
public void attributeSet(AttributeChangeEvent e) throws AttributeConversionException{
        String attributeName = e.getName();
        String attributeValue = e.getNewValue();
        //if the attribute is "armed" set it to true or false
        if ("armed".equals(attributeName) ){
            ( (JButton)getUiComponent() ).getModel().setArmed(AttributeConverter.toBoolean(attributeValue) );
        }
        //otherwise just fall through
        else super.attributeSet(e);
    }
}

JButtonBridge が完了したので、次はJButtonBridge クラスによっお<jButton> タグが定矩、凊理されるよう、マッピングを远加する必芁がありたす。これには、適切な゚ントリでタグマッピングファむルを䜜成する必芁がありたす。その 埌、このファむルをクラむアントコンフィギュレヌション内のタグマッピングファむルのリストに远加したす。タグマッピングファむル自䜓は、ハンドラクラス の名前がテキストずしお蚘茉された、単なるタグ名のリストです。このファむルをcustomTagMappings.xml ず呌びたす。

<tag-mappings>
    <jButton>JButtonBridge</jButton>
</tag-mappings>

このファむルが䜜成されたら、nexaweb-client.xml に゚ントリヌを远加しなくおはなりたせん。

<client-tag-mapping>
<tag-map-file>customTagMappings.xml</tag-map-file>
</client-tag-mapping>

Plug-in Architecture Class Survey

次の衚は、plug-in関連クラスをリスト化し抂芁を説明しおいたす。
 

Class説明

AbstractTagImpl
党おのplug-inのベヌスクラス
ContainerBridgeUI component plug-inのベヌスクラス。このクラスは党おのjava.awt.Componentsに適甚する共通属性に察応しおいる。

SwingBridge
Swing-based plug-ins のためのContainerBridge のサブクラス
LayoutBridgeカスタムLayoutManager tagを䜜成するためのAbstractTagImplのサブクラス
AttributeConverterデヌタtypeに属性倀を倉換し、゚ラヌを統䞀し報告するナヌティリティクラス

Plug-in Class Lifecycle

新しいXALブロックが既存のUI DOMに加えられるずき :

1. ルヌト゚レメントに関連したクラス名が怜玢される 
2. クラスがロヌドされおいなければ、ロヌドされる。
3. handler クラスの新しいむンスタンスが䜜成される。
4. 珟圚の ClientSession で setSession() がハンドラから呌び出される。
5. HandlerはStructureChangeListener ずAttributeChangeListener ずしお XAL elementに远加される。
6. setElement() はXAL element で handler に呌び出される。
7. init() はhandler に呌び出される。
8. "onCreate" むベントはハンドラにより呌び出される。

このプロセスは党おのXAL ブロックで䞀回のみ行われたす。そのブロックのroot elementは、それに蚭定された子および/たたは最初の属性を持っおいる可胜性がありたす。AbstractTagImplは、これらの状況に察凊す るため、init() に呌び出されるこずができる2぀のメ゜ッドを提䟛しおいたす。"parseInitialChildren()" メ゜ッドはこのパヌシングプロセスを初期elementの党おの子に反埩し行いたす。"parseInitialAttributes()" メ゜ッドは、element䜜成埌に蚭定されたかのように、onAttributeSet()で初期elementの属性をフィヌドしたす。加え、 ContainerBridgeは、その init() メ゜ッドでデフォルトによりこれらのメ゜ッドを呌び出したす。

XAL blockがUI DOMから陀倖された堎合 :

  1. unload() は root element に察し、handler に呌び出される。
  2. handler は StructureChangeListener ずAttributeChangeListener ずしお XAL element から陀倖される。
  3. handler は陀倖された root Element の各子゚レメントのプロセスを再垰的に反埩する afterChildRemoved() を呌び出したす。

onChildRemoved()に優先するhandler classが存圚する堎合、再垰的曎新が発生するようにafterChildRemoved()を呌び出さなくおはなりたせん。

Packaging Plug-Ins

プラグむンはタグマッピングファむル、タグハンドラクラス、ピアクラスの3぀のリ゜ヌスで構成されおいたす。我々の䟋では、JButton ピアクラスは党おの Swing の互換性のある JVM に含たれたすが、時によりピアクラスが別の JAR ファむルに含たれたす。

Tag-handling class ずピアクラスは MCO ず同じ展開ルヌルに埓っおいたすが、タグマッピングファむルは、暙準ファむルずしお芋なされたす。䞀郚の開発者は、タグマッピングファむルずクラスを組み 合わせ、JAR ファむルに入れるのが簡単だずいうこずがわかるかもしれたせん。䟋えば、JButtonBridge クラスずcustomTagMappings.xml は "jButtonPlugin.jar." ず呌ばれるものの䞭に JAR ファむル化されおいたす。その堎合、nexweb-client.xml classpath を倉曎しその jar を含み、タグマッピングロケヌションを倉曎し"classpath://" specifier. を䜿甚したす。nexaweb-client.xml のドキュメントの client classpath 調敎に぀いおの詳现をご芧ください。

<!-- classpath changed to include our plug-in jar file -->
<client-classpath>
    <pre-loaded-in-applet-def>
    <archive name="jButtonPlugin.jar"
       path="/WEB-INF/client/lib/jButtonPlugin.jar"/>
    </pre-loaded-in-applet-def>
</client-classpath>
 
<!-- load the tag mapping file from the classpath -->
<client-tag-mapping>
    <tag-map-file>classpath://customTagMappings.xml</tag-map-file>
</client-tag-mapping>

最埌䞀぀のパッケヌゞオプションは、スタヌトアップで、そのプラグむンにあったタグが初めお遭遇した時に、plug-in class をロヌドさせるこずです。スタヌトアップでロヌドされたクラスは Nexaweb のロヌディングアニメヌションの最䞭にロヌドされたすが、䞀方で、オンザフラむでロヌドされた倧芏暡 plug-in だず Nexaweb のアプリケヌションが数秒フリヌズしおしたいたす。アプリケヌションが、倧芏暡 plug-in をコンスタントに、たた頻繁に䜿甚される堎合、スタヌトアップの際ロヌドする方が良いです。これは、以䞋のように tag-mapping を修正するこずで可胜です。

<tag-mappings>
    <jButton loadPolicy="onStartup">JButtonBridge</jButton>
</tag-mappings>

Plugin Namespaceの定矩

Namespaces は、タグ䞀匏で定矩するこずができたす。以䞋の䟋は、Nexaweb Data Frameworkで、これはプラグむン アヌキテクチャを䜿甚し実装されたす。このプラグむンを定矩するXMLは以䞋です。

<tag-mappings namespace="http://openxal.org/core/data"
    document="bindings">
    <mapping class="com.nexaweb.plugin.data.bridge.BindingBridge"
        name="binding"/>
</tag-mappings>

ここではopenxal.org/core/data namespace のタグ "binding" を宣蚀しおいたす。

組蟌みコンポヌネントより優先される

プラグむンは組蟌み XAL タグの振る舞いを眮換えるために䜿甚するこずができたす。䟋えば、プラグむンが <button> ずしお定矩されるず、button の本来の振る舞いを眮換えたす。 

Packaging and Distributing Nexaweb Application Plug-ins

Platform 4.2 以䞊が必芁

Nexaweb アプリケヌション甚プラグむンのパッケヌゞ化ず配垃

Nexaweb 4.2.x で Nexaweb アプリケヌションに䜿甚するプラグむンをパッケヌゞ化しお配垃するには、次の䜜業を行う必芁がありたす。
  • プラグむンのマニフェスト ファむルでプラグむンに関する情報を指定する
  • プラグむンの JAR ファむルをアプリケヌションの WEB-INF/client/plugins ディレクトリに配眮する

プラグむンのマニフェストファむルぞのプラグむン情報の远加

アプリケヌションに䜜成する各プラグむンに関する情報を、プラグむンのマニフェストファむル、plugin.xmlに远加する必芁がありたす。Nexaweb では、プラグむンのマニフェストを䜿甚しお、プラグむンのコンテンツを決定したす。

各プラグむンの plugin.xml ファむルに次のセクションを远加したす。
 
セクション
説明
<plugin>  </plugin>
このアプリケヌションにむンクルヌドする固有のプラグむンを特定したす。
開始タグには、ラむフサむクルマネヌゞャたたはプラグむンの抜象 MCO を指定する、オプションの class 属性をむンクルヌドできたす。
<info> </info>
プラグむン スキヌマずスタむルシヌトの堎所など、プラグむンに関する䞀般的な情報を指定したす。
<tag-mappings>  </tag-mappings>
プラグむンがアプリケヌションに远加するタグを定矩し、耇合タグの定矩ファむルの堎所ず、アプリケヌションがプラグむンをロヌドする際に䜿甚するポリシヌを指定したす。

次に、プラグむンのマニフェストファむルのサンプルを瀺したす。

 

<plugin class="MyPlugins">

 <info>
  <provider-name>Nexaweb Technologies</provider-name>
  <author>James</author>
  <description>This plug-in automates automatic automation.</description>
  <version>10.3.4</version>
  <schema-location>schema/plugin.xsd</schema-location>
  <stylesheet-location>stylesheet/stylesheet.xss</stylesheet-location>
 </info>

 <tag-mappings namespace="http://nexaweb.com/charts" document="nxml">
  <mapping name="barChart" class="com.nexaweb.plugins.BarChart" icon="barChart.gif" loadPolicy="onStartup"/>
  <mapping name="loginDialog" class="com.nexaweb.plugins.LoginDialog" icon="loginDialog.gif" definitionFile="ui/loginDialog.nxml"/>
 </tag-mappings>
</plugin>

 


次の衚では、<info> セクションに含たれるタグに぀いお説明したす。
 
info タグ
説明
<provider-name> </provider-name>
プラグむンの䜜成者に関する情報を指定したす。
<author> </author>
プラグむンの䜜成者に関する情報を指定したす。
<description> </description>
プラグむンの目的たたは䜿甚に関する情報を提䟛したす。
<version> </version>
プラグむンのバヌゞョン番号を指定したす。
<schema-location>
</schema-location>
このプラグむンのスキヌマ ファむルの堎所を特定したす。
<stylesheet-location>
</stylesheet-location>
このプラグむンのスタむルシヌトの堎所を特定したす。デフォルトの配垃先は、JAR ファむルが配眮されおいるディレクトリ内の /stylesheet です。

次の衚では、<tag-mapping> セクションに含たれるタグの属性に぀いお説明したす。
 
tag-mapping タグの属性
説明
namespace
これらのタグマッピングが属する名前空間を指定したす。
mapping name
アプリケヌションに远加されるプラグむンで䜿甚されるタグ名を指定したす。

マッピング名の属性
 
属性
説明
class
このタグが属するクラスを指定したす。このクラスは、lib たたは classes フォルダ内に存圚する堎合がありたす。
icon
このタグに関連付けられおいる任意のむメヌゞを指定したす。むメヌゞは、むメヌゞフォルダに察しお盞察的な䜍眮にありたす。
loadpolicy
この属性を䜿甚しお、Nexaweb の起動時にこのプラグむンを起動するこずを指定したす。この属性の有効な倀は onStartup のみです。この属性がタグマッピングに存圚しない堎合は、このタグが最初に怜出されたずきにプラグむンが起動したす。
definitionFile
耇合タグに含たれる耇数の関数を定矩するファむルの堎所を指定したす。

プラグむンディレクトリの構造


Nexaweb Studio では、ビルドおよび配垃に独自のディレクトリ構造を䜿甚しおプラグむンが構成されたす。

プラグむンのビルドには、次の衚に瀺すディレクトリ構造が䜿甚されたす。
 
ビルド甚ディレクトリ
含たれる内容
/source
Java ゜ヌスコヌド。
/dependencies
プラグむンず䞀緒にパッケヌゞ化されない䟝存関係で、実行時に存圚する必芁がありたす。
/dependencies/lib
JAR ファむル (䟋: jaxp.jar)。
/dependencies/plugins
このプラグむンが䟝存する他のプラグむン (䟋: data-interfaces-plugin.jar)。
/PluginContent
Web アプリケヌションの WebContent ずほが同じです。Nexaweb では、このディレクトリのコンテンツは plugin.jar 構造のルヌトに配眮されたす。
/build 
ビルドのステヌゞング領域で、ビルド プロセスが終了するず削陀される堎合がありたす。
/dist 
ビルドによっお生成されるプラグむン JAR。

プラグむンの配垃には、次の衚に瀺すディレクトリ構造が䜿甚されたす。
 
配垃甚ディレクトリ
含たれる内容
/lib 
プラグむンが䟝存する JAR ファむル(クラスはクラむアントにバむンドされおおり、公に提䟛可胜である必芁がありたす)。
/images
むメヌゞ。
/PLUGIN-INF/docs
プラグむンドキュメントの堎所。
/PLUGIN-INF/schema/plugin.xsd   
プラグむンのスキヌマ ファむル。
/stylesheet/stylesheet.xss
プラグむンのスタむルシヌト。
/plugin.xml   
プラグむンのマニフェスト ファむル。