Axisのjarファイルは、xml-axis/java/build/libディレクトリにビルドされます。以下は、私がコード開発する際に使用するCLASSPATH例です:
プロキシサーバ経由でインターネットに接続している場合は、環境変数を設定する必要があり、それによりAxisのテストは同じことを行います。例えば、ANT_OPTSを以下のように設定します:D:\\xerces\\xerces-1_4_2\\xerces.jar
G:\\junit3.7\\junit.jar
G:\\xml-axis\\java\\build\\lib\\commons-discovery.jar
G:\\xml-axis\\java\\build\\lib\\commons-logging.jar
G:\\xml-axis\\java\\build\\lib\\wsdl4j.jar
G:\\xml-axis\\java\\build\\lib\\axis.jar
G:\\xml-axis\\java\\build\\lib\\log4j-1.2.4.jar
G:\\xml-axis\\java\\build\\classes
-Dhttp.proxyHost=proxy.somewhere.com -Dhttp.proxyPort=80 -Dhttp.nonProxyHosts="localhost"
org.apache.axis.components.logger.LogFactory
は、ロガーのコンポーネント/サービスに対するファクトリ、もしくは、発見メカニズムです。
org.apache.axis.components.image
パッケージは、AXISで使用される異なる画像ツールにおけるファクトリとサポートするクラスの両方を説明しています。これは、外部ツール使用するプラグイン可能なコンポーネントの表現で、AXISの最小要件を満たすために制限されたインタフェースのみを提供するために、'薄い'ラッパをAXISに隠して分離します。これは、将来のデザイナや実装者に、これらのツールにおけるAXIS固有の要件の明示的な理解を得ることを許します。
JavaクラスからJCL SPIを使うためには、以下のimport文を使います:
import org.apache.commons.logging.Log;
import org.apache.axis.components.logger.LogFactory;
log
属性を以下のように宣言し、初期化します:
public class CLASS
{
private static Log log = LogFactory.getLog(CLASS.class);
...
メッセージは、priorityに対応するメソッドを呼び出すことにより、log
のようなloggerにログ出力されます。Log
インタフェースは、logへログ/トレースメッセージを出力するための以下のメソッドを定義しています:
log.fatal(Object message);
log.fatal(Object message, Throwable t);
log.error(Object message);
log.error(Object message, Throwable t);
log.warn(Object message);
log.warn(Object message, Throwable t);
log.info(Object message);
log.info(Object message, Throwable t);
log.debug(Object message);
log.debug(Object message, Throwable t);
log.trace(Object message);
log.trace(Object message, Throwable t);
ロギングメソッドに加えて、以下のものが提供されています。
log.isFatalEnabled();
log.isErrorEnabled();
log.isWarnEnabled();
log.isInfoEnabled();
log.isDebugEnabled();
log.isTraceEnabled();
JCLの振る舞いの設定は、使用するロギングツールキットに完全に依存します。JCL SPI(と、AXIS)は、Log4Jが(CLASSPATH内で)有効であれば、デフォルトでそれを使用します。
システムプロパティやプロパティファイルを使用してLog4Jを設定します:
Log4Jの設定ファイルの名前を指定するために、このシステムプロパティを使用します。指定されない場合は、log4j.propertiesがデフォルトの設定ファイルとなります。log4j.propertiesファイルは、axis.jar
で提供されています。
このプロパティファイルは、同名のファイルを置くことによって、CLASSPATHでaxis.jar
の前に来るようにすることで上書きすることができます。しかし、正確な振る舞いは、その時に使用しているクラスローダに依存するので、この方法は、お勧めではありません。
プロパティファイルを上書きする安全な方法は、axis.jar内のプロパティファイルを置き換えることです。しかし、特に不必要なログ項目を除去するデバッグセッション中にプロパティを微調整したい場合などでは、この方法は非常に不便です。もっと便利な方法は、プロパティファイルの指定に絶対ファイルパスを使用することです。この方法では、Webアプリケーションやクラスローダのプロパティファイルであっても無視します。そのため、例えばLinuxでは、システムプロパティを指定しまう:
log4j.configuration=file:/home/fred/log4j.props
LogFactory.getLog(logger.name)
のパラメータに対応し、ロガーのインスタンスを生成するために使用されます。優先度は、DEBUG
、INFO
、WARN
、ERROR
、FATAL
のいずれかです。
Log4Jは、階層的な名前を理解し、パッケージや高レベルの修飾子による制御を可能にします。log4j.logger.org.apache.axis.encoding=DEBUG
は、org.apache.axis.encoding
とorg.apache.axis.encoding.ser
の両方にある全てのクラスで、デバッグメッセージを有効にします。同様に、log4j.logger.org.apache.axis=DEBUG
の設定は、全てのAXISのクラスに対してデバッグメッセージを有効にしますが、他のJakartaプロジェクトのものについてはそれを行いません。
設定の組み合わせにより、興味のあるログイベントのみを表示し、その他を非表示にすることができます。例えば、以下の組み合わせでは、
log4j.logger.org.apache.axis=DEBUG log4j.logger.org.apache.axis.encoding=INFO log4j.logger.org.apache.axis.utils=INFO log4j.logger.org.apache.axis.message=INFO1回の要求で生成されるログ項目数を管理可能な数へ減らします。
例えば:INFO(とそれよりも重要な)レベルだけをコンソールに出力しながら、DEBUG(とそれよりも重要な)レベルの情報をログファイルに出力することが可能です。
System.getProperty()
の呼び出しを避け、代わりにAxisProperties.getProperty
を呼び出します。AxisProperties.getProperty
は、System.getProperty
を呼び出し、設定情報のその他のソースを(最終的に)照会します。
この中心点アクセスの使用により、1つのJVMで複数のAXISエンジンを良好にサポートするように、グローバルな設定システムを再設計することができます。
これらのガイドラインは、基本的にプログラミング言語に依存しません。これらは経験を元にしていますが、長年に渡って無垢な人(?)に目を向けさせるために、適切なクレジットはScott MeyersによるMore Effective C++にしておいて下さい。
最後に、これらはガイドラインです。これらのガイドラインに対する例外があった際は常に、(これらのガイドラインどおり)質問される全ての事項がコード内にコメント形式で書かれています。
このルールに対するいくつかの推論があります。
AxisServlet
と同等のものです。
内部的に解決可能な特定の例外をキャッチした後、最も外側のコードは、全ての内部的に生成された例外がキャッチされ操作されることを保証しなければなりません。一般的にできるとすればその程度で、少なくともコードは、例外をログ出力すべきです。ロギングについてさらに言えば、AXISサーバは、AxisFaults内に全てのこのような例外をラップし、クライアントコードへそれを返します。
これは、主要ルールに反すると思われるかもしれませんが、実際には、AXISがこの型の例外で何をすれば良いのか分からないと言えます:潔く終了するくらいです。
疑わしい場合は、例外をログ出力します。
疑わしい場合は、例外と例外の完全な文脈を特定するのみ役立つ関連するローカル情報をログ出力します。
例外が解決できなかったり、不当なエラーとして知られている場合、エラー(log.error()
)として例外をログ出力し、その他の場合は、情報レベル(log.info()
)としてログ出力します。
e
がキャッチされ、新しい例外w
にラップされた場合、w
を投げる前に例外e
をログ出力します。
例外が解決できなかったり、不当なエラーとして知られている場合、エラー(log.error()
)として例外をログ出力し、その他の場合は、情報レベル(log.info()
)としてログ出力します。
e
がキャッチされ、解決された場合、例外のロギングは、コード記述者とレビュー者に委ねられます。任意のコメントがログ出力されると、例外もログ出力されます。
多くの場合では、例外を無視することが適切かもしれないことに注意して下さい。
業務ロジックで発生した例外(これには、サーバとAXISハンドラを含みます)は、クライアントコードへ伝達されなければなりません。
handlers
、providers
、および、その他のユーザが制御可能な接続位置は、catch(Exception ...)
によって保護されていなければなりません。ユーザコードによって生成され、システムコードによってキャッチされた例外は、以下を行うべきです:
cd xml-axis/javaテストの実行:
ant compile
cd xml-axis/java注意:これらのテストはサーバのポート番号8080で開始します。(Tomcatなどの)Webアプリケーションサーバがこのポートを使用していることによってテストがクラッシュする場合、このポート番号を変更するか、テストを実行している間はWebアプリケーションサーバを停止して下さい。
ant functional-tests
新しいコードを挿入する前に、ant functional-testsとant all-testsを実行して下さい。
sample00=My name is {0}, and my title is {1}.
Messages.getMessage("sample00", "Rich Scheuerle",
"Software Developer");
if ( operationName == null )
throw new AxisFault( "No operation name specified" );
項目をorg/apache/axis/i18n/resource.propertiesに追加します:
noOperation=No operation name specified.
読み込むためにコードを変更します:
if ( operationName == null )
throw new AxisFault(Messages.getMessage("noOperation"));
java.util.ResourceBundle
を使用し、変数を使用して文字列を形式化するためにjava.text.MessageFormat
を使用します。AXISは、ResourceBundleクラスとMessageFormatクラスの両方を管理するために、1つのorg.apache.axis.i18n.Messages
クラスを提供しています。Messagesクラスのメソッドは、以下になります:
public static java.util.ResourceBundle getResourceBundle();
public static String getMessage(String key) throws java.util.MissingResourceException;
public static String getMessage(String key, String var) throws java.util.MissingResourceException;
public static String getMessage(String key, String var1, String var2) throws java.util.MissingResourceException;
public static String getMessage(String key, String[] vars) throws java.util.MissingResourceException;
AXISプログラマは、Messages.getResourceBundle()
を呼び出すことによってリソースバンドルを直接操作することができますが、2つの理由からgetMessage()
メソッドを代わりに使用します:
Messages.getResourceBundle().getString("myMsg00");
Messages.getMessage("myMsg00");
getMessage
メソッドは、メッセージに変数を埋め込むことができるだめ。myMsg00=This is a string.
Messages.getMessage("myMsg00");
変数があるメッセージの場合、"{X}"シンタックスを使用します。ここで、X
は、0から始まる変数の番号です。例えば:
Messages.getMessage("myMsg00","name", "Russell");
Messages.getMessage("myMsg00", new String[] {"name", "Russell"});
String配列のgetMessageを呼ぶこともできます:
Messages.getMessage("myMsg00", new String[] {"name", "Russell"});
String配列版のgetMessageは全てに適用できますが、ほとんどのメッセージの変数は0、1、もしくは、2つなので、その他のgetMessageメソッドは、String配列版の複雑さを避けるための利便性として提供されています。
リソースが見つからない場合、getMessageメソッドは、MissingResourceExceptionを投げることに注意して下さい。そして、引数の数よりも{X}項目が多い場合、ParseExceptionが投げられます。これらの例外は、RuntimeExceptionなので、呼び出し元は明示的にキャッチすべきではありません。
リソースバンドルのプロパティファイルは、org/apache/axis/i18n/resource.propertiesです。
テストとサンプル構造も参照して下さい。
編集者注意:我々は、テスト追加の能率化や簡素化のために、もっと努力が必要です。また、テストの増加に従い、テストを分類することを考えなければなりません。Axisを変更した場合、その変更を使用するテストを追加して下さい。それはなぜでしょう?
いくつかの一般的な原則:
テストをビルドする1つの方法は、既存のテストをカットアンドペーストして、あなたの要求に合うようにテストを変更することです。このアプローチはテスト種類の増加に従い、複雑さを増します。
参照するための"非WSDL"の良好なテストは、test/saajです。
WSDLテストの生成 私が、シーケンステストを生成した際の工程を示します。WSDLファイルからコードを生成し、妥当性テストのシーケンスを実行します。java org.apache.axis.wsdl.Wsdl2java -t -s
SequenceTest.wsdl
<!--
Sequence Test -->
<wsdl2java url="${axis.home}/test/wsdl/sequence/SequenceTest.wsdl"
output="${axis.home}/build/work"
deployscope="session"
skeleton="yes"
messagecontext="no"
noimports="no"
verbose="no"
testcase="no">
<mapping namespace="urn:SequenceTest2" package="test.wsdl.sequence"/>
</wsdl2java>
新しいbuild.xmlファイル内のrunターゲットが可能です。execute-Componentターゲットと(直ぐに導入するなら)execute-Simple-Testターゲットから選択する必要があります。execute-Componentは、テストを実行する前にTCPサーバとHTTPサーバをセットアップし、必要となるサービスや配備を同様に操作します。execute-Simple-testは、単純に生のテストクラスファイルを呼び出します。
Axis 1.0 RC1以降で、"コンポーネント化された"テスト構造へと移行されました。1つの高次レベルの大きな再帰的関数を持つ代わりに、test/**配下やsamples/**配下の末端レベルに小さくて単純な"コンポーネント"build.xmlファイルがあります。
これらの"コンポーネント"ファイルは、共通のレイアウトを持ちます。主なターゲットには、以下があります:
"サンプル"テストのXMLファイルは、test/templateTestにあります。
規約を正規表現として表現できる場合、java/test/utils/TestSrcContent.javaを更新することでビルド時にチェックを強制することができます。
必要なことの全ては、パターンにスタティックなFileNameContentPattern配列を追加することです。各パターンには、3つのパラメータがあります:
正規表現記法の分かりやすい要約は、Jakarta OROのjavadocで提供されています。
tcpmon
の使用
functional-tests
(あるいは、all-tests
)を実行している間に、メッセージをモニタする簡単な方法を示します。
tcpmonがポート8080をリッスンするようにして開始し、異なるポートへフォワードします。
java org.apache.axis.utils.tcpmon 8080 localhost 8011あなたのテストを実行しますが、SimpleAxisServerにはフォワードされているポートを使用し、functional-testsで失敗が起きても継続するように指示して下さい。
ant functional-tests -Dtest.functional.SimpleAxisPort=8011 -Dtest.functional.fail=no全てのテストのSOAPメッセージが、tcpmonのウィンドウに現れるでしょう。
tcpmon
は、AXISユーザガイドに詳しく説明されています。
SOAPモニタ
の使用
(Tomcatなど)Webアプリケーションサーバを使用するWebアプリケーションとして実行しているコードをデバッグする際、SOAPの要求メッセージと応答メッセージを見るためのSOAPモニタユーティリティも使用することができます。
WebブラウザのウィンドウでSOAPモニタアプレットをロードすることによってSOAPモニタユーティリティが開始されます:
http://localhost:<port>/axis/SOAPMonitorテストを実行すると、SOAPメッセージがSOAPモニタウィンドウに表示されます。
SOAPモニタ
の詳細は、AXISユーザガイドで説明されています。
java org.apache.axis.transport.http.SimpleAxisServer -p 8080別ウィンドウで、まず、あなたがテストするサービスを配備します:
java org.apache.axis.client.AdminClient deploy.wsddそして、あなたのテストをJUnitのユーザインタフェースを指定して起動します。例えば、マルチスレッドテストケースの実行は:
java junit.swingui.TestRunner -noloading test.wsdl.multithread.MultithreadTestCase
log4j.properties
ファイルは、適度なデフォルト設定でaxis.jar
にパッケージ化されています。次の項目は、これらの設定を変更することを仮定しています。複数のオプションが開発者に公開されており、それらのほとんどはaxis.jar
からlog4j.properties
を抽出して、適切に変更します。
java
プログラムをビルドして実行する場合、JVMのオプションを含めます。-Dlog4j.configuration=yourConfigFile
CLASSPATH
の中で、あなたが使うバージョンのlog4j.properties
が、axis.jar
よりも前に来るように設定します。
ant
を使用してあなたのプログラムをビルドして実行する場合(これはAXISのビルドとそのテストの実行を含みます)、環境変数ANT_OPTS
に-Dlog4j.configuration=yourConfigFile
を設定します。
src/log4j.properties
を直接変更できます。あなたの変更をコミットしないで下さい。
log4j.rootCategory
の優先度をDEBUG
に設定します。
DEBUG
に設定します(AXISのlog4j.properties
ファイルは、2つのappenderを定義しています。CONSOLE
とLOGFILE
です)。
log4j.rootCategory
の優先度をINFO
以上に設定します。
log4j.logger.logger.name
のDEBUG
にセットします。
DEBUG
にセットします(AXISのlog4j.properties
ファイルは、2つのappenderを定義しています。CONSOLE
とLOGFILE
です)。
grep
などのツールで、それらをログメッセージの中から検索して下さい。
System.out.println
やSystem.err.println
で出力を書き出すことは避けられるべきです。
開発者は、システムをデバッグしたり解析している際に、System.out.println
を使用したい思うかもしれません。もしその方法を選んだら、util/TestSrcContent
テストを無効にする必要があります。このテストは、System.out.println
とSystem.err.println
の回避を強制します。あなたがコードをチェックインして戻す前にそれらの文を削除する必要があることになります。
一方で、我々はあなたに、少し時間を取ってデバッグ文を使うことを強く勧めます:log.debug("reasonably terse and meaningful message")
。もし、デバッグメッセージが問題を理解するために有用であれば、将来もあなたや仲間によって有用となるでしょう。
このキットは、zipファイルを指定ディレクトリに解凍することで利用できます。インストール方法は、docsディレクトリにあるJAX-RPCリリースノート文書に書かれています。Webブラウザでdocsディレクトリ内のindex.htmlファイルを開けば、このキットで供給されている全ての文書の一覧を見ることができます。
このキットには、互換性テストを実行するために使用するJavaTestテストハーネスが含まれていることに注意して下さい。
このテストを実行するための詳細な情報が必要であれば、ここに追加して下さい。
本文書は、日本Apache XMLプロジェクト(佐藤 誠/石神 覚司)により翻訳されました。
翻訳に対するコメントは、jaxmldev@xml.gr.jpに送って下さい。