External Custom Webject の作成
一意の Java パッケージ内で public クラスを記述することによって、Info*Engine の External Custom Webject を生成できます。クラス名は必ず一意である必要があり、標準の Java ネーミング規則に従います。
名前の各語をハイフンで区切ることによって、Info*Engine Webject の名前はクラス名から派生します。たとえば、クラス名が averageColumn の場合、Webject 名は Average-Column となります。
Webject 名では、大文字と小文字は区別されません。
クラス内の Custom Webject が以下の作業を行うように、クラスを記述する必要があります。
静的メソッドとして実装される。
com.infoengine.object.factory.Task オブジェクトを唯一の引数とする。
com.infoengine.object.factory.Task オブジェクトを返す。
エラー発生時に IEException を発生させる。
たとえば、Average-Column Custom Webject を実装するメソッドのひな型は以下のようになります。
import com.infoengine.object.factory.Task;
public static Task averageColumn ( Task task ) throws IEException {
:
:
Task response = new Task();
response.addVdb ( group_out );
return response;
:
:
}
複数の Custom Webject のコードを同じクラスに入れることができます。たとえば、複数の Custom Webject メソッドが使用する private メソッドがある場合は、private メソッドと Custom Webject メソッドをあるパッケージ内の 1 つのクラス内に入れることができます。
NumericColumnWebjects.java ファイルをコンパイルするときには、ieWeb.jar ファイルと servlet.jar ファイルをクラスパスに加える必要があります。コンパイルしたファイルを、JSP エンジンを介して Info*Engine で自動的に使用できるようにするには、Info*Engine がインストールされている WEB-INF/classes ディレクトリにこれらのファイルを置きます。このディレクトリが存在しない場合は、作成できます。
External Custom Webject の例
次の各セクションには以下の内容が含まれています。
NumericColumnWebjects クラスのソースコード
External Custom Webject を使用する JSP ページの例
ソースコードおよび JSP ページは、Info*Engine がインストールされている prog_examples/customwebjects ディレクトリ内にあります。
NumericColumnWebject クラス
以下のパッケージの例には NumericColumnWebjects クラスが含まれています。このクラスには以下のメソッドが含まれています。
getColumnElements - 列内の要素を取得するときに public メソッドによって使用される private メソッドです。
averageColumn - データの数値列内の要素を平均化します。
totalColumn - データの数値列内の要素を使用して合計を計算します。
package examples.customwebjects;
import com.infoengine.util.IEException;
import com.infoengine.exception.fatal.IEInternalServiceException;
import com.infoengine.procunit.webject.GroupWebjectException;
import com.infoengine.object.factory.*;
import java.util.Enumeration;
import java.util.Vector;
/**
* NumericColumnWebjects
*
* supplies implementation for two simple webjects:<br>
* <li><b>totalColumn</b> - return the numeric total of a column
* <li><b>averageColumn</b> - return the numeric average of a column
* The implementation is simple minded using a 'double' to calculate
* totals and averages.No formating of the results is performed.
* <br>
* Example:<br>
* <ie:webject name="Query-Objects" type="OBJ">
*<ie:param name="INSTANCE" data="jdbcAdapter"/>
*<ie:param name="CLASS" data="EMP"/>
*<ie:param name="WHERE" data="()"/>
*<ie:param name="GROUP_OUT" data="employees"/>
* </ie:webject>
*
* <ie:webject name="Total-Column" type="EXT" use="examples.custom
webjects.NumericColumnWebjects">
*<ie:param name="COLUMN" data="SAL"/>
*<ie:param name="GROUP_IN" data="employees"/>
*<ie:param name="GROUP_OUT" data="total_salary"/>
* </ie:webject>
*
* <ie:webject name="Average-Column" type="EXT" use="examples.custom
webjects.NumericColumnWebjects">
*<ie:param name="COLUMN" data="SAL"/>
*<ie:param name="GROUP_IN" data="employees"/>
*<ie:param name="GROUP_OUT" data="average_salary"/>
* </ie:webject>
**/
public class NumericColumnWebjects
{
/**
* return a list of column elements
*
* @return Vector
* @exception IEException if required values aren't found within
the webject
**/
private static Vector getColumnElements ( Task task ) throws IE
Exception {
Webject w = task.getWebject();
String grp_out = null;
String column = null;
String grp_in = null;
Group group_in = null;
// get the column name to retrieve
Param param = w.getParam ( "COLUMN" );
if ( param == null )
throw new GroupWebjectException ( "NumericColumnWebjects:
no COLUMN" );
column = param.getData();
// if GROUP_IN not supplied take the default group off the VDB
param = w.getParam ( "GROUP_IN" );
if ( param == null )
group_in = task.getGroupIn();
else
group_in = task.getVdb ( param.getData() );
if ( group_in == null )
throw new GroupWebjectException
( "NumericColumnWebjects: no GROUP_IN" );
// build the Vector of column contents
int element_count = group_in.getElementCount();
Vector elements = new Vector ();
for ( int i = 0; i < element_count; i++ ) {
Element e = group_in.getElementAt ( i );
Vector ev = e.getValues ( column, true );
if ( ev == null ) continue;
for ( int j = 0; j < ev.size (); ++j )
elements.addElement ( ev.elementAt ( j ) );
}
if ( !(elements.size() > 0) )
throw new GroupWebjectException
( "NumericColumnWebjects: no COLUMN \"" + column
\"" );
return elements;
}
/**
* given a input group, column name, and group out name
* generate the numeric average of the column's contents
* return the value in a group.
*
* @return Task - response
* @exception IEException - if required parameters are
missing or column
*is not numeric.
**/
public static Task averageColumn ( Task task ) throws IE
Exception {
try {
String grp_out = null;
String column = null;
Webject w = task.getWebject();
// get the name of the group to create
Param param = w.getParam ( "GROUP_OUT" );
if ( param == null )
throw new GroupWebjectException
( "NumericColumnWebjects: no GROUP_OUT" );
grp_out = param.getData();
// get the name of the column to average
param = w.getParam ( "COLUMN" );
if ( param == null )
throw new GroupWebjectException
( "NumericColumnWebjects: no COLUMN" );
column = param.getData();
Vector elements = getColumnElements ( task );
// total the values
Object val;
Double dval;
double average = 0;
for ( Enumeration en = elements.elements();
en.hasMoreElements (); ) {
val = en.nextElement();
dval = new Double ( val.toString() );
average += dval.doubleValue();
}
// calculate the average
average = average / elements.size();
Element elem = new Element ();
Att att = new Att ( column + " average" );
att.addValue ( "" + average );
elem.addAtt ( att );
Group group_out = new Group ( grp_out );
group_out.setElement ( elem );
Task response = new Task();
response.addVdb ( group_out );
return response;
} catch ( Exception exc ) {
exc.printStackTrace ( System.err );
if ( exc instanceof IEException )
throw (IEException)exc;
throw new IEInternalServiceException ( exc );
}
}
/**
* given a input group, column name, and group out name
* generate the numeric total of the column's contents
* return the value in a group.
*
* @return Task - response
* @exception IEException - if required parameters are
missing or column
*is not numeric.
**/
public static Task totalColumn ( Task task ) throws IE
Exception {
try {
String grp_out = null;
String column = null;
Webject w = task.getWebject();
// get the name of the group to create
Param param = w.getParam ( "GROUP_OUT" );
if ( param == null )
throw new GroupWebjectException
( "NumericColumnWebjects: no GROUP_OUT" );
grp_out = param.getData();
// get the name of the column to total
param = w.getParam ( "COLUMN" );
if ( param == null )
throw new GroupWebjectException
( "NumericColumnWebjects: no COLUMN" );
column = param.getData();
Vector elements = getColumnElements ( task );
// calculate the total
Object val;
Double dval;
double total = 0;
for ( Enumeration en = elements.elements();
en.hasMoreElements (); ) {
val = en.nextElement();
dval = new Double ( val.toString() );
total += dval.doubleValue();
}
// build GROUP_OUT and response
Element elem = new Element ();
Att att = new Att ( column + " total" );
att.addValue ( "" + total );
elem.addAtt ( att );
Group group_out = new Group ( grp_out );
group_out.setElement ( elem );
Task response = new Task();
response.addVdb ( group_out );
return response;
} catch ( Exception exc ) {
exc.printStackTrace ( System.err );
if ( exc instanceof IEException )
throw (IEException)exc;
throw new IEInternalServiceException ( exc );
}
}
}
Average-Column および Total-Column External Webject を使用して、averageColumn および totalColumn メソッドを実行できす。
Average-Column および Total-Column External Webject の例
以下の NumericColumnWebjects.jsp によって、Average-Column および Total-Column External Webject が使用する employees グループを作成する Query-Object Webject を実行します。
<%@page language="java" session="false" errorPage="IEError.jsp"%>
<%@ taglib uri="http://www.ptc.com/infoengine/taglib/core" prefix="ie" %>
<!-- Creates the employees group to be used by Average-Column and
Total-Column extended webjects -->
<ie:webject name="Query-Objects" type="obj">
<ie:param name="INSTANCE"data="jdbcAdapter"/>
<ie:param name="CLASS"data="EMP"/>
<ie:param name="WHERE"data="()"/>
<ie:param name="GROUP_OUT"data="employees"/>
</ie:webject>
<!-- This custom webject computes the total of the SAL column -->
<ie:webject name="Total-Column" type="EXT"
use="example.customwebjects.NumericColumnWebjects"/>
<ie:param name="COLUMN"data="SAL"/>
<ie:param name="GROUP_IN"data="employees"/>
<ie:param name="GROUP_OUT"data="total_salary"/>
</ie:webject>
<!-- This custom webject computes the average of the SAL column -->
<ie:webject name="Average-Column" type="EXT" use="examples.custom
webjects.NumericColumnWebjects">
<ie:param name="COLUMN"data="SAL"/>
<ie:param name="GROUP_IN"data="employees"/>
<ie:param name="GROUP_OUT"data="average_salary"/>
</ie:webject>
<ie:webject name="Display-Table" type="DSP">
<ie:param name="GROUP_IN"data="total_salary"/>
</ie:webject>
<ie:webject name="Display-Table" type="DSP">
<ie:param name="GROUP_IN" data="average_salary"/>
</ie:webject>
これは役に立ちましたか?