/*
 * #%L
 * Wisdom-Framework
 * %%
 * Copyright (C) 2013 - 2014 Wisdom Framework
 * %%
 * 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.
 * #L%
 */
package org.wisdom.framework.vertx.cookies;

import com.google.common.base.Preconditions;
import io.netty.handler.codec.http.cookie.DefaultCookie;
import org.wisdom.api.cookies.Cookie;
import org.wisdom.api.cookies.Cookies;

/**
 * Utility method to handle cookies.
 */
public class CookieHelper {

    private static final String PATH = ", path=";

    private CookieHelper() {
        //Unused
    }

    /**
     * Converts the Wisdom's cookie to a Netty's cookie.
     *
     * @param cookie the Wisdom's cookie
     * @return the Netty's cookie with the same metadata and content than the input cookie.
     */
    public static DefaultCookie convertWisdomCookieToNettyCookie(Cookie cookie) {
        DefaultCookie nettyCookie = new DefaultCookie(cookie.name(), cookie.value());
        nettyCookie.setMaxAge(cookie.maxAge());
        // Comments are not supported anymore by netty.
        if (cookie.domain() != null) {
            nettyCookie.setDomain(cookie.domain());
        }
        if (cookie.isSecure()) {
            nettyCookie.setSecure(true);
        }
        if (cookie.path() != null) {
            nettyCookie.setPath(cookie.path());
        }
        if (cookie.isHttpOnly()) {
            nettyCookie.setHttpOnly(true);
        }
        return nettyCookie;
    }

    /**
     * Converts the Netty's cookie to a Wisdom's cookie.
     *
     * @param cookie the Netty's cookie
     * @return the Wisdom's cookie with the same metadata and content than the input cookie.
     */
    public static Cookie convertNettyCookieToWisdomCookie(DefaultCookie cookie) {
        Preconditions.checkNotNull(cookie);
        String value = cookie.value();
        // Netty append some data at the end f the cookie:
        // -createdBy=wisdom&at=3+nov.+2013+11%3A52%3A15&___TS=1383475935779, path=/, maxAge=3600s, secure, HTTPOnly
        // We have to remove them
        // TODO Do we really need this ? It was probably related to the cookie encoding issue.
        if (value.contains(PATH)) {
            value = value.substring(0, value.indexOf(PATH));
        }

        Cookie.Builder builder
                = Cookie.builder(cookie.name(), value);

        builder.setMaxAge(cookie.maxAge());

        if (cookie.domain() != null) {
            builder.setDomain(cookie.domain());
        }

        builder.setSecure(cookie.isSecure());

        if (cookie.path() != null) {
            builder.setPath(cookie.path());
        }

        builder.setHttpOnly(cookie.isHttpOnly());

        return builder.build();
    }

    /**
     * Gets the value of the cookie having the given name. The cookie is looked from the given cookies set.
     *
     * @param name    the name of the cookie
     * @param cookies the set of cookie
     * @return the value of the cookie, {@literal null} if there are no cookie with the given name in the cookies set.
     */
    public static String getCookieValue(String name, Cookies cookies) {
        Cookie c = cookies.get(name);
        if (c != null) {
            return c.value();
        }
        return null;
    }
}

@@ -2311,32 +2311,34 @@
 cookie.value();%0A
+//
         // Netty
@@ -2380,16 +2380,18 @@
 cookie:%0A
+//
         
@@ -2499,16 +2499,18 @@
 TTPOnly%0A
+//
         
@@ -2535,16 +2535,18 @@
 ve them%0A
+//
         
@@ -2632,16 +2632,18 @@
  issue.%0A
+//
         
@@ -2666,24 +2666,26 @@
 ns(PATH)) %7B%0A
+//
             
@@ -2729,24 +2729,26 @@
 xOf(PATH));%0A
+//
         %7D%0A%0A 

Remove an old work-around about cookie encoding