28.10. カスタムリソースのデプロイ
起動時に、Seam はリソースに対し
/seam.properties、 /META-INF/components.xml、 または /META-INF/seam.properties を含んでいるすべての JAR をスキャンします。 たとえば、 @Name アノテーションが付与されたクラスはすべて起動時に Seam コンポーネントとして登録されます。
Seam を使ってカスタムのリソースを処理することもできます。 つまり、 Seam は特定のアノテーションを処理できるということです。まず、次のように
/META-INF/seam-deployment.properties ファイルで処理するアノテーションタイプの一覧を与えます。
# A colon-separated list of annotation types to handle
org.jboss.seam.deployment.annotationTypes=com.acme.Foo:com.acme.Bar
次に、 アプリケーション起動時に
@Foo アノテーションが付くすべてのクラスを収集します。
@Name("fooStartup")
@Scope(APPLICATION)
@Startup
public class FooStartup {
@In("#{deploymentStrategy.annotatedClasses['com.acme.Foo']}")
private Set<Class<Object>> fooClasses;
@In("#{hotDeploymentStrategy.annotatedClasses['com.acme.Foo']}")
private Set<Class<Object>> hotFooClasses;
@Create
public void create() {
for (Class clazz: fooClasses) {
handleClass(clazz);
}
for (Class clazz: hotFooClasses) {
handleClass(clazz);
}
}
public void handleClass(Class clazz) {
// ...
}
}
また、 あらゆるリソースを処理するよう Seam を設定することもできます。 たとえば、
.foo.xml 拡張子が付くファイルを処理したい場合はカスタムのデプロイメントハンドラを記述することができます。
public class FooDeploymentHandler implements DeploymentHandler {
private static DeploymentMetadata FOO_METADATA = new DeploymentMetadata() {
public String getFileNameSuffix() {
return ".foo.xml";
}
};
public String getName() {
return "fooDeploymentHandler";
}
public DeploymentMetadata getMetadata() {
return FOO_METADATA;
}
}
これによりサフィックス
.foo.xml が付くすべてのファイルの一覧が提供されます。
次に、
/META-INF/seam-deployment.properties でデプロイメントハンドラを Seam に登録します。
# For standard deployment
# org.jboss.seam.deployment.deploymentHandlers=
# com.acme.FooDeploymentHandler
# For hot deployment
# org.jboss.seam.deployment.hotDeploymentHandlers=
# com.acme.FooDeploymentHandler
コンマで区切った一覧を使うと複数のデプロイメントハンドラを登録することができます。
Seam はデプロイメントハンドラを内部的に使ってコンポーネントと名前空間をインストールするため、
handle() は Seam のブートストラップで使用できるようかなり早くに呼び出されます。 アプリケーションによりスコープされたコンポーネントの起動中にデプロイメントハンドラに簡単にアクセスすることができます。
@Name("fooStartup")
@Scope(APPLICATION)
@Startup
public class FooStartup {
@In("#{deploymentStrategy.deploymentHandlers['fooDeploymentHandler']}")
private FooDeploymentHandler myDeploymentHandler;
@In("#{hotDeploymentStrategy.deploymentHandlers['fooDeploymentHandler']}")
private FooDeploymentHandler myHotDeploymentHandler;
@Create public void create() {
for (FileDescriptor fd: myDeploymentHandler.getResources()) {
handleFooXml(fd);
}
for (FileDescriptor f: myHotDeploymentHandler.getResources()) {
handleFooXml(fd);
}
}
public void handleFooXml(FileDescriptor fd) {
// ...
}
}