「インタプリタ実装のカスタマイズ」、「Java APIアクセスのカスタマイズ」で説明したように、Contextオブジェクトはスクリプトの実行の仕方をカスタマイズすることができます。Contextオブジェクトを生成したあとで、setImplementation()メソッドや、setConfiguration()メソッド等を一つずつ呼び出すことで、Contextオブジェクトを希望どおりにセットアップすることもできますが、手順が長くなり、また柔軟性に欠けるので、もう少し便利な方法が用意されています。
Pnuts APIが最初にロードされる時に、所定のシステムプロパティ が設定されていると、その一部はContextのセットアップに利用されます。たとえば、pnuts.lang.defaultPnutsImplプロパティには、デフォルトのPnutsImplオブジェクトのクラス名を指定できます。
% java -Dpnuts.lang.defaultPnutsImpl=pnuts.compiler.CompilerPnutsImpl メインクラス
Contextクラスがロードされる前にPnuts.setDefaults()メソッドでプロパティ(java.util.Properties)を指定すると、システムプロパティをオーバーライドする形でそれらのプロパティが使われます。
- public static void setDefaults( Properties properties );
import pnuts.lang.*;
import java.util.*;
import java.io.*;
public class Test {
public static void main(String[] args){
try {
Properties p = new Properties();
p.load(Test.class.getResourceAsStream("test.properites"));
Pnuts.setDefaults(p);
Context context = new Context();
...
} catch (IOException e){
...
}
}
}
この方法では、プログラムを変更することなく、プロパティファイルに設定を変更することで、Contextのセットアップの仕方を変更することができます。
注) Pnuts API(特にContextクラス)が一旦ロードされるとデフォルトの設定を変更することができません。
ContextクラスのコンストラクタContext(Context)は、与えられたContextの設定をそのまま受け継ぐContextオブジェクトを新たに作ります。
import pnuts.lang.*;
public class Test {
static Context defaultContext;
static {
defaultContext = new Context();
defaultContext.usePackage("hibernate");
}
public Object execute(String script){
Context context = new Context(defaultContext);
try {
return Pnuts.load(script, context);
} catch (Exception e){
e.printStackTrace();
}
}
}