// Path: src/main/java/com/mpush/api/connection/Cipher.java
// public interface Cipher {
// 
//     byte[] decrypt(byte[] data);
// 
//     byte[] encrypt(byte[] data);
// 
// }
// 
// Path: src/main/java/com/mpush/security/AesCipher.java
// public final class AesCipher implements Cipher {
//     public final byte[] key;
//     public final byte[] iv;
// 
//     public AesCipher(byte[] key, byte[] iv) {
//         this.key = key;
//         this.iv = iv;
//     }
// 
//     @Override
//     public byte[] decrypt(byte[] data) {
//         return AESUtils.decrypt(data, key, iv);
//     }
// 
//     @Override
//     public byte[] encrypt(byte[] data) {
//         return AESUtils.encrypt(data, key, iv);
//     }
// 
//     @Override
//     public String toString() {
//         return toString(key) + ',' + toString(iv);
//     }
// 
//     public String toString(byte[] a) {
//         StringBuilder b = new StringBuilder();
//         for (int i = 0; i < a.length; i++) {
//             if (i != 0) b.append('|');
//             b.append(a[i]);
//         }
//         return b.toString();
//     }
// 
//     public static byte[] toArray(String str) {
//         String[] a = str.split("\\|");
//         if (a.length != CipherBox.INSTANCE.getAesKeyLength()) {
//             return null;
//         }
//         byte[] bytes = new byte[a.length];
//         for (int i = 0; i < a.length; i++) {
//             bytes[i] = Byte.parseByte(a[i]);
//         }
//         return bytes;
//     }
// }
// 
// Path: src/main/java/com/mpush/util/Strings.java
// public final class Strings {
//     public static final String EMPTY = "";
// 
//     public static boolean isBlank(CharSequence text) {
//         if (text == null || text.length() == 0) return true;
//         for (int i = 0, L = text.length(); i < L; i++) {
//             if (!Character.isWhitespace(text.charAt(i))) return false;
//         }
//         return true;
//     }
// 
//     public static long toLong(String text, long defaultVal) {
//         try {
//             return Long.parseLong(text);
//         } catch (NumberFormatException e) {
//         }
//         return defaultVal;
//     }
// 
//     public static int toInt(String text, int defaultVal) {
//         try {
//             return Integer.parseInt(text);
//         } catch (NumberFormatException e) {
//         }
//         return defaultVal;
//     }
// }


import com.mpush.util.Strings;
import com.mpush.api.connection.Cipher;
import com.mpush.security.AesCipher;
/*
 * (C) Copyright 2015-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Contributors:
 *     ohun@live.cn (夜色)
 */

package com.mpush.session;



/**
 * Created by ohun on 2016/1/25.
 *
 * @author ohun@live.cn (夜色)
 */
public final class PersistentSession {
    public String sessionId;
    public long expireTime;
    public Cipher cipher;

    public boolean isExpired() {
        return expireTime < System.currentTimeMillis();
    }

    public static String encode(PersistentSession session) {
        return session.sessionId
                + "," + session.expireTime
                + "," + session.cipher.toString();
    }

    public static PersistentSession decode(String value) {
        String[] array = value.split(",");
        if (array.length != 4) return null;
        PersistentSession session = new PersistentSession();
        session.sessionId = array[0];
        session.expireTime = Strings.toLong(array[1], 0);
// Path: src/main/java/com/mpush/api/connection/Cipher.java
// public interface Cipher {
// 
//     byte[] decrypt(byte[] data);
// 
//     byte[] encrypt(byte[] data);
// 
// }
// 
// Path: src/main/java/com/mpush/security/AesCipher.java
// public final class AesCipher implements Cipher {
//     public final byte[] key;
//     public final byte[] iv;
// 
//     public AesCipher(byte[] key, byte[] iv) {
//         this.key = key;
//         this.iv = iv;
//     }
// 
//     @Override
//     public byte[] decrypt(byte[] data) {
//         return AESUtils.decrypt(data, key, iv);
//     }
// 
//     @Override
//     public byte[] encrypt(byte[] data) {
//         return AESUtils.encrypt(data, key, iv);
//     }
// 
//     @Override
//     public String toString() {
//         return toString(key) + ',' + toString(iv);
//     }
// 
//     public String toString(byte[] a) {
//         StringBuilder b = new StringBuilder();
//         for (int i = 0; i < a.length; i++) {
//             if (i != 0) b.append('|');
//             b.append(a[i]);
//         }
//         return b.toString();
//     }
// 
//     public static byte[] toArray(String str) {
//         String[] a = str.split("\\|");
//         if (a.length != CipherBox.INSTANCE.getAesKeyLength()) {
//             return null;
//         }
//         byte[] bytes = new byte[a.length];
//         for (int i = 0; i < a.length; i++) {
//             bytes[i] = Byte.parseByte(a[i]);
//         }
//         return bytes;
//     }
// }
// 
// Path: src/main/java/com/mpush/util/Strings.java
// public final class Strings {
//     public static final String EMPTY = "";
// 
//     public static boolean isBlank(CharSequence text) {
//         if (text == null || text.length() == 0) return true;
//         for (int i = 0, L = text.length(); i < L; i++) {
//             if (!Character.isWhitespace(text.charAt(i))) return false;
//         }
//         return true;
//     }
// 
//     public static long toLong(String text, long defaultVal) {
//         try {
//             return Long.parseLong(text);
//         } catch (NumberFormatException e) {
//         }
//         return defaultVal;
//     }
// 
//     public static int toInt(String text, int defaultVal) {
//         try {
//             return Integer.parseInt(text);
//         } catch (NumberFormatException e) {
//         }
//         return defaultVal;
//     }
// }


// Path: src/main/java/com/mpush/session/PersistentSession.java
import com.mpush.util.Strings;
import com.mpush.api.connection.Cipher;
import com.mpush.security.AesCipher;

/*
 * (C) Copyright 2015-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Contributors:
 *     ohun@live.cn (夜色)
 */

package com.mpush.session;



/**
 * Created by ohun on 2016/1/25.
 *
 * @author ohun@live.cn (夜色)
 */
public final class PersistentSession {
    public String sessionId;
    public long expireTime;
    public Cipher cipher;

    public boolean isExpired() {
        return expireTime < System.currentTimeMillis();
    }

    public static String encode(PersistentSession session) {
        return session.sessionId
                + "," + session.expireTime
                + "," + session.cipher.toString();
    }

    public static PersistentSession decode(String value) {
        String[] array = value.split(",");
        if (array.length != 4) return null;
        PersistentSession session = new PersistentSession();
        session.sessionId = array[0];
        session.expireTime = Strings.toLong(array[1], 0);
        byte[] key = AesCipher.toArray(array[2]);