All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.scientiamobile.wurflcloud.cache.SimpleCookieCache Maven / Gradle / Ivy

/**
 * Copyright (c) 2015 ScientiaMobile Inc.
 *
 * The WURFL Cloud Client is intended to be used in both open-source and
 * commercial environments. To allow its use in as many situations as possible,
 * the WURFL Cloud Client is dual-licensed. You may choose to use the WURFL
 * Cloud Client under either the GNU GENERAL PUBLIC LICENSE, Version 2.0, or
 * the MIT License.
 *
 * Refer to the COPYING.txt file distributed with this package.
 */
package com.scientiamobile.wurflcloud.cache;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.scientiamobile.wurflcloud.ICloudClientRequest;
import com.scientiamobile.wurflcloud.device.AbstractDevice;
import com.scientiamobile.wurflcloud.device.CookieDevice;
import com.scientiamobile.wurflcloud.device.JsonCookie;

/**
 * Cache implementation using Cookies.
 *
 */
public class SimpleCookieCache extends AbstractWurflCloudCache {

    /**
     * Default cookie cache expiration, in seconds.
     */
    public static final int COOKIE_CACHE_EXPIRATION = 86400;

    private final ObjectMapper mapper = new ObjectMapper();
    
    /**
     * Cookie encoding charset
     */
    private static final String US_ASCII = "US-ASCII";

    @Override
    protected boolean purgeInternal() {
        return true;
    }

    public AbstractDevice getDevice(HttpServletRequest request, ICloudClientRequest client) {
        if (request == null) throw new IllegalArgumentException("request cannot be null");
        AbstractDevice ret = null;
        Cookie[] cookies = null;
        try {
            cookies = request.getCookies();
        } catch (IllegalStateException e) {}
        if (cookies == null) return null;
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            if (cookie.getName().equals(WURFL_COOKIE_NAME)) {
                String value = cookie.getValue();
                try {
                    value = URLDecoder.decode(value, US_ASCII);
                    if (logger.isDebugEnabled()) logger.debug("decoded cookie value: " + value);
                    JsonCookie jc = mapper.readValue(value, JsonCookie.class);
                    long expiration = jc.getDate_set() + COOKIE_CACHE_EXPIRATION;
                    long nowSecs = System.currentTimeMillis() / 1000;
                    if (expiration < nowSecs) {
                        logger.debug("cache expired: " + expiration + "; nowSecs is " + nowSecs);
                        break;
                    }
                    ret = new CookieDevice(jc.getCapabilities(), jc.getId(), client);
                    logger.debug("returning device from cookie: " + cookie.getValue());
                    break;
                } catch (IOException e) {
                    logger.error(e.toString(), e);
                }
            }
        }
        logger.debug("device: " + ret);
        return ret;
    }

    public AbstractDevice getDeviceFromID(String key) {
        return null;
    }

    /**
     * Sets a cookie in the response, with max age default cache expiration.
     *
     * @param response
     * @param key
     * @param device
     * @return
     * @see COOKIE_CACHE_EXPIRATION
     */
    public boolean setDevice(HttpServletResponse response, String key, AbstractDevice device) {
        String cookieVal;
        HashMap capabilitiesMap = new HashMap(device.getCapabilities());
        long nowSecs = System.currentTimeMillis() / 1000;
        JsonCookie jsonCookie = new JsonCookie();
        jsonCookie.setCapabilities(capabilitiesMap);
        jsonCookie.setDate_set(nowSecs);
        jsonCookie.setId(device.getId());
        try {
            cookieVal = mapper.writeValueAsString(jsonCookie);
            logger.debug("cookie value: " + cookieVal);
            cookieVal = URLEncoder.encode(cookieVal, US_ASCII);
            logger.debug("encoded cookie value: " + cookieVal);
        } catch (IOException e) {
            logger.error(e.toString(), e);
            return false;
        }
        Cookie cookie = new Cookie(WURFL_COOKIE_NAME, cookieVal);
        cookie.setMaxAge(COOKIE_CACHE_EXPIRATION);
        if (response != null) {
            response.addCookie(cookie);
            logger.debug(WURFL_COOKIE_NAME + " cookie added to response: " + cookie.getValue());
        } else {
            // TODO: Check message
            logger.warn("Trying to save cookie on a null response. Maybe you're trying to use a CookieCache while querying the cloud with a simple user agent string.");
        }
        return true;
    }

    public boolean setDeviceFromID(String key, AbstractDevice device) {
        return false;
    }

    public void close() {
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy