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}