Java/GWT/Cookie

Материал из Java эксперт
Версия от 18:01, 31 мая 2010; (обсуждение)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Immutable object representing a single browser cookie

/*
 * Copyright 2006 Robert Hanson <iamroberthanson AT gmail.ru>
 * 
 * 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.
 */
package org.gwtwidgets.client.util;
import java.util.Date;

/**
 * Immutable object representing a single browser cookie. 
 * 
 * @author Brian Glick
 */
public class Cookie
{
    private String name;
    private String value;

    Cookie (String name, String value)
    {
        super();
        this.name = name;
        this.value = value;
    }
    /**
     * Gets the name of the cookie
     * @return
     */
    public String getName ()
    {
        return name;
    }
    /**
     * Get"s the cookie"s value
     * @return
     */
    public String getValue ()
    {
        return value;
    }
    public void write (Date expires)
    {
        CookieUtils.write(this, expires);
    }
}
/////////////////////////////////
/*
 * Copyright 2006 Robert Hanson <iamroberthanson AT gmail.ru>
 * 
 * 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.
 */
package org.gwtwidgets.client.util;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
 * Class that is responsible for reading and writing cookies.
 * 
 * @author Brian Glick
 * @author rhanson
 */
public class CookieUtils {
    /**
     * Creates, sets, and returns the Cookie object
     * @param name
     * @param value
     * @param expires
     * @param path
     * @return the Cookie created or reset
     */
    public static Cookie write (String name, String value, Date expires, String path)
    {
        boolean useExp = false;
        int year = -1, month = -1, day = -1;
        if (expires != null) {
            useExp = true;
            year = expires.getYear() + 1900;
            month = expires.getMonth();
            day = expires.getDate();
        }
        writeNative(name, value, useExp, year, month, day, path);
        return new Cookie(name, value);
    }
    public static Cookie write (String name, String value, Date expires)
    {
        return write(name, value, expires, "/");
    }
    
    private static void writeNative(String name, String value, boolean useExpires, int year, int month, int day)
    {
        writeNative(name, value, useExpires, year, month, day, "/");
    }
    private static native void writeNative(String name, String value, boolean useExpires, int year, int month, int day, String path) /*-{
        var expStr = (useExpires) ? "; expires=" + new Date(year, month, day).toGMTString() : "";
        $doc.cookie = name + "=" + escape(value) + expStr + "; path=" + path;
    }-*/;
    
    /**
     * Erases cookie with given name.
     * @param name
     */
    public static void erase (String name)
    {
        writeNative(name, "", true, 1970, 1, 1);
    }
    /**
     * Gets the value of the cookie with the given name.
     * @param name Name of cookie whose value should be retrieved
     * @return Cookie value or null if cookie is not found
     */
    public static String readValue (String name)
    {
        Cookie c = read(name);
        return c == null ? null : c.getValue();
    }
    
    /**
     * Gets the cookie with the given name.
     * @param name Name of cookie to get.
     * @return Cookie or null if the cookie is not found.
     */
    public static Cookie read (String name)
    {
        String val = getValue(name);
        return (val == null) ? null : new Cookie(name, val);
    }
    /**
     * Tries to load the cookie, but only sets fields if they are found
     * @param name
     * @param c
     */
    private static native String getValue (String name) /*-{
         var start = $doc.cookie.indexOf(name + "=");
        var len = start + name.length + 1;
        if ((!start) && (name != $doc.cookie.substring(0,name.length))) {
            return null;
        }
        if (start == -1) {
            return null;
        }
        var end = document.cookie.indexOf(";",len);
        if (end == -1) {
            end = $doc.cookie.length;
        }
        return unescape($doc.cookie.substring(len,end));
    }-*/;
    
    /**
     * Erase the given cookie
     * @param c
     */
    public static void erase (Cookie c)
    {
        erase(c.getName());
    }
    
    /**
     * Write the given cookie
     * @param c
     */
    public static void write (Cookie c, Date expires)
    {
        write(c.getName(), c.getValue(), expires);
    }
    public static Cookie[] getAll ()
    {
        Map cookies = getCookieMap();
        Cookie[] rVal = new Cookie[cookies.size()];
        int counter = 0;
        for (Iterator i = cookies.keySet().iterator(); i.hasNext(); counter++) {
            String name = (String) i.next();
            rVal[counter] = new Cookie(name, (String) cookies.get(name));
        }
        return rVal;
    }
    private static Map getCookieMap ()
    {
        Map jar = new HashMap();
        fillCookieJar(jar);
        return jar;
    }
    
    private static native void fillCookieJar (Map jar) /*-{
        var cookies = $doc.cookie;
        if (cookies && cookies != "") {
            var cl = cookies.split("; ");
            for (var i = 0; i < cl.length; ++i) {
                var parts = cl[i].split("=");
                jar.@java.util.Map::put(Ljava/lang/Object;Ljava/lang/Object;)(parts[0], unescape(parts[1]));
            }
        }
    }-*/;
}