// Path: micro-core/src/main/java/sample/context/lock/IdLockHandler.java
// public class IdLockHandler {
// 
//     private ConcurrentMap<Serializable, ReentrantReadWriteLock> lockMap = new ConcurrentHashMap<>();
// 
//     /** IDロック上で処理を実行します。 */
//     public void call(Serializable id, LockType lockType, final Runnable command) {
//         call(id, lockType, () -> {
//             command.run();
//             return true;
//         });
//     }
// 
//     public <T> T call(Serializable id, LockType lockType, final Supplier<T> callable) {
//         if (lockType.isWrite()) {
//             writeLock(id);
//         } else {
//             readLock(id);
//         }
//         try {
//             return callable.get();
//         } catch (RuntimeException e) {
//             throw e;
//         } catch (Exception e) {
//             throw new InvocationException("error.Exception", e);
//         } finally {
//             unlock(id);
//         }
//     }
// 
//     public void writeLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).writeLock().lock();
//         });
//     }
// 
//     private ReentrantReadWriteLock idLock(final Serializable id) {
//         return lockMap.computeIfAbsent(id, v -> new ReentrantReadWriteLock());
//     }
// 
//     public void readLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).readLock().lock();
//         });
//     }
// 
//     public void unlock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             ReentrantReadWriteLock idLock = idLock(v);
//             if (idLock.isWriteLockedByCurrentThread()) {
//                 idLock.writeLock().unlock();
//             } else {
//                 idLock.readLock().unlock();
//             }
//         });
//     }
// 
//     /**
//      * ロック種別を表現するEnum。
//      */
//     public static enum LockType {
//         /** 読み取り専用ロック */
//         Read,
//         /** 読み書き専用ロック */
//         Write;
// 
//         public boolean isRead() {
//             return !isWrite();
//         }
// 
//         public boolean isWrite() {
//             return this == Write;
//         }
//     }
// 
//     /** IdLock の対象と種別のペアを表現します。 */
//     @Value
//     public static class IdLockPair {
//         private Serializable id;
//         private LockType lockType;
//     }
//     
// }
// 
// Path: micro-core/src/main/java/sample/context/report/ReportHandler.java
// public class ReportHandler {
// 
// }


import org.springframework.context.MessageSource;
import org.springframework.context.annotation.*;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import sample.context.*;
import sample.context.actor.ActorSession;
import sample.context.audit.AuditHandler;
import sample.context.audit.AuditHandler.AuditPersister;
import sample.context.lock.IdLockHandler;
import sample.context.mail.MailHandler;
import sample.context.report.ReportHandler;
import sample.controller.*;
package sample;




/**
 * アプリケーションにおける汎用 Bean 定義を表現します。
 * <p>クラス側でコンポーネント定義していない時はこちらで明示的に記載してください。
 */
@Configuration
@Import({ApplicationDbConfig.class, ApplicationSecurityConfig.class})
public class ApplicationConfig {
    
    /** SpringMvcの拡張コンフィギュレーション */
    @Configuration
    static class WebMvcConfig {

        /** HibernateのLazyLoading回避対応。  see JacksonAutoConfiguration */
        @Bean
        Hibernate5Module jsonHibernate5Module() {
            return new Hibernate5Module();
        }

        /** BeanValidationメッセージのUTF-8に対応したValidator。 */
        @Bean
        LocalValidatorFactoryBean defaultValidator(MessageSource message) {
            LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
            factory.setValidationMessageSource(message);
            return factory;
        }

    }

    /** インフラ層 ( context 配下) のコンポーネント定義を表現します */
    @Configuration
    static class PlainConfig {
        @Bean
        Timestamper timestamper() {
            return new Timestamper();
        }
        @Bean
        ActorSession actorSession() {
            return new ActorSession();
        }
        @Bean
        ResourceBundleHandler resourceBundleHandler() {
            return new ResourceBundleHandler();
        }
        @Bean
        AppSettingHandler appSettingHandler() {
            return new AppSettingHandler();
        }
        @Bean
        AuditHandler auditHandler() {
            return new AuditHandler();
        }
        @Bean
        AuditPersister auditPersister() {
            return new AuditPersister();
        }
        @Bean
// Path: micro-core/src/main/java/sample/context/lock/IdLockHandler.java
// public class IdLockHandler {
// 
//     private ConcurrentMap<Serializable, ReentrantReadWriteLock> lockMap = new ConcurrentHashMap<>();
// 
//     /** IDロック上で処理を実行します。 */
//     public void call(Serializable id, LockType lockType, final Runnable command) {
//         call(id, lockType, () -> {
//             command.run();
//             return true;
//         });
//     }
// 
//     public <T> T call(Serializable id, LockType lockType, final Supplier<T> callable) {
//         if (lockType.isWrite()) {
//             writeLock(id);
//         } else {
//             readLock(id);
//         }
//         try {
//             return callable.get();
//         } catch (RuntimeException e) {
//             throw e;
//         } catch (Exception e) {
//             throw new InvocationException("error.Exception", e);
//         } finally {
//             unlock(id);
//         }
//     }
// 
//     public void writeLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).writeLock().lock();
//         });
//     }
// 
//     private ReentrantReadWriteLock idLock(final Serializable id) {
//         return lockMap.computeIfAbsent(id, v -> new ReentrantReadWriteLock());
//     }
// 
//     public void readLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).readLock().lock();
//         });
//     }
// 
//     public void unlock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             ReentrantReadWriteLock idLock = idLock(v);
//             if (idLock.isWriteLockedByCurrentThread()) {
//                 idLock.writeLock().unlock();
//             } else {
//                 idLock.readLock().unlock();
//             }
//         });
//     }
// 
//     /**
//      * ロック種別を表現するEnum。
//      */
//     public static enum LockType {
//         /** 読み取り専用ロック */
//         Read,
//         /** 読み書き専用ロック */
//         Write;
// 
//         public boolean isRead() {
//             return !isWrite();
//         }
// 
//         public boolean isWrite() {
//             return this == Write;
//         }
//     }
// 
//     /** IdLock の対象と種別のペアを表現します。 */
//     @Value
//     public static class IdLockPair {
//         private Serializable id;
//         private LockType lockType;
//     }
//     
// }
// 
// Path: micro-core/src/main/java/sample/context/report/ReportHandler.java
// public class ReportHandler {
// 
// }


// Path: micro-core/src/main/java/sample/ApplicationConfig.java
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.*;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import sample.context.*;
import sample.context.actor.ActorSession;
import sample.context.audit.AuditHandler;
import sample.context.audit.AuditHandler.AuditPersister;
import sample.context.lock.IdLockHandler;
import sample.context.mail.MailHandler;
import sample.context.report.ReportHandler;
import sample.controller.*;

package sample;




/**
 * アプリケーションにおける汎用 Bean 定義を表現します。
 * <p>クラス側でコンポーネント定義していない時はこちらで明示的に記載してください。
 */
@Configuration
@Import({ApplicationDbConfig.class, ApplicationSecurityConfig.class})
public class ApplicationConfig {
    
    /** SpringMvcの拡張コンフィギュレーション */
    @Configuration
    static class WebMvcConfig {

        /** HibernateのLazyLoading回避対応。  see JacksonAutoConfiguration */
        @Bean
        Hibernate5Module jsonHibernate5Module() {
            return new Hibernate5Module();
        }

        /** BeanValidationメッセージのUTF-8に対応したValidator。 */
        @Bean
        LocalValidatorFactoryBean defaultValidator(MessageSource message) {
            LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
            factory.setValidationMessageSource(message);
            return factory;
        }

    }

    /** インフラ層 ( context 配下) のコンポーネント定義を表現します */
    @Configuration
    static class PlainConfig {
        @Bean
        Timestamper timestamper() {
            return new Timestamper();
        }
        @Bean
        ActorSession actorSession() {
            return new ActorSession();
        }
        @Bean
        ResourceBundleHandler resourceBundleHandler() {
            return new ResourceBundleHandler();
        }
        @Bean
        AppSettingHandler appSettingHandler() {
            return new AppSettingHandler();
        }
        @Bean
        AuditHandler auditHandler() {
            return new AuditHandler();
        }
        @Bean
        AuditPersister auditPersister() {
            return new AuditPersister();
        }
        @Bean
        IdLockHandler idLockHandler() {