Menu

Documentation

SMART Deploy

S2Container 2.4.x以降に導入されたSMART Deploy機能を利用したS2Directoryの設定方法を紹介します。なお、SMART Deployの詳細な説明については、S2Containerのドキュメントを読んでください。

S2Directoryに関連するルートパッケージ直下のSMART Deployのための要素

S2Directoryに関連するルートパッケージ直下の要素は次のとおりです。

個別パッケージ クラスの命名規約 説明
directorydao 任意の名前 + DirectoryDao ディレクトリにアクセスするためのインタフェースです。インタフェースにメソッドを書いておくだけで、データアクセスのロジックは、アスペクトが自動生成します。実装部分を作る必要はありません。

S2Container 2.4.14 - 2.4.17と一緒にS2Directoryを利用する場合、個別パッケージ名をdirectoryDaoとしないと正常に動作しません。
この問題は2.4.13以前、および、2.4.18以降では発生しません。

  • org.example.directorydao.PosixAccountDirectoryDao
  • org.example.directorydao.PosixGroupDirectoryDao

S2Strutsを使ったWEBアプリケーションでのに組み合わせたSMART Deploy設定例

下図はS2Strutsを使ったWEBアプリケーションにS2Directoryを組み合わせたSMART Deploy時のパッケージ構成例です。WEB-INF/src/main/java と WEB-INF/src/main/resources は、WEB-INF/classes 以下にコンパイルされたクラスファイルと設定ファイルとして出力されます。

既に構成されたアプリケーションに対して、S2Directoryのために新たに設定する必要があるdiconファイルは次の4つです。

S2Strutsを使ったSMART Deploy時のWEBアプリケーションでのパッケージ構成例

上図で登場するdiconファイルについて説明します。S2Directoryのために新たに設定する必要がある箇所はボールド体になっています。

app.dicon

アプリケーションを構成するルートとなるdiconファイルです。S2Directoryの基本機能を提供するためのシステム設定(DI設定、AOP定義)を有効にするためにdirectorydao.diconファイルをincludeします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="convention.dicon"/>
    <include path="aop.dicon"/>
    <include path="directorydao.dicon"/>
    <include condition="#ENV != 'ut'" path="s2struts.dicon"/>
    <include condition="#ENV == 'ut'" path="s2struts-hotdeploy.dicon"/>
</components>

application_ja.properties, application.properties

S2Strutsで使用するリソース定義ファイルです。主にエラーメッセージなどを記載しておきます。詳細については、S2Sturtsのドキュメントを読んでください。

convention.dicon

アプリケーションのネーミング規約を定義するdiconファイルです。SMART deployを利用する場合に必要となります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
        <initMethod name="addRootPackageName">
            <arg>"org.seasar.server.members"</arg>
        </initMethod>
    </component>
</components>

creator.dicon

ネーミング規約に基づいてコンポーネント定義を作成するCreatorを定義するdiconファイルです。SMART deployを利用する場合に必要となります。S2DirectoryのためのDirectoryDaoインタフェースをネーミング規約に従いコンポーネント定義するために org.seasar.directory.dao.creator.DirectoryDaoCreator を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="convention.dicon"/>
    <include path="customizer.dicon"/>

    <component class="org.seasar.framework.container.creator.ActionCreator"/>
    <component class="org.seasar.directory.dao.creator.DirectoryDaoCreator"/>
    <component class="org.seasar.framework.container.creator.DtoCreator">
        <property name="instanceDef">
            @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
        </property>
    </component>
    <component class="org.seasar.framework.container.creator.LogicCreator"/>
    <component class="org.seasar.framework.container.creator.ServiceCreator"/>
    <component class="org.seasar.framework.container.creator.InterceptorCreator"/>
<!--
    <component class="org.seasar.framework.container.creator.DaoCreator"/>
    <component class="org.seasar.framework.container.creator.DxoCreator"/>
    <component class="org.seasar.framework.container.creator.HelperCreator"/>
    <component class="org.seasar.framework.container.creator.PageCreator"/>
    <component class="org.seasar.framework.container.creator.ValidatorCreator"/>
    <component class="org.seasar.framework.container.creator.ConverterCreator"/>
-->
</components>

customizer.dicon

Creatorが作成したコンポーネント定義をカスタマイズするCustomizerを定義するdiconファイルです。SMART deployを利用する場合に必要となります。S2DirectoryのためのDirectoryDaoインタフェースにS2Directoryのインタセプターを適用するのにdirectoryDaoAspectCustomizerに関する設定を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="default-customizer.dicon"/>

    <!-- AspectCustomizer -->
    <component name="directoryDaoAspectCustomizer"
        class="org.seasar.framework.container.customizer.AspectCustomizer">
        <property name="interceptorName">"directorydao.interceptor"</property>
    </component>

    <!-- CustomizerChain -->
    <component name="txAspectCustomizer"
        class="org.seasar.framework.container.customizer.AspectCustomizer">
        <property name="interceptorName">"j2ee.requiredTx"</property>
    </component>

    <component name="actionCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
            <arg>traceCustomizer</arg>
        </initMethod>
    </component>
<--
    <component name="daoCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
            <arg>traceCustomizer</arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>s2DaoCustomizer</arg>
        </initMethod>
    </component>
-->
    <component name="directoryDaoCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
            <arg>traceCustomizer</arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>directoryDaoAspectCustomizer</arg>
        </initMethod>
    </component>
<!--
    <component name="dxoAspectCustomizer"
        class="org.seasar.framework.container.customizer.AspectCustomizer">
        <property name="interceptorName">"dxo.interceptor"</property>
    </component>
    <component name="dxoCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
            <arg>traceCustomizer</arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>dxoAspectCustomizer</arg>
        </initMethod>
    </component>
-->
    <component name="logicCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
            <arg>traceCustomizer</arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>txAspectCustomizer</arg>
        </initMethod>
    </component>

    <component name="serviceCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
            <arg>traceCustomizer</arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>txAspectCustomizer</arg>
        </initMethod>
    </component>
</components>

directory.dicon

ディレクトリサーバに接続するための各種設定情報を定義するdiconファイルです。詳細については、Configurationのdirectory.diconについての説明を読んでください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components.dtd">
<components namespace="directory">
<!--
	# Directory Configuration
-->
	<component name="directoryControlProperty"
		class="org.seasar.directory.impl.DirectoryControlPropertyImpl"
			instance="prototype">

		<property name="initialContextFactory">
			"com.sun.jndi.ldap.LdapCtxFactory"
		</property>

	<!--
		# PermissiveSSLSocketFactory is not strictly secure.
		# But, it can connect to the server having the SSL certificate signed by own CA.
		# default value:
		<property name="sslSocketFactory">
			"javax.net.ssl.SSLSocketFactory"
		</property>
	-->
		<property name="sslSocketFactory">
			"org.seasar.directory.impl.PermissiveSSLSocketFactory"
		</property>
		<property name="enableTLS">false</property>

		<property name="url">
			"ldap://localhost:389"
		</property>
		<property name="baseDn">"dc=seasar,dc=org"</property>
		<property name="bindDn">"cn=Manager,dc=seasar,dc=org"</property>
		<property name="password">"secret"</property>
		<property name="passwordAlgorithm">"SHA"</property>

	<!--
		# Other options and each default value.
		<property name="authentication">"simple"</property>
		<property name="user"></property>
		<property name="passwordAlgorithm">"SSHA"</property>
		<property name="passwordSaltLength">"4"</property>
		<property name="userSuffix">"ou=Users"</property>
		<property name="userAttributeName">"uid"</property>
		<property name="groupSuffix">"ou=Groups"</property>
		<property name="groupAttributeName">"memberUid"</property>
		<property name="multipleValueDelimiter">"DEFAULT_MULTIPLE_VALUE_DELIMITER"</property>
	-->
	</component>
</components>

env.txt

SMART deployの種類を定義するテキストファイルです。開発中はHOT deployで動かすためutと記述し、リリース時はCOOL deployで動かすためにproductと記述します。

ut

log4j.properties

log4Jのための設定ファイルです。デバッグ情報が必要な場合は、log4j.category.org.seasarの値をDEBUG, Cに、不要な場合は、INFO, Cに設定します。

log4j.category.org.seasar=DEBUG, C
#log4j.category.org.seasar=INFO, C
log4j.additivity.org.seasar=false

log4j.appender.C=org.apache.log4j.ConsoleAppender
log4j.appender.C.Target=System.out
log4j.appender.C.ImmediateFlush=true
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=%-5p %d [%t] %m%n

log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

s2container.dicon

S2コンテナをカスタマイズするための設定を定義するdiconファイルです。SMART deployを利用する場合に必要となります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include condition="#ENV == 'ut'" path="hotdeploy.dicon"/>
    <include condition="#ENV == 'ct' || #ENV == 'it'" path="warmdeploy.dicon"/>
    <include condition="#ENV == 'product'" path="cooldeploy.dicon"/>
</components>

設定後の開発

SMART Deploy用の設定は一度設定してしまえば、開発中変更する必要はありません。設定後は通常と同じ使い方でS2Directoryを使うことができます。