001/*
002 *  Copyright 2017 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.odfweb.catalog;
017
018import java.util.Map;
019
020import org.apache.avalon.framework.service.ServiceException;
021import org.apache.avalon.framework.service.ServiceManager;
022import org.apache.cocoon.environment.ObjectModelHelper;
023import org.apache.cocoon.environment.Request;
024import org.apache.cocoon.xml.AttributesImpl;
025import org.apache.cocoon.xml.XMLUtils;
026import org.apache.commons.lang3.StringUtils;
027import org.xml.sax.SAXException;
028
029import org.ametys.odf.ProgramItem;
030import org.ametys.odf.program.Program;
031import org.ametys.plugins.odfweb.repository.OdfPageHandler;
032import org.ametys.plugins.odfweb.repository.OdfPageResolver;
033import org.ametys.plugins.repository.AmetysObjectIterable;
034import org.ametys.web.repository.page.Page;
035import org.ametys.web.repository.site.SiteManager;
036
037/**
038 * Generates ODF catalog for ODF-Web
039 * See {@link org.ametys.odf.export.ExportCatalogByLevelsGenerator}
040 *
041 */
042public class ExportCatalogByLevelsGenerator extends org.ametys.odf.export.ExportCatalogByLevelsGenerator
043{
044    /** The ODF Page handler */
045    protected OdfPageHandler _odfPageHandler;
046
047    /** The ODF Page resolver */
048    protected OdfPageResolver _odfPageResolver;
049    
050    /** The site manager */
051    protected SiteManager _siteManager;
052    
053    @Override
054    public void service(ServiceManager smanager) throws ServiceException
055    {
056        super.service(smanager);
057        _odfPageHandler = (OdfPageHandler) smanager.lookup(OdfPageHandler.ROLE);
058        _odfPageResolver = (OdfPageResolver) smanager.lookup(OdfPageResolver.ROLE);
059        _siteManager = (SiteManager) smanager.lookup(SiteManager.ROLE);
060    }
061    
062    @Override
063    protected boolean getParameters(Map<String, String> wsParameters) throws SAXException
064    {
065        Request request = ObjectModelHelper.getRequest(objectModel);
066
067        String site = getParameter(request, "site");
068        wsParameters.put("site", site);
069        
070        String catalog = getParameter(request, "catalog");
071        wsParameters.put("catalog", catalog);
072        
073        String lang = getParameter(request, "lang");
074        wsParameters.put("lang", lang);
075
076        String metadataSet = request.getParameter("metadataSet");
077        if (StringUtils.isBlank(metadataSet))
078        {
079            metadataSet = "main";
080        }
081        wsParameters.put("metadataSet", metadataSet);
082        
083        boolean isValidParameters = site != null && catalog != null && lang != null;
084
085        if (isValidParameters)
086        {
087            Page odfRootPage = _odfPageHandler.getOdfRootPage(site, lang, catalog);
088            if (odfRootPage == null)
089            {
090                XMLUtils.createElement(contentHandler, "error", "No ODF root page on website '" + site + "' for sitemap '" + lang + "' and catalog '" + catalog + "'");
091                isValidParameters = false;
092            }
093            else
094            {
095                String level1 = request.getParameter("level1");
096                String level2 = request.getParameter("level2");
097                
098                if (level1 == null || level2 == null)
099                {
100                    if (level1 == null)
101                    {
102                        level1 = _odfPageHandler.getLevel1Metadata(odfRootPage);
103                    }
104                    
105                    if (level2 == null)
106                    {
107                        level2 = _odfPageHandler.getLevel2Metadata(odfRootPage);
108                    }
109                }
110                
111                if (!_odfClassificationHandler.isEligibleMetadataForLevel(level1, true))
112                {
113                    XMLUtils.createElement(contentHandler, "error", "The metadata " + level1 + " is not an eligible metadata for the export");
114                    isValidParameters = false;
115                }
116                
117                if (!_odfClassificationHandler.isEligibleMetadataForLevel(level2, true))
118                {
119                    XMLUtils.createElement(contentHandler, "error", "The metadata " + level2 + " is not an eligible metadata for the export");
120                    isValidParameters = false;
121                }
122        
123                wsParameters.put("level1", level1);
124                wsParameters.put("level2", level2);
125            }
126        }
127        
128        return isValidParameters;
129    }
130    
131    @Override
132    protected AmetysObjectIterable<Program> getConcernedPrograms(Map<String, String> wsParameters)
133    {
134        Page odfRootPage = _odfPageHandler.getOdfRootPage(wsParameters.get("site"), wsParameters.get("lang"), wsParameters.get("catalog"));
135        return _odfPageHandler.getProgramsWithRestrictions(odfRootPage, wsParameters.get("level1"), null, wsParameters.get("level2"), null, null, null);
136    }
137
138    @Override
139    protected AttributesImpl getContentAttributes(ProgramItem programItem, Program parentProgram, Map<String, String> wsParameters)
140    {
141        String siteName = wsParameters.get("site");
142        String url = _siteManager.getSite(siteName).getUrl();
143        
144        AttributesImpl attrs = super.getContentAttributes(programItem, parentProgram, wsParameters);
145        
146        String path = _odfPageResolver.getProgramItemPagePath(siteName, wsParameters.get("lang"), programItem, parentProgram);
147        attrs.addCDATAAttribute("path", url + "/" + path);
148        
149        return attrs;
150    }
151}