Seasar DI Container with AOP

�Z�b�g�A�b�v

Seasar2�Ɠ��l��JDK1.4�ȏオ�K�v�ł��B

S2Mai�{��

�_�E�����[�h����s2mai-x.x.x.zip���𓀂���ƁAs2mai�f�B���N�g�����o���܂��B���̂Ȃ���lib�f�B���N�g���ɂ���us2mai-x.x.x.jar�v���N���X�p�X�Ɋ܂߂ĉ������B

���A�K�v�ƂȂ�jar�t�@�C����lib�f�B���N�g�����ɂ���܂����A���̓��AS2Mai�{�̂��K�v�Ƃ�����͈̂ȉ��ɂȂ�܂��B

  • mail-x.x.jar
  • activation-x.x.x.jar
  • ozacc-mail-x.x.x.jar
  • s2-framework-2.4.x.jar
  • s2-exteinsion-2.4.x.jar

�e���v���[�g�G���W���Ƃ��āAFreeMarker��Velocity�ɑΉ����Ă��܂��B�����p�ɂȂ�e���v���[�g�G���W���ɂ���Ĉȉ��̂����ꂩ���N���X�p�X�Ɋ܂߂ĉ������B

FreeMarker�̏ꍇ
  • freemarker-x.x.x.jar
Velocity�̏ꍇ
  • velocity-x.x.jar
  • velocity-tools-generic-x.x.jar
  • commons-collections-x.x.jar
  • commons-lang-x.x.jar

��q���܂����A�Y�t�t�@�C����List�Ŏ��ꍇ�ɃW�F�l���N�X���g�������ꍇ�́A���L��jar���K�v�ƂȂ�܂��B������͔z�z�t�@�C���ɂ͊܂܂�Ă��܂���̂ŕʓr���肵�ĉ������B

  • s2-tiger-2.4.x.jar
  • geronimo-ejb_2.1_spec-1.0.jar

geronimo-ejb_2.1_spec-1.0.jar�́A����‹���JavaEE�Ƀt���ɑΉ����Ă���ꍇ�͕s�v�ƂȂ�܂��B�ڂ����������������Q�Ɖ������B

����!!

geronimo-j2ee_1.4_spec-1.0.jar ���N���X�p�X�ɂ���ꍇ�A������ɂ�JavaMail�������I�Ɏ�������Ă���A�Q�Ə����ɂ���Ă����炪�D�悳���ƕs����������鎖���m�F����Ă��܂��B�o�������SUN��JavaMail�����i�����ł�mail.jar�j���g���悤�ɂ��ĉ������B

S2Mai-Tiger

S2Mai�ł͒萔�A�m�e�[�V������p���Ċe��v���p�e�B��ݒ肷�鎖���o���܂��B�����萔�ł͂Ȃ��AJava�̃A�m�e�[�V�������g���Đݒ肷�鎖���o���܂��B���̍ۂɂ́As2mai-tiger-x.x.x.zip���_�E�����[�h������A�𓀂��A����Ɋ܂܂��us2mai-tiger-x.x.x.jar�v���N���X�p�X�Ɋ܂߂ĉ������B

Maven2����̂����p

S2Mai��Maven2����������p���������܂��B�܂��ASeasar��Maven2���|�W�g����repository�v�f��lj����܂��B

  <repositories>
    <repository>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Repository</name>
      <url>http://maven.seasar.org/maven2</url>
    </repository>
  </repositories>

�����āAS2Mai��������S2Mai-Tiger��dependencies�v�f�̒��ɒlj����ĉ������BS2Mai-Tiger�������p�̏ꍇ�́AS2Mai�ւ̈ˑ���Maven2���������܂��̂ŁA�v�f��lj�����K�v�͂���܂���B

<dependency>
    <groupId>org.seasar.mai</groupId>
    <artifactId>s2mai</artifactId>
    <version>0.9.4</version>
</dependency>
<dependency>
    <groupId>org.seasar.mai</groupId>
    <artifactId>s2mai-tiger</artifactId>
    <version>0.9.4</version>
</dependency>

version�͓K�X�w�肵�ĉ������B

�܂��͎g���Ă݂�

�S�̂̐ݒ�

SMTP�T�[�o�̐ݒ��G���R�[�f�B���O�ȂǁA�S�̂̐ݒ�́umailProperties.dicon�v�Ƃ����t�@�C���ɋL�q���܂��B���̃t�@�C����jar�Ɋ܂܂�Ă���̂ŁA���L�̃f�t�H���g�l�Ŗ�肪�Ȃ���΍쐬����K�v�͂���܂���B�ݒ�̕ύX���������ꍇ�ɂ̓t�@�C�����쐬���A�ݒ���L�q���ă��[�g�p�b�P�[�W�ɒu���܂��B

�f�t�H���g�̓��e�͈ȉ��ɂȂ�܂��B

mailProperties.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
    "http://www.seasar.org/dtd/components23.dtd">
<components namespace="mailProperties">
    <component name="host">
        "localhost"
    </component>
    <component name="port">
        25
    </component>
    <component name="username">
        null
    </component>
    <component name="password">
        null
    </component>
    <component name="from">
        null
    </component>
    <component name="replyTo">
        null
    </component>
    <component name="returnPath">
        null
    </component>
    <component name="messageId">
        null
    </component>
    <component name="templateEncoding">
        "UTF-8"
    </component>
    <component name="connectionTimeout">
        10000
    </component>
    <component name="readTimeout">
        10000
    </component>
    <component name="mailCharset">
        "ISO-2022-JP"
    </component>
</components>
�e�ݒ荀�ڂ̓��e�͈ȉ��ł��B
host
SMTP�T�[�o����������IP
port
SMTP�̃|�[�g�ԍ�
username
SMTP�Ƀ��O�C������K�v������ꍇ�A���̃��[�U�[��
password
�������A���̃p�X���[�h
templateEncoding
�e���v���[�g�̃G���R�[�f�B���O
connectionTimeout
SMTP�T�[�o�Ƃ̐ڑ��^�C���A�E�g
readTimeout
SMTP�T�[�o�ւ̑���M���̃^�C���A�E�g
mailCharset
���[���̃G���R�[�h�Ɏg�p���镶���R�[�h
���̍��ڂ͌��ݖ��Ή��ł��B

��{�I�Ȏg����

�܂��A���[���̓��e��ێ�����N���X�����܂��B�����ł́Aname�Ƃ����v���p�e�B���������uTestDto�v�Ƃ����N���X���us2mai.test.dto�v�Ƃ����p�b�P�[�W�ɍ�鎖�ɂ��܂��B

s2mai.test.dto.TestDto
package s2mai.test.dto;

public class TestDto{
    private String name;
    
    public void setName(String name_){
      this.name = name_;
    }
    
    public String getName(){
      return name;
    }
}

���ɁA���[�����M������Mai�C���^�t�F�[�X�����܂��B�����ł́uTestMai�v�Ƃ����C���^�t�F�[�X���us2mai.test.mai�v�Ƃ����p�b�P�[�W�ɍ�鎖�ɂ��܂��B�uTestMai�v�́A�uTestDto�v�������ɂƂ��Ă��̓��e�𔽉f�������[���𑗐M����usendMail�v�Ƃ������\�b�h�����Ž��ɂ��܂��B

s2mai.test.mai.TestMai
package s2mai.test.mai;

public interface TestMai {
    void sendMail(TestDto dto);
}

���̃C���^�t�F�[�X�̖��O�͂Ȃ�ł��\���܂��񂪁A��X�̃����e�i���X��SMART deploy��p�����J���ɑΉ����邽�߂ɁA�u�`Mai�v�Ƃ��������K���ɑ��鎖�𐄏����܂��B�܂��A���[�����M�p���\�b�h�̖��O�ɂ͓��ɐ���͂���܂���B�p�r�ʂɕ����̃��\�b�h����‚�Mai�C���^�t�F�[�X�ɒ�`���鎖���o���܂��B

���ɁA�C�ӂ�dicon�t�@�C����Mai���R���|�[�l���g�Ƃ��ēo�^���܂��B�����ł́A�umaitest.dicon�v�Ƃ����t�@�C�������[�g�p�b�P�[�W�ɍ��A�����Œ�`���鎖�ɂ��܂��B

maitest.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
    "http://www.seasar.org/dtd/components23.dtd">
<components>

    <include path="s2mai.dicon"/>
    
    <component class="s2mai.test.mai.TestMai">
        <aspect>s2MaiInterceptor</aspect>
    </component>
    
</components>

s2mai.dicon��include���A<aspect>�^�O�ŁAs2MaiInterceptor��K�p���܂��Bs2mai.dicon��jar�̒��ɂ���܂��̂ŃJ�X�^�}�C�Y���Ȃ�����͉������Ȃ��č\���܂���B

���ɁAfrom��to�Ƃ��������[���̐ݒ��ێ�����dicon�t�@�C�����AMai�C���^�t�F�[�X�Ɠ����p�b�P�[�W�ɍ��܂��B�����ł́us2mai.test.mai�v�ɍ�鎖�ɂȂ�܂��Bdicon�t�@�C���̃t�@�C�����͉��L�̓�ʂ肪�g�p�ł��܂��B

  • Mai�C���^�t�F�[�X��.dicon
  • Mai�C���^�t�F�[�X��_���\�b�h��.dicon

Mai�C���^�t�F�[�X���݂̂̃t�@�C�����̏ꍇ�AMai�C���^�t�F�[�X�ɕ����̃��\�b�h������ꍇ�A�����S�ĂɓK�p����܂��B���郁�\�b�h�����ɓK�p�������ꍇ�́AMai�C���^�t�F�[�X��_���\�b�h���̌`���ɂ��܂��B

�����ł́A���\�b�h���w�肷��`�ɂ��Ă݂܂��B

TestMai_sendMail.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
    "http://www.seasar.org/dtd/components23.dtd">
<components>

    <component class="com.ozacc.mail.Mail">
        <initMethod name="addTo"><arg>"[email protected]"</arg></initMethod>
    </component>

</components>

��L�́ATo�Ɂu[email protected]�v��lj����Ă��܂��Bozacc����̍��ꂽozacc-mail-library��Mail�N���X�ɒ��ڐݒ肵�Ă܂��̂ŁA���̃v���p�e�B�ȂǏڂ�������http://spring-ext.sourceforge.jp/oml/apidocs/com/ozacc/mail/Mail.html���Q�Ƃ��ĉ������B

���ɁA���M���[���̓��e�̃e���v���[�g�����܂��B�f�t�H���g�ł̓e���v���[�g�G���W���Ƃ���FreeMarker���g���܂��B�t�@�C�����́A�uMai�C���^�t�F�[�X��_���\�b�h��.ftl�v�Ƃ��ĉ������Bftl��FreeMarker�̃e���v���[�g�̊g���q�ƂȂ�܂��B������AMai�C���^�t�F�[�X�Ɠ����p�b�P�[�W�ɒu���܂��B

TestMai_sendMail.ftl
Subject: �e�X�g���[���ł��B

${data.name}���񂱂�ɂ��́B

�e���v���[�g�̈�ԏ�̍s�ɁA�uSubject: (�Ō�ɔ��p�X�y�[�X���)�v�Ə����ƁA����ȍ~�������Ƃ��ăZ�b�g���܂��B�Ⴆ�Ό����Ɂu��X��v��uvol.1�v�ȂǓ��I�ȍ��ڂ������ăf�[�^�𖄂ߍ��݂������Ȃǂɕ֗��ł��B

�uSubject:�`�v���������ꍇ�A�{���Ƃ̊Ԃɋ�s��1�s����ĉ������B�uSubject:�`�v�������Ȃ��ꍇ��1�s�ڂ���{���Ƃ݂Ȃ��܂��̂ŋ�s�͗v��܂���B

mailProperties.dicon��templateEncoding��UTF-8���w�肵�Ă܂��̂ŁAUTF-8�ŕۑ����܂��B���[���̓��e��ێ�����N���X�i�����ł�TestDto�N���X�j�̃v���p�e�B�𖄂ߍ��ޏꍇ�ɂ́A�u${data.property��}�v�Ə����܂��B�e���v���[�g����TestDto��\���v�f���́udata�v�Œ�ł��B

�ł́A���s���Ă݂܂��傤�B

S2Container container = S2ContainerFactory.create("maitest.dicon");
TestMai mai = (TestMai) container.getComponent(TestMai.class);
TestDto dto = new TestDto();
dto.setName("�Z");
mai.sendMail(dto);
����ƁA���L�̓��e�Ń��[�������M����܂��B
From:null
To:[email protected]
(���ȗ�)
Subject:�e�X�g���[���ł��B

�Z���񂱂�ɂ��́B

���ꂪ��{�I��S2Mai�̎g�����ł��B

�A�m�e�[�V�������g�����ݒ�

��{�I�Ȏg�����ł��ƁA���M��Ȃǃ��[���̐ݒ��dicon�t�@�C���ɏ����ۂɁAozacc-mail-library��API�𓥂܂��Ă��Ȃ��Ƃ����܂���BS2Mai�́AMai�C���^�t�F�[�X�ɑ΂��ăA�m�e�[�V������lj����鎖�ɂ��AFrom��To�Ȃǂ�ݒ肷�鎖���o���܂��̂ŁA�A�m�e�[�V�����@�\��p���鎖�ɂ��Adicon�ł̐ݒ��������鎖���o���܂��B

�����ł́A��̃T���v���ŗp�����uTestMai�v�ɃA�m�e�[�V������lj����Ă݂܂��B�A�m�e�[�V�����ɂ�Java�̃A�m�e�[�V�����ƒ萔�A�m�e�[�V�����̓�ʂ肪�w��o���܂����A�܂��͒萔�A�m�e�[�V�������g���Ă݂܂��傤�B

s2mai.test.mai.TestMai
public interface TestMai {
    static final String FROM = "[email protected]";
    static final String TO = "[email protected]";
    
    void sendMail(TestDto data);
}

����ŁA��قǍ�����uTestMai_sendMail.dicon�v�͕s�v�ƂȂ�܂��B�܂��A����̃T���v���ł�null�ƂȂ��Ă���From���u[email protected]�v�Ƃ��Ēlj����Ă݂܂����B

���̃A�m�e�[�V�����̎w����@�̏ꍇ�A��‚�Mai�ɕ����̃��\�b�h������ꍇ�ł��e���\�b�h�ɋ��ʂɓK�p����܂��B���\�b�h�P�ʂŎw�肷��ꍇ�́A�u���\�b�h��_�ݒ荀�ږ��v�Ƃ����萔���ɂ��܂��B

s2mai.test.mai.TestMai
public interface TestMai {
    static final String FROM = "[email protected]";
    static final String TO = "[email protected]";
    static final String sendMail2_TO = "[email protected]";
    
    void sendMail(TestDto data);
    void sendMail2(TestDto2 data);
    void sendMail3(TestDto3 data);
}

���̏ꍇ�AsendMail��sendMail3�̎��s����To�ɂ́u[email protected]�v���ݒ肳��āAsendMail2�̎��s���ɂ́u[email protected]�v�����f����܂��BTo��Cc��Bcc�ȂǁA�����w�肷����̂ɂ́A�z��ł̎w����o���܂��B

�܂��A���[���A�h���X�ɂ́A�u�Z<[email protected]>�v�Ƃ������悤�ɁA�A�h���X�{�̂ƍ��킹�Ė��̂�ݒ肵������������܂��BS2Mai�ł́A���[���A�h���X�Ɩ��̂�ێ�����A�uorg.seasar.mai.mail.MailAddress�v�Ƃ����N���X��񋟂��Ă��܂��B

�z��ł̕����w���MailAddress�N���X�̎g�p������킹�Č��Ă݂܂��傤�B

static final MailAddress FROM = new MailAddress("[email protected]","���M����");
static final MailAddress[] TO = 
    new MailAddress[]{new MailAddress("[email protected]","�Z"), new MailAddress("[email protected]","�܂�")};

MailAddress�̃R���X�g���N�^�̈����́A��ꂪ���[���A�h���X�A��񂪖��O�ɂȂ�܂��B���͏ȗ��”\�ł��BMailAddress���̂ł́A���[���A�h���X�̃t�H�[�}�b�g�ȂǁA�K��ɊO��Ă��Ă����ɃG���[�͋N���܂��񂪁A�ŏI�I��JavaMail��InternetAddress�ւƃZ�b�g�����̂ŁA�����ŗ�O���������܂��̂ł����Ӊ�����

�萔�A�m�e�[�V�����ɂ͈ȉ����w��o���܂��B

�A�m�e�[�V���� �����w��̉”�
SUBJECT �~
FROM �~
TO ��
CC ��
BCC ��
REPLY_TO �~
RETURN_PATH �~

�����Őݒ肳�ꂽ�l�́AMai�C���^�t�F�[�X��_���\�b�h��.dicon�Őݒ肳�ꂽ���̂��D�悳��܂��B

�������ASubject�̓e���v���[�g��1�s�ڂɏ��������̂��ŗD��ƂȂ�܂��B�A�m�e�[�V�����Őݒ肵�����ꍇ�́A�e���v���[�g��1�s�ڂ́uSubject: �`�v���s���ƍ폜���ĉ������B1�s�ڂ��烁�[���{�����n�܂��Ă����͂���܂���B

���[�����e�N���X�̃v���p�e�B�ł̐ݒ�

�����܂ł̕��@�ł��ƁAFrom��To�Ȃǂ̃��[���ݒ�̓r���h���Ɍ��܂��Ă��܂��A�A�v���P�[�V�����œ��I�ɐݒ肷�鎖���o���܂���BS2Mai�́A���[���̓��e��ێ�����N���X�̃v���p�e�B�𖽖��K���ɏ��������O�ɂ��鎖�ŁA���̃v���p�e�B�̒l���g���ă��[���ݒ���s���܂��B�A�v���P�[�V�������ŁA���̃v���p�e�B�ɒl���Z�b�g���Ă�鎖�ŁA���I�ɐݒ肷�鎖���”\�ƂȂ�܂��B

�����ł́A����T���v���Ŏg�����uTestDto�v�Ƀ��[���ݒ�p�v���p�e�B��lj����Ă݂܂��B

s2mai.test.dto.TestDto
public class TestDto{
    private String name;
    
    private InternetAddress from;
    private List to;
    private MailAddress[] cc;
    private String[] bcc
    private String subject;
    
    (setter�Agetter�ȗ�)
}

��������ƁA���̃v���p�e�B�ɐݒ肳�ꂽ�l���A�uMai�C���^�t�F�[�X��.dicon�v�܂��́uMai�C���^�t�F�[�X��_���\�b�h��.dicon�v�̋L�q���e�AMai�C���^�t�F�[�X�ɏ������A�m�e�[�V�����̂ǂ�����D�悳��Ĕ��f����܂��B

�������ASubject�̓e���v���[�g��1�s�ڂ��uSubject: �`�v�������ꍇ�́A�e���v���[�g���ŗD��ł��B

�����ł͂��܂��܂Ȍ^�Ńv���p�e�B�Ƃ��Đ錾����Ă��܂��BS2Mai�őΉ����Ă���v���p�e�B���A�ϐ��^�͉��L�ɂȂ�܂��B

�v���p�e�B�� ���[���ݒ� �w��”\�Ȍ^
subject ���� String
from From String
javax.mail.internet.InternetAddress
org.seasar.mai.mail.MailAddress
to To String
javax.mail.internet.InternetAddress
org.seasar.mai.mail.MailAddress
����т��ꂼ��̔z���������List
cc Cc String
javax.mail.internet.InternetAddress
org.seasar.mai.mail.MailAddress
����т��ꂼ��̔z���������List
bcc Bcc String
javax.mail.internet.InternetAddress
org.seasar.mai.mail.MailAddress
����т��ꂼ��̔z���������List
replyTo Reply-To String
javax.mail.internet.InternetAddress
org.seasar.mai.mail.MailAddress
returnPath Return-Path String
javax.mail.internet.InternetAddress
org.seasar.mai.mail.MailAddress

�w��”\�Ȍ^�ȊO�̏ꍇ�̓G���[�ɂ͂Ȃ�܂��񂪁Anull���ݒ肳��܂��B�܂��Afrom�Ȃǂ�z���������List�ɂ����ꍇ�́A�Ō�̗v�f�����f����܂��i���A�����ۏ؂�����̂ł͂���܂���j�B

List�̏ꍇ�A�v�f�̌^��String�AInternetAddress�AMailAddress���݂ł����삵�܂��B���ɓY�t�t�@�C���p�̃v���p�e�B������܂����A����͌�q���܂��B

�܂��A�T�[�o�̐ݒ��mailProperties.dicon�Őݒ肵�܂������A���[���̓��e��ێ�����N���X����̐ݒ���”\�ł��B����̃��[���̂�SMTP�z�X�g��؂�ւ������A�Ȃǂ̗v��������ꍇ�ɂ͂�����Őݒ肵�܂��B

�v���p�e�B�� �T�[�o�ݒ� �w��”\�Ȍ^
host SMTP�T�[�o String
port SMTP�|�[�g String
Integer
int
username SMTP���[�U�[�� String
password SMTP�p�X���[�h String

�Y�t�t�@�C���ɂ‚���

�Y�t�t�@�C���������ꍇ�́AS2Mai�Œ񋟂��Ă���uorg.seasar.mai.mail.AttachedFile�v���g���܂��B

�R���X�g���N�^�Ƃ��āA���L���p�ӂ���Ă��܂��B

  1. AttachedFile(File file)
  2. AttachedFile(File file, String fileName)
  3. AttachedFile(InputStream inputStream, String fileName)
  4. AttachedFile(URL url, String fileName)

���ꂼ��������Ńt�@�C������ݒ肵�܂����A�K�؂Ȋg���q���K�v�ƂȂ�܂��BFile�݂̂��w�肵���ꍇ�́A���̃t�@�C�������Z�b�g����܂��B

�����ۏ؂��邽�߂ɁA���ꂼ��̐ݒ�l��setter�͗p�ӂ��Ă��܂���Bgetter�͂���܂��B

�uTestDto�v�ɓY�t�t�@�C���v���p�e�B��lj����܂��傤�B

s2mai.test.dto.TestDto
public class TestDto{
    private String name;
    
    private AttachedFile file;
    
    (setter�Agetter�ȗ�)
}

�v���p�e�B���͉��ł��\���܂���B�^��AttachedFile�ł���ΓY�t�t�@�C���ƌ��Ȃ��܂��B�܂��A�����w��̏ꍇ�͔z����T�|�[�g���Ă��܂��B����ɁA�v���p�e�B�𕡐��\���Ă����v�ł��B

public class TestDto{
    private String name;
    
    private AttachedFile file;
    private AttachedFile[] files;
    
    (setter�Agetter�ȗ�)
}

file��files�̂��ꂼ��ɃZ�b�g���ꂽ�t�@�C�����Y�t����܂��B

�܂��A�^��List�ɂ����ꍇ�́A���̂܂܂̃v���p�e�B���ł��Ɨv�f�̌^���s�m��̂��ߖ�������܂����A�v���p�e�B�����uattachedFile�v�Ƃ������O�ɂ���΁A�Y�t�t�@�C���Ƃ��Ĉ����܂��B

public class TestDto{
    private String name;
    
    private List attachedFile;
    
    (setter�Agetter�ȗ�)
}

�ܘ_�A���́uattachedFile�v�Ƃ����v���p�e�B���́AList�ɐ����������̂ł͂Ȃ��A�P�̂�AttachedFile�̏ꍇ�ł����̔z��̏ꍇ�ł��t���č\���܂���B

�������A�W�F�l���N�X��p�����ꍇ�͂��̋K������Ȃ��Ă�OK�ł��B�v�f�̌^���ۏ؂���܂��̂ŁA�v���p�e�B���͎��R�ɕt�����܂��B

public class TestDto{
    private String name;
    
    private List<AttachedFile> fileList;
    
    (setter�Agetter�ȗ�)
}

���̃W�F�l���N�X�̃T�|�[�g���g�������ꍇ�́As2-tiger���K�v�ł��B�ڍׂ����������Q�Ƃ��ĉ������B