001/*
002 *  Copyright 2018 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.odf.cdmfr;
017
018import org.apache.avalon.framework.component.Component;
019import org.apache.avalon.framework.context.Context;
020import org.apache.avalon.framework.context.ContextException;
021import org.apache.avalon.framework.context.Contextualizable;
022import org.apache.avalon.framework.service.ServiceException;
023import org.apache.avalon.framework.service.ServiceManager;
024import org.apache.avalon.framework.service.Serviceable;
025import org.apache.cocoon.components.ContextHelper;
026import org.apache.cocoon.environment.Request;
027import org.apache.cocoon.environment.Response;
028import org.xml.sax.ContentHandler;
029import org.xml.sax.SAXException;
030
031import org.ametys.cms.repository.Content;
032import org.ametys.odf.ODFHelper;
033import org.ametys.odf.program.Program;
034import org.ametys.plugins.repository.AmetysObjectResolver;
035
036/**
037 * Default helper to export a {@link Program} to CDM-fr format.
038 */
039public class ExportCDMfrHelper implements Component, Serviceable, Contextualizable
040{
041    /** Avalon Role */
042    public static final String ROLE = ExportCDMfrHelper.class.getName();
043    
044    /** The name of request parameter to use to get the valid version of content */
045    public static final String REQUEST_PARAM_VALID_LABEL = "validLabel";
046    
047    /** The name of request parameter to set this export for a Ametys application */
048    public static final String REQUEST_PARAM_EXPORT_FOR_AMETYS = "forAmetys";
049    
050    /** The Ametys object resolver */
051    protected AmetysObjectResolver _resolver;
052    /** The component for CDM export */
053    protected ExportCDMfrManager _exportCDMfrManager;
054    /** The Avalon context */
055    protected Context _context;
056    
057    public void service(ServiceManager smanager) throws ServiceException
058    {
059        _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE);
060        _exportCDMfrManager = (ExportCDMfrManager) smanager.lookup(ExportCDMfrManager.ROLE);
061    }
062    
063    public void contextualize(Context context) throws ContextException
064    {
065        _context = context;
066    }
067    
068    /**
069     * Generate the CDM-fr XML export for the current program.
070     * @param contentHandler The content handler
071     * @throws SAXException If an error occurs during sax
072     */
073    public void export(ContentHandler contentHandler) throws SAXException
074    {
075        Program program = _getProgram();
076        
077        _prepareRequest(program);
078        
079        _prepareResponse(program);
080        
081        _doExport(contentHandler, program);
082    }
083    
084    /**
085     * Do export
086     * @param contentHandler The content handler to sax into
087     * @param program the porogram to export
088     * @throws SAXException If an error occurs during sax
089     */
090    protected void _doExport(ContentHandler contentHandler, Program program) throws SAXException
091    {
092        _exportCDMfrManager.generateCDM(contentHandler, program);
093    }
094    
095    /**
096     * Get the program to export
097     * @return the program to export
098     */
099    protected Program _getProgram()
100    {
101        // Get the program from request
102        Request request = _getRequest();
103
104        String programId = request.getParameter("id");
105        Program program = _resolver.resolveById(programId);
106        
107        // Add the program to the request
108        request.setAttribute(Content.class.getName(), program);
109        
110        return program;
111    }
112    
113    /**
114     * Prepare the request before export
115     * @param program the program to export
116     */
117    protected void _prepareRequest(Program program)
118    {
119        Request request = _getRequest();
120        
121        if (request.getParameter(REQUEST_PARAM_VALID_LABEL) != null)
122        {
123            request.setAttribute(ODFHelper.REQUEST_ATTRIBUTE_VALID_LABEL, true);
124        }
125        
126        if (request.getParameter(REQUEST_PARAM_EXPORT_FOR_AMETYS) != null)
127        {
128            request.setAttribute(ExportCDMfrManager.REQUEST_ATTRIBUTE_EXPORT_FOR_AMETYS, true);
129        }
130    }
131    
132    /**
133     * Prepare the response
134     * @param program the program to export
135     */
136    protected void _prepareResponse(Program program)
137    {
138        Response response = ContextHelper.getResponse(_context);
139        response.setHeader("Content-Disposition", "attachment; filename=\"" + program.getCDMId() + ".xml" + "\"");
140    }
141    
142    /**
143     * Get the request
144     * @return the request
145     */
146    protected Request _getRequest()
147    {
148        return ContextHelper.getRequest(_context);
149    }
150}