001/*
002 *  Copyright 2011 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.plugins.explorer.resources.actions;
017
018import java.util.Map;
019
020import org.apache.avalon.framework.parameters.Parameters;
021import org.apache.avalon.framework.service.ServiceException;
022import org.apache.avalon.framework.service.ServiceManager;
023import org.apache.avalon.framework.service.Serviceable;
024import org.apache.cocoon.acting.HttpHeaderAction;
025import org.apache.cocoon.environment.ObjectModelHelper;
026import org.apache.cocoon.environment.Redirector;
027import org.apache.cocoon.environment.Request;
028import org.apache.cocoon.environment.Response;
029import org.apache.cocoon.environment.SourceResolver;
030import org.apache.commons.lang.StringUtils;
031
032import org.ametys.core.util.URIUtils;
033import org.ametys.plugins.explorer.resources.Resource;
034import org.ametys.plugins.explorer.resources.ResourceCollection;
035import org.ametys.plugins.repository.AmetysObject;
036import org.ametys.plugins.repository.AmetysObjectResolver;
037
038/**
039 * This action adds HTTP headers to the response for a ZIP archive
040 */
041public class SetHttpHeaderForArchive extends HttpHeaderAction implements Serviceable
042{
043    private AmetysObjectResolver _resolver;
044
045    @Override
046    public void service(ServiceManager smanager) throws ServiceException
047    {
048        _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE);
049    }
050    
051    @Override
052    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
053    {
054        Map result = super.act(redirector, resolver, objectModel, source, parameters);
055        
056        Request request = ObjectModelHelper.getRequest(objectModel);
057        
058        String name = request.getParameter("name");
059        if (StringUtils.isNotEmpty(name))
060        {
061            name = URIUtils.decode(name);
062        }
063        else if (request.getParameter("file") != null)
064        {
065            // Get the name of first file
066            AmetysObject ao = _resolver.resolveById(request.getParameter("file"));
067            name = ao.getName();
068            if (ao instanceof Resource)
069            {
070                name = name.substring(0, name.lastIndexOf("."));
071            }
072        }
073        else
074        {
075            // Use the folder name
076            String id = request.getParameter("id");
077            ResourceCollection collection = _resolver.resolveById(id);
078            name = collection.getName();
079        }
080        
081        name = name.replaceAll("\\\\", "\\\\\\\\");
082        name = name.replaceAll("\\\"", "\\\\\\\"");
083        
084        Response response = ObjectModelHelper.getResponse(objectModel);
085        
086        response.setHeader("Content-Disposition", "attachment; filename=\"" + name + ".zip\"");
087        
088        return result;
089    }
090}