// Path: api-server/src/main/java/com/github/nettybook/ch9/core/ApiRequestTemplate.java
// public abstract class ApiRequestTemplate implements ApiRequest {
//     protected Logger logger;
// 
//     /**
//      * API 요청 data
//      */
//     protected Map<String, String> reqData;
// 
//     /**
//      * API 처리결과
//      */
//     protected JsonObject apiResult;
// 
//     /**
//      * logger 생성<br/>
//      * apiResult 객체 생성
//      */
//     public ApiRequestTemplate(Map<String, String> reqData) {
//         this.logger = LogManager.getLogger(this.getClass());
//         this.apiResult = new JsonObject();
//         this.reqData = reqData;
// 
//         logger.info("request data : " + this.reqData);
//     }
// 
//     public void executeService() {
//         try {
//             this.requestParamValidation();
// 
//             this.service();
//         }
//         catch (RequestParamException e) {
//             logger.error(e);
//             this.apiResult.addProperty("resultCode", "405");
//         }
//         catch (ServiceException e) {
//             logger.error(e);
//             this.apiResult.addProperty("resultCode", "501");
//         }
//     }
// 
//     public JsonObject getApiResult() {
//         return this.apiResult;
//     }
// 
//     @Override
//     public void requestParamValidation() throws RequestParamException {
//         if (getClass().getClasses().length == 0) {
//             return;
//         }
// 
//         // // TODO 이건 꼼수 바꿔야 하는데..
//         // for (Object item :
//         // this.getClass().getClasses()[0].getEnumConstants()) {
//         // RequestParam param = (RequestParam) item;
//         // if (param.isMandatory() && this.reqData.get(param.toString()) ==
//         // null) {
//         // throw new RequestParamException(item.toString() +
//         // " is not present in request param.");
//         // }
//         // }
//     }
// 
//     public final <T extends Enum<T>> T fromValue(Class<T> paramClass, String paramValue) {
//         if (paramValue == null || paramClass == null) {
//             throw new IllegalArgumentException("There is no value with name '" + paramValue + " in Enum "
//                     + paramClass.getClass().getName());
//         }
// 
//         for (T param : paramClass.getEnumConstants()) {
//             if (paramValue.equals(param.toString())) {
//                 return param;
//             }
//         }
// 
//         throw new IllegalArgumentException("There is no value with name '" + paramValue + " in Enum "
//                 + paramClass.getClass().getName());
//     }
// }
// 
// Path: api-server/src/main/java/com/github/nettybook/ch9/core/KeyMaker.java
// public interface KeyMaker {
// 	/**
// 	 * 키 생성기로부터 만들어진 키를 가져온다. 
// 	 * @return 만들어진 키
// 	 */
// 	public String getKey();
// }
// 
// Path: api-server/src/main/java/com/github/nettybook/ch9/service/dao/TokenKey.java
// public class TokenKey implements KeyMaker {
//     static final int SEED_MURMURHASH = 0x1234ABCD;
// 
//     private String email;
//     private long issueDate;
// 
//     /**
//      * 키 메이커 클래스를 위한 생성자.
//      * 
//      * @param email
//      *            키 생성을 위한 인덱스 값
//      * @param issueDate
//      */
//     public TokenKey(String email, long issueDate) {
//         this.email = email;
//         this.issueDate = issueDate;
//     }
// 
//     /*
//      * (non-Javadoc)
//      * 
//      * @see net.sf.redisbook.ch7.redislogger.KeyMaker#getKey()
//      */
//     @Override
//     public String getKey() {
//         String source = email + String.valueOf(issueDate);
// 
//         return Long.toString(MurmurHash.hash64A(source.getBytes(), SEED_MURMURHASH), 16);
//     }
// }


import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;
import com.github.nettybook.ch9.core.ApiRequestTemplate;
import com.github.nettybook.ch9.core.KeyMaker;
import com.github.nettybook.ch9.service.dao.TokenKey;
import com.google.gson.JsonObject;

package com.github.nettybook.ch9.service;





@Service("users")
@Scope("prototype")

// Path: api-server/src/main/java/com/github/nettybook/ch9/core/ApiRequestTemplate.java
// public abstract class ApiRequestTemplate implements ApiRequest {
//     protected Logger logger;
// 
//     /**
//      * API 요청 data
//      */
//     protected Map<String, String> reqData;
// 
//     /**
//      * API 처리결과
//      */
//     protected JsonObject apiResult;
// 
//     /**
//      * logger 생성<br/>
//      * apiResult 객체 생성
//      */
//     public ApiRequestTemplate(Map<String, String> reqData) {
//         this.logger = LogManager.getLogger(this.getClass());
//         this.apiResult = new JsonObject();
//         this.reqData = reqData;
// 
//         logger.info("request data : " + this.reqData);
//     }
// 
//     public void executeService() {
//         try {
//             this.requestParamValidation();
// 
//             this.service();
//         }
//         catch (RequestParamException e) {
//             logger.error(e);
//             this.apiResult.addProperty("resultCode", "405");
//         }
//         catch (ServiceException e) {
//             logger.error(e);
//             this.apiResult.addProperty("resultCode", "501");
//         }
//     }
// 
//     public JsonObject getApiResult() {
//         return this.apiResult;
//     }
// 
//     @Override
//     public void requestParamValidation() throws RequestParamException {
//         if (getClass().getClasses().length == 0) {
//             return;
//         }
// 
//         // // TODO 이건 꼼수 바꿔야 하는데..
//         // for (Object item :
//         // this.getClass().getClasses()[0].getEnumConstants()) {
//         // RequestParam param = (RequestParam) item;
//         // if (param.isMandatory() && this.reqData.get(param.toString()) ==
//         // null) {
//         // throw new RequestParamException(item.toString() +
//         // " is not present in request param.");
//         // }
//         // }
//     }
// 
//     public final <T extends Enum<T>> T fromValue(Class<T> paramClass, String paramValue) {
//         if (paramValue == null || paramClass == null) {
//             throw new IllegalArgumentException("There is no value with name '" + paramValue + " in Enum "
//                     + paramClass.getClass().getName());
//         }
// 
//         for (T param : paramClass.getEnumConstants()) {
//             if (paramValue.equals(param.toString())) {
//                 return param;
//             }
//         }
// 
//         throw new IllegalArgumentException("There is no value with name '" + paramValue + " in Enum "
//                 + paramClass.getClass().getName());
//     }
// }
// 
// Path: api-server/src/main/java/com/github/nettybook/ch9/core/KeyMaker.java
// public interface KeyMaker {
// 	/**
// 	 * 키 생성기로부터 만들어진 키를 가져온다. 
// 	 * @return 만들어진 키
// 	 */
// 	public String getKey();
// }
// 
// Path: api-server/src/main/java/com/github/nettybook/ch9/service/dao/TokenKey.java
// public class TokenKey implements KeyMaker {
//     static final int SEED_MURMURHASH = 0x1234ABCD;
// 
//     private String email;
//     private long issueDate;
// 
//     /**
//      * 키 메이커 클래스를 위한 생성자.
//      * 
//      * @param email
//      *            키 생성을 위한 인덱스 값
//      * @param issueDate
//      */
//     public TokenKey(String email, long issueDate) {
//         this.email = email;
//         this.issueDate = issueDate;
//     }
// 
//     /*
//      * (non-Javadoc)
//      * 
//      * @see net.sf.redisbook.ch7.redislogger.KeyMaker#getKey()
//      */
//     @Override
//     public String getKey() {
//         String source = email + String.valueOf(issueDate);
// 
//         return Long.toString(MurmurHash.hash64A(source.getBytes(), SEED_MURMURHASH), 16);
//     }
// }


// Path: api-server/src/main/java/com/github/nettybook/ch9/service/UserInfo.java
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;
import com.github.nettybook.ch9.core.ApiRequestTemplate;
import com.github.nettybook.ch9.core.KeyMaker;
import com.github.nettybook.ch9.service.dao.TokenKey;
import com.google.gson.JsonObject;

package com.github.nettybook.ch9.service;





@Service("users")
@Scope("prototype")

public class UserInfo extends ApiRequestTemplate {
