Java/GWT/Cookie

Материал из Java эксперт
Перейти к: навигация, поиск

Immutable object representing a single browser cookie

   <source lang="java">

/*

* 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]));
           }
       }
   }-*/;

}


      </source>