// Path: core/src/main/java/com/monkeyk/os/domain/AbstractDomain.java
// public abstract class AbstractDomain implements Serializable {
// 
// 
//     private static final long serialVersionUID = 7787898374385773471L;
//     /**
//      * The domain create time.
//      */
//     protected Date createTime = DateUtils.now();
// 
//     /**
//      * Domain的业务id
//      */
//     protected String guid;
// 
//     public AbstractDomain() {
//     }
// 
//     public String guid() {
//         return guid;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <T extends AbstractDomain> T guid(String guid) {
//         this.guid = guid;
//         return (T) this;
//     }
// 
//     public Date createTime() {
//         return createTime;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <T extends AbstractDomain> T createTime(Date createTime) {
//         this.createTime = createTime;
//         return (T) this;
//     }
// 
// 
//     @Override
//     public String toString() {
//         return "{" +
//                 "createTime=" + createTime +
//                 ", guid='" + guid + '\'' +
//                 '}';
//     }
// }
// 
// Path: core/src/main/java/com/monkeyk/os/infrastructure/DateUtils.java
// public abstract class DateUtils {
// 
//     /**
//      * Default time format :  yyyy-MM-dd HH:mm:ss
//      */
//     public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
// 
//     /**
//      * Time format :  yyyy-MM-dd HH:mm
//      */
//     public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
//     public static final String TIME_FORMAT = "HH:mm";
// 
//     /**
//      * Default date format
//      */
//     public static final String DATE_FORMAT = "yyyy-MM-dd";
//     /**
//      * Default month format
//      */
//     public static final String MONTH_FORMAT = "yyyy-MM";
//     /**
//      * Default day format
//      */
//     public static final String DAY_FORMAT = "dd";
// 
// 
//     //Date pattern,  demo:  2013-09-11
//     public static final String DATE_PATTERN = "^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}$";
// 
// 
//     private DateUtils() {
//     }
// 
//     /*
//     * 判断是否为日期格式,如: 2016-12-12
//     * */
//     public static boolean isDate(String dateAsText) {
//         return StringUtils.isNotEmpty(dateAsText) && dateAsText.matches(DATE_PATTERN);
//     }
// 
//     public static Date now() {
//         return new Date();
//     }
// 
//     public static String toDateText(Date date) {
//         return toDateText(date, DATE_FORMAT);
//     }
// 
//     public static String toDateText(Date date, String pattern) {
//         if (date == null || pattern == null) {
//             return null;
//         }
//         SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
//         return dateFormat.format(date);
//     }
// 
//     public static Date getDate(String dateText) {
//         return getDate(dateText, DATE_FORMAT);
//     }
// 
// 
//     public static Date getDate(String dateText, String pattern) {
//         SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
//         try {
//             return dateFormat.parse(dateText);
//         } catch (ParseException e) {
//             throw new IllegalStateException("Parse date from [" + dateText + "," + pattern + "] failed", e);
//         }
//     }
// 
//     public static String toDateTime(Date date) {
//         return toDateText(date, DATE_TIME_FORMAT);
//     }
// 
// 
//     /**
//      * Return current year.
//      *
//      * @return Current year
//      */
//     public static int currentYear() {
//         return calendar().get(Calendar.YEAR);
//     }
// 
//     public static Calendar calendar() {
//         return Calendar.getInstance();
//     }
// 
// 
// }


import com.monkeyk.os.domain.AbstractDomain;
import com.monkeyk.os.infrastructure.DateUtils;
package com.monkeyk.os.domain.oauth;


/**
 * 15-6-20
 * <p/>
 * 定义 access_token 的信息
 *
 * @author Shengzhao Li
 */
public class AccessToken extends AbstractDomain {
    private static final long serialVersionUID = 7336709167855003668L;


    public static final String BEARER_TYPE = "Bearer";


    /**
     * 默认的 refresh_token 的有效时长: 30天
     */
    public final static int REFRESH_TOKEN_VALIDITY_SECONDS = 60 * 60 * 24 * 30;

    /**
     * 默认的 access_token 的有效时长: 12小时
     */
    public final static int ACCESS_TOKEN_VALIDITY_SECONDS = 60 * 60 * 12;


    protected static long THOUSAND = 1000L;


    private String tokenId;

    private String username;

    private String clientId;

    private String authenticationId;

    private String refreshToken;

    private String tokenType = BEARER_TYPE;

    private int tokenExpiredSeconds = ACCESS_TOKEN_VALIDITY_SECONDS;

    private int refreshTokenExpiredSeconds = REFRESH_TOKEN_VALIDITY_SECONDS;


    public AccessToken() {
    }


    public boolean tokenExpired() {
        final long time = createTime.getTime() + (this.tokenExpiredSeconds * THOUSAND);
        return time < DateUtils.now().getTime();
    }


    public boolean refreshTokenExpired() {
        final long time = createTime.getTime() + (this.refreshTokenExpiredSeconds * THOUSAND);
        return time < DateUtils.now().getTime();
    }


    public long currentTokenExpiredSeconds() {
        if (tokenExpired()) {
            return -1;
        }
        final long time = createTime.getTime() + (this.tokenExpiredSeconds * THOUSAND);
// Path: core/src/main/java/com/monkeyk/os/domain/AbstractDomain.java
// public abstract class AbstractDomain implements Serializable {
// 
// 
//     private static final long serialVersionUID = 7787898374385773471L;
//     /**
//      * The domain create time.
//      */
//     protected Date createTime = DateUtils.now();
// 
//     /**
//      * Domain的业务id
//      */
//     protected String guid;
// 
//     public AbstractDomain() {
//     }
// 
//     public String guid() {
//         return guid;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <T extends AbstractDomain> T guid(String guid) {
//         this.guid = guid;
//         return (T) this;
//     }
// 
//     public Date createTime() {
//         return createTime;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <T extends AbstractDomain> T createTime(Date createTime) {
//         this.createTime = createTime;
//         return (T) this;
//     }
// 
// 
//     @Override
//     public String toString() {
//         return "{" +
//                 "createTime=" + createTime +
//                 ", guid='" + guid + '\'' +
//                 '}';
//     }
// }
// 
// Path: core/src/main/java/com/monkeyk/os/infrastructure/DateUtils.java
// public abstract class DateUtils {
// 
//     /**
//      * Default time format :  yyyy-MM-dd HH:mm:ss
//      */
//     public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
// 
//     /**
//      * Time format :  yyyy-MM-dd HH:mm
//      */
//     public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
//     public static final String TIME_FORMAT = "HH:mm";
// 
//     /**
//      * Default date format
//      */
//     public static final String DATE_FORMAT = "yyyy-MM-dd";
//     /**
//      * Default month format
//      */
//     public static final String MONTH_FORMAT = "yyyy-MM";
//     /**
//      * Default day format
//      */
//     public static final String DAY_FORMAT = "dd";
// 
// 
//     //Date pattern,  demo:  2013-09-11
//     public static final String DATE_PATTERN = "^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}$";
// 
// 
//     private DateUtils() {
//     }
// 
//     /*
//     * 判断是否为日期格式,如: 2016-12-12
//     * */
//     public static boolean isDate(String dateAsText) {
//         return StringUtils.isNotEmpty(dateAsText) && dateAsText.matches(DATE_PATTERN);
//     }
// 
//     public static Date now() {
//         return new Date();
//     }
// 
//     public static String toDateText(Date date) {
//         return toDateText(date, DATE_FORMAT);
//     }
// 
//     public static String toDateText(Date date, String pattern) {
//         if (date == null || pattern == null) {
//             return null;
//         }
//         SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
//         return dateFormat.format(date);
//     }
// 
//     public static Date getDate(String dateText) {
//         return getDate(dateText, DATE_FORMAT);
//     }
// 
// 
//     public static Date getDate(String dateText, String pattern) {
//         SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
//         try {
//             return dateFormat.parse(dateText);
//         } catch (ParseException e) {
//             throw new IllegalStateException("Parse date from [" + dateText + "," + pattern + "] failed", e);
//         }
//     }
// 
//     public static String toDateTime(Date date) {
//         return toDateText(date, DATE_TIME_FORMAT);
//     }
// 
// 
//     /**
//      * Return current year.
//      *
//      * @return Current year
//      */
//     public static int currentYear() {
//         return calendar().get(Calendar.YEAR);
//     }
// 
//     public static Calendar calendar() {
//         return Calendar.getInstance();
//     }
// 
// 
// }


// Path: core/src/main/java/com/monkeyk/os/domain/oauth/AccessToken.java
import com.monkeyk.os.domain.AbstractDomain;
import com.monkeyk.os.infrastructure.DateUtils;

package com.monkeyk.os.domain.oauth;


/**
 * 15-6-20
 * <p/>
 * 定义 access_token 的信息
 *
 * @author Shengzhao Li
 */
public class AccessToken extends AbstractDomain {
    private static final long serialVersionUID = 7336709167855003668L;


    public static final String BEARER_TYPE = "Bearer";


    /**
     * 默认的 refresh_token 的有效时长: 30天
     */
    public final static int REFRESH_TOKEN_VALIDITY_SECONDS = 60 * 60 * 24 * 30;

    /**
     * 默认的 access_token 的有效时长: 12小时
     */
    public final static int ACCESS_TOKEN_VALIDITY_SECONDS = 60 * 60 * 12;


    protected static long THOUSAND = 1000L;


    private String tokenId;

    private String username;

    private String clientId;

    private String authenticationId;

    private String refreshToken;

    private String tokenType = BEARER_TYPE;

    private int tokenExpiredSeconds = ACCESS_TOKEN_VALIDITY_SECONDS;

    private int refreshTokenExpiredSeconds = REFRESH_TOKEN_VALIDITY_SECONDS;


    public AccessToken() {
    }


    public boolean tokenExpired() {
        final long time = createTime.getTime() + (this.tokenExpiredSeconds * THOUSAND);
        return time < DateUtils.now().getTime();
    }


    public boolean refreshTokenExpired() {
        final long time = createTime.getTime() + (this.refreshTokenExpiredSeconds * THOUSAND);
        return time < DateUtils.now().getTime();
    }


    public long currentTokenExpiredSeconds() {
        if (tokenExpired()) {
            return -1;
        }
        final long time = createTime.getTime() + (this.tokenExpiredSeconds * THOUSAND);
        return (time - DateUtils.now().getTime()) / THOUSAND;