// Path: micro-core/src/main/java/sample/context/rest/RestActorSessionInterceptor.java
// public static class RestActorSessionConverter {
//     private static final Logger logger = LoggerFactory.getLogger(RestActorSessionConverter.class);
//     public static String convert(Actor actor) {
//         return String.join("_", actor.getId(), actor.getName(), actor.getRoleType().name(),
//                 actor.getLocale().getLanguage(),
//                 Optional.ofNullable(actor.getChannel()).orElse("none"),
//                 Optional.ofNullable(actor.getSource()).orElse("none"));
//     }
//     public static Actor convert(String actorStr) {
//         String[] params = actorStr.split("_");
//         if (params.length != 6) {
//             logger.warn("Actor への変換に失敗しました。");
//             return Actor.Anonymous;
//         }
//         return new Actor(params[0], params[1], ActorRoleType.valueOf(params[2]),
//                 new Locale(params[3]), params[4], params[5]);
//     }
// }


import java.io.IOException;
import java.util.Optional;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.filter.GenericFilterBean;
import sample.context.actor.ActorSession;
import sample.context.rest.RestActorSessionInterceptor.RestActorSessionConverter;
package sample.context.rest;





/**
 * プロセス間で ActorSession を引き継ぎさせる Filter。 (受付側)
 * <p>あらかじめ要求元プロセスに RestActorSessionInterceptor を適用しておく必要があります。
 * <p>非同期 Servlet を利用する場合は利用できません。( 別途同様の仕組みを作成してください )
 */
public class RestActorSessionBindFilter extends GenericFilterBean {
    
    private final ActorSession session;
    
    public RestActorSessionBindFilter(ActorSession session) {
        this.session = session;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            String actorStr = ((HttpServletRequest)request).getHeader(RestActorSessionInterceptor.AttrActorSession);
            Optional.ofNullable(actorStr).ifPresent((str) ->
// Path: micro-core/src/main/java/sample/context/rest/RestActorSessionInterceptor.java
// public static class RestActorSessionConverter {
//     private static final Logger logger = LoggerFactory.getLogger(RestActorSessionConverter.class);
//     public static String convert(Actor actor) {
//         return String.join("_", actor.getId(), actor.getName(), actor.getRoleType().name(),
//                 actor.getLocale().getLanguage(),
//                 Optional.ofNullable(actor.getChannel()).orElse("none"),
//                 Optional.ofNullable(actor.getSource()).orElse("none"));
//     }
//     public static Actor convert(String actorStr) {
//         String[] params = actorStr.split("_");
//         if (params.length != 6) {
//             logger.warn("Actor への変換に失敗しました。");
//             return Actor.Anonymous;
//         }
//         return new Actor(params[0], params[1], ActorRoleType.valueOf(params[2]),
//                 new Locale(params[3]), params[4], params[5]);
//     }
// }


// Path: micro-core/src/main/java/sample/context/rest/RestActorSessionBindFilter.java
import java.io.IOException;
import java.util.Optional;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.filter.GenericFilterBean;
import sample.context.actor.ActorSession;
import sample.context.rest.RestActorSessionInterceptor.RestActorSessionConverter;

package sample.context.rest;





/**
 * プロセス間で ActorSession を引き継ぎさせる Filter。 (受付側)
 * <p>あらかじめ要求元プロセスに RestActorSessionInterceptor を適用しておく必要があります。
 * <p>非同期 Servlet を利用する場合は利用できません。( 別途同様の仕組みを作成してください )
 */
public class RestActorSessionBindFilter extends GenericFilterBean {
    
    private final ActorSession session;
    
    public RestActorSessionBindFilter(ActorSession session) {
        this.session = session;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            String actorStr = ((HttpServletRequest)request).getHeader(RestActorSessionInterceptor.AttrActorSession);
            Optional.ofNullable(actorStr).ifPresent((str) ->
                session.bind(RestActorSessionConverter.convert(str)));