001/*
002 *  Copyright 2012 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.oai;
017
018import java.io.IOException;
019import java.util.Arrays;
020import java.util.Collection;
021
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.ProcessingException;
026import org.apache.cocoon.environment.ObjectModelHelper;
027import org.apache.cocoon.environment.Request;
028import org.apache.cocoon.xml.XMLUtils;
029import org.xml.sax.SAXException;
030
031import org.ametys.cms.CmsConstants;
032import org.ametys.cms.repository.Content;
033import org.ametys.odf.ODFHelper;
034import org.ametys.odf.ProgramItem;
035import org.ametys.odf.catalog.CatalogsManager;
036import org.ametys.odf.cdmfr.CDMEntity;
037import org.ametys.odf.cdmfr.ExportCDMfrManager;
038import org.ametys.odf.orgunit.RootOrgUnitProvider;
039import org.ametys.odf.program.Program;
040import org.ametys.odf.program.ProgramFactory;
041import org.ametys.plugins.repository.AmetysObjectIterable;
042import org.ametys.plugins.repository.UnknownAmetysObjectException;
043import org.ametys.plugins.repository.query.SortCriteria;
044import org.ametys.plugins.repository.query.expression.Expression;
045import org.ametys.plugins.repository.query.expression.Expression.Operator;
046import org.ametys.plugins.repository.query.expression.OrExpression;
047import org.ametys.plugins.repository.query.expression.StringExpression;
048
049/**
050 * Generator for the <code>GetRecord</code> verb.
051 */
052public class GetRecordGenerator extends AbstractOAIVerbGenerator implements Serviceable
053{
054    private RootOrgUnitProvider _rootOrgUnitProvider;
055    private ExportCDMfrManager _exportCDMfrManager;
056    private ODFHelper _odfHelper;
057    private CatalogsManager _catalogsManager;
058    
059    @Override
060    public void service(ServiceManager serviceManager) throws ServiceException
061    {
062        _rootOrgUnitProvider = (RootOrgUnitProvider) serviceManager.lookup(RootOrgUnitProvider.ROLE);
063        _exportCDMfrManager = (ExportCDMfrManager) serviceManager.lookup(ExportCDMfrManager.ROLE);
064        _odfHelper = (ODFHelper) serviceManager.lookup(ODFHelper.ROLE);
065        _catalogsManager = (CatalogsManager) serviceManager.lookup(CatalogsManager.ROLE);
066    }
067    
068    @Override
069    protected Collection<String> getRequiredParameters()
070    {
071        return Arrays.asList("verb", "identifier", "metadataPrefix");
072    }
073
074    @Override
075    protected Collection<String> getAllowedParameters()
076    {
077        return Arrays.asList("verb", "identifier", "metadataPrefix");
078    }
079
080    @Override
081    protected void generateVerb() throws IOException, SAXException, ProcessingException
082    {
083        Request request = ObjectModelHelper.getRequest(objectModel);
084        String identifier = request.getParameter("identifier");
085        String metadataPrefix = request.getParameter("metadataPrefix");
086        
087        if (!metadataPrefix.equals("cdm") && !metadataPrefix.equals("oai_dc"))
088        {
089            generateError("cannotDisseminateFormat", "The value of the metadataPrefix argument is not supported by the repository.");
090            return;
091        }
092        
093        String prefix = "FRUAI" + _rootOrgUnitProvider.getRoot().getUAICode() + "PR";
094        String code = identifier.startsWith(prefix) ? identifier.substring(prefix.length()) : "";
095        
096        Expression cdmCodeExpr = new StringExpression(CDMEntity.CDM_CODE, Operator.EQ, identifier);
097        Expression codeExpr = new StringExpression(ProgramItem.CODE, Operator.EQ, code);
098        
099        OrExpression codesExpr = new OrExpression(codeExpr, cdmCodeExpr);
100        
101        SortCriteria sortCriteria = new SortCriteria();
102        sortCriteria.addCriterion(Content.ATTRIBUTE_TITLE, true, true);
103        
104        AmetysObjectIterable<Program> programs = _odfHelper.getProgramItems(ProgramFactory.PROGRAM_CONTENT_TYPE, null, _catalogsManager.getDefaultCatalogName(), "fr", codesExpr, sortCriteria);
105        
106        if (!programs.iterator().hasNext())
107        {
108            generateError("idDoesNotExist", "The value of the identifier argument is unknown");
109            return;
110        }
111        
112        Program program = programs.iterator().next();
113        
114        try
115        {
116            String[] labels = program.getAllLabels();
117            
118            if (Arrays.asList(labels).contains(CmsConstants.LIVE_LABEL))
119            {
120                program.switchToLabel(CmsConstants.LIVE_LABEL);
121                XMLUtils.startElement(contentHandler, "GetRecord");
122                
123                RecordHelper.saxProgram(program, contentHandler, metadataPrefix, _exportCDMfrManager);
124                
125                XMLUtils.endElement(contentHandler, "GetRecord");
126            }
127            else
128            {
129                // no "Live" label
130                generateError("idDoesNotExist", "There is no Live version for the identifier");
131            }
132        }
133        catch (UnknownAmetysObjectException e)
134        {
135            // no "Live" label
136            generateError("idDoesNotExist", "There is no Live version for the identifier argument");
137        }
138    }
139}