001package systems.dmx.core.service;
002
003import com.sun.jersey.spi.container.ContainerRequest;
004
005import javax.ws.rs.core.Cookie;
006
007import java.util.Collection;
008import java.util.HashMap;
009import java.util.Map;
010
011
012
013/**
014 * Cookies obtained from request headers.
015 */
016public class Cookies {
017
018    // ---------------------------------------------------------------------------------------------- Instance Variables
019
020    private Map<String, String> values = new HashMap();
021
022    // ------------------------------------------------------------------------------------------------- Class Variables
023
024    private static final ThreadLocal<ContainerRequest> threadLocalRequest = new ThreadLocal();
025
026    // ---------------------------------------------------------------------------------------------------- Constructors
027
028    private Cookies() {
029    }
030
031    private Cookies(Collection<Cookie> cookies) {
032        for (Cookie cookie : cookies) {
033            values.put(cookie.getName(), cookie.getValue());
034        }
035    }
036
037    // -------------------------------------------------------------------------------------------------- Public Methods
038
039    /**
040     * Returns the value of the cookie for the given name, or throws an exception if no such cookie exists.
041     */
042    public String get(String name) {
043        String value = values.get(name);
044        //
045        if (value == null) {
046            throw new RuntimeException("Missing \"" + name + "\" cookie (cookies=" + values + ")");
047        }
048        //
049        return value;
050    }
051
052    /**
053     * Convenience method to access a long value of the cookie for the given name, or throws an exception
054     * if no such cookie exists.
055     */
056    public long getLong(String name) {
057        try {
058            return Long.parseLong(get(name));
059        } catch (Exception e) {
060            throw new RuntimeException("Getting a long value for the \"" + name + "\" cookie failed", e);
061        }
062    }
063
064    // ---
065
066    /**
067     * Checks if there is a cookie with the given name.
068     */
069    public boolean has(String name) {
070        return values.get(name) != null;
071    }
072
073    // ---
074
075    public static Cookies get() {
076        ContainerRequest request = threadLocalRequest.get();
077        if (request != null) {
078            return new Cookies(request.getCookies().values());
079        } else {
080            return new Cookies();
081        }
082    }
083
084    // ### TODO: define public Cookies interface and hide this internal method
085    public static void set(ContainerRequest request) {
086        threadLocalRequest.set(request);
087    }
088
089    // ---
090
091    @Override
092    public String toString() {
093        return values.toString();
094    }
095}