package sample.usecase.mail;
import java.util.function.Supplier;
import org.springframework.beans.factory.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import lombok.Setter;
import sample.context.mail.MailHandler;
import sample.context.orm.DefaultRepository;
import sample.model.asset.CashInOut;
import sample.usecase.ServiceUtils;
/**
* アプリケーション層のサービスメール送信を行います。
* <p>独自にトランザクションを管理するので、サービスのトランザクション内で
* 呼び出さないように注意してください。
*/
@Component
@Setter
public class ServiceMailDeliver {
@Autowired
private DefaultRepository rep;
@Autowired
@Qualifier(DefaultRepository.BeanNameTx)
private PlatformTransactionManager tx;
@Autowired
private MailHandler mail;
/** トランザクション処理を実行します。 */
private <T> T tx(Supplier<T> callable) {
return ServiceUtils.tx(tx, callable);
}
/** トランザクション処理を実行します。 */
private void tx(Runnable command) {
ServiceUtils.tx(tx, command);
}
/** 出金依頼受付メールを送信します。 */
public void sendWithdrawal(final CashInOut cio) {
//low: サンプルなので未実装。実際は独自にトランザクションを貼って処理を行う
}
public int callbackSample() {// for warning
return tx(() -> {
mail.hashCode();
return rep.hashCode();
});
}
public void commandSample() {// for warning
tx(() -> {
rep.hashCode();
});
}
}