    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.ioc.annotations.IntermediateType;
    022import org.apache.tapestry5.ioc.annotations.Symbol;
    023import org.apache.tapestry5.ioc.util.TimeInterval;
    024import org.apache.tapestry5.services.Cookies;
    025import org.apache.tapestry5.services.Request;
    026
    027/**
    028 * Implementation of the {@link org.apache.tapestry5.services.Cookies} service interface.
    029 */
    030public class CookiesImpl implements Cookies
    031{
    032    private final Request request;
    033
    034    private final CookieSource cookieSource;
    035
    036    private final CookieSink cookieSink;
    037
    038    private final String defaultCookiePath;
    039
    040    private final int defaultMaxAge;
    041
    042    /**
    043     * @param request
    044     * @param cookieSource
    045     * @param cookieSink
    046     * @param contextPath
    047     * @param defaultMaxAge
    048     *         default cookie expiration time in milliseconds
    049     */
    050    public CookiesImpl(Request request,
    051
    052                       CookieSource cookieSource,
    053
    054                       CookieSink cookieSink,
    055
    056                       @Symbol(SymbolConstants.CONTEXT_PATH)
    057                       String contextPath,
    058
    059                       @Symbol("tapestry.default-cookie-max-age") @IntermediateType(TimeInterval.class)
    060                       long defaultMaxAge)
    061    {
    062        this.request = request;
    063        this.cookieSource = cookieSource;
    064        this.cookieSink = cookieSink;
    065        this.defaultCookiePath = contextPath + "/";
    066        this.defaultMaxAge = (int) (defaultMaxAge / 1000l);
    067    }
    068
    069    public String readCookieValue(String name)
    070    {
    071        Cookie[] cookies = cookieSource.getCookies();
    072
    073        if (cookies == null) return null;
    074
    075        for (Cookie cooky : cookies)
    076        {
    077            if (cooky.getName().equals(name)) return cooky.getValue();
    078        }
    079
    080        return null;
    081    }
    082
    083    public void writeCookieValue(String name, String value)
    084    {
    085        getBuilder(name, value).write();
    086    }
    087
    088    public void writeCookieValue(String name, String value, int maxAge)
    089    {
    090        getBuilder(name, value).setMaxAge(maxAge).write();
    091    }
    092
    093    public void writeCookieValue(String name, String value, String path)
    094    {
    095        getBuilder(name, value).setPath(path).write();
    096    }
    097
    098    public void writeDomainCookieValue(String name, String value, String domain)
    099    {
    100        getBuilder(name, value).setDomain(domain).write();
    101    }
    102
    103    public void writeDomainCookieValue(String name, String value, String domain, int maxAge)
    104    {
    105        getBuilder(name, value).setDomain(domain).setMaxAge(maxAge).write();
    106    }
    107
    108    public void writeCookieValue(String name, String value, String path, String domain)
    109    {
    110        getBuilder(name, value).setPath(path).setDomain(domain).write();
    111    }
    112
    113    public void removeCookieValue(String name)
    114    {
    115        getBuilder(name, null).delete();
    116    }
    117
    118    public CookieBuilder getBuilder(String name, String value)
    119    {
    120        CookieBuilder builder = new CookieBuilder(name, value)
    121        {
    122            @Override
    123            public void write()
    124            {
    125                Cookie cookie = new Cookie(name, value);
    126
    127                cookie.setPath(path == null ? defaultCookiePath : path);
    128
    129                if(domain != null)
    130                    cookie.setDomain(domain);
    131
    132                cookie.setMaxAge(maxAge == null ? defaultMaxAge : maxAge);
    133
    134                cookie.setSecure(secure == null ? request.isSecure() : secure);
    135
    136                cookieSink.addCookie(cookie);
    137            }
    138
    139            @Override
    140            public void delete()
    141            {
    142                setMaxAge(0);
    143
    144                write();
    145            }
    146        };
    147
    148        return builder;
    149    }
    150}