    001// Copyright 2007, 2008, 2012 The Apache Software Foundation
    002//
    003// Licensed under the Apache License, Version 2.0 (the "License");
    004// you may not use this file except in compliance with the License.
    005// You may obtain a copy of the License at
    006//
    007//     http://www.apache.org/licenses/LICENSE-2.0
    008//
    009// Unless required by applicable law or agreed to in writing, software
    010// distributed under the License is distributed on an "AS IS" BASIS,
    011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012// See the License for the specific language governing permissions and
    013// limitations under the License.
    014
    015package org.apache.tapestry5.internal.services;
    016
    017import javax.servlet.http.Cookie;
    018
    019import org.apache.tapestry5.CookieBuilder;
    020import org.apache.tapestry5.SymbolConstants;
    021import org.apache.tapestry5.commons.util.TimeInterval;
    022import org.apache.tapestry5.http.TapestryHttpSymbolConstants;
    023import org.apache.tapestry5.http.services.Request;
    024import org.apache.tapestry5.ioc.annotations.IntermediateType;
    025import org.apache.tapestry5.ioc.annotations.Symbol;
    026import org.apache.tapestry5.services.Cookies;
    027
    028/**
    029 * Implementation of the {@link org.apache.tapestry5.services.Cookies} service interface.
    030 */
    031public class CookiesImpl implements Cookies
    032{
    033    private final Request request;
    034
    035    private final CookieSource cookieSource;
    036
    037    private final CookieSink cookieSink;
    038
    039    private final String defaultCookiePath;
    040
    041    private final int defaultMaxAge;
    042
    043    /**
    044     * @param request
    045     * @param cookieSource
    046     * @param cookieSink
    047     * @param contextPath
    048     * @param defaultMaxAge
    049     *         default cookie expiration time in milliseconds
    050     */
    051    public CookiesImpl(Request request,
    052
    053                       CookieSource cookieSource,
    054
    055                       CookieSink cookieSink,
    056
    057                       @Symbol(TapestryHttpSymbolConstants.CONTEXT_PATH)
    058                       String contextPath,
    059
    060                       @Symbol(SymbolConstants.COOKIE_MAX_AGE) @IntermediateType(TimeInterval.class)
    061                       long defaultMaxAge)
    062    {
    063        this.request = request;
    064        this.cookieSource = cookieSource;
    065        this.cookieSink = cookieSink;
    066        this.defaultCookiePath = contextPath + "/";
    067        this.defaultMaxAge = (int) (defaultMaxAge / 1000l);
    068    }
    069
    070    public String readCookieValue(String name)
    071    {
    072        Cookie[] cookies = cookieSource.getCookies();
    073
    074        if (cookies == null) return null;
    075
    076        for (Cookie cooky : cookies)
    077        {
    078            if (cooky.getName().equals(name)) return cooky.getValue();
    079        }
    080
    081        return null;
    082    }
    083
    084    public void writeCookieValue(String name, String value)
    085    {
    086        getBuilder(name, value).write();
    087    }
    088
    089    public void writeCookieValue(String name, String value, int maxAge)
    090    {
    091        getBuilder(name, value).setMaxAge(maxAge).write();
    092    }
    093
    094    public void writeCookieValue(String name, String value, String path)
    095    {
    096        getBuilder(name, value).setPath(path).write();
    097    }
    098
    099    public void writeDomainCookieValue(String name, String value, String domain)
    100    {
    101        getBuilder(name, value).setDomain(domain).write();
    102    }
    103
    104    public void writeDomainCookieValue(String name, String value, String domain, int maxAge)
    105    {
    106        getBuilder(name, value).setDomain(domain).setMaxAge(maxAge).write();
    107    }
    108
    109    public void writeCookieValue(String name, String value, String path, String domain)
    110    {
    111        getBuilder(name, value).setPath(path).setDomain(domain).write();
    112    }
    113
    114    public void removeCookieValue(String name)
    115    {
    116        getBuilder(name, null).delete();
    117    }
    118
    119    public CookieBuilder getBuilder(String name, String value)
    120    {
    121        CookieBuilder builder = new CookieBuilder(name, value)
    122        {
    123            @Override
    124            public void write()
    125            {
    126                Cookie cookie = new Cookie(name, value);
    127
    128                cookie.setPath(path == null ? defaultCookiePath : path);
    129
    130                if(domain != null)
    131                    cookie.setDomain(domain);
    132
    133                cookie.setMaxAge(maxAge == null ? defaultMaxAge : maxAge);
    134
    135                cookie.setSecure(secure == null ? request.isSecure() : secure);
    136
    137                cookie.setVersion(version);
    138
    139                if (comment != null)
    140                {
    141                    cookie.setComment(comment);
    142                }
    143
    144                if (httpOnly != null)
    145                {
    146                    cookie.setHttpOnly(httpOnly);
    147                }
    148
    149                cookieSink.addCookie(cookie);
    150            }
    151
    152            @Override
    153            public void delete()
    154            {
    155                setMaxAge(0);
    156
    157                write();
    158            }
    159        };
    160
    161        return builder;
    162    }
    163}