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.text.SimpleDateFormat; 020import java.util.Date; 021import java.util.TimeZone; 022 023import org.apache.cocoon.ProcessingException; 024import org.apache.cocoon.generation.AbstractGenerator; 025import org.apache.cocoon.xml.AttributesImpl; 026import org.apache.cocoon.xml.XMLUtils; 027import org.apache.commons.lang.StringUtils; 028import org.xml.sax.SAXException; 029 030import org.ametys.runtime.config.Config; 031 032/** 033 * Base class for all OAI responses. 034 */ 035public abstract class AbstractOAIResponseGenerator extends AbstractGenerator 036{ 037 @Override 038 public final void generate() throws IOException, SAXException, ProcessingException 039 { 040 contentHandler.startDocument(); 041 042 contentHandler.startPrefixMapping("", "http://www.openarchives.org/OAI/2.0/"); 043 contentHandler.startPrefixMapping("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 044 AttributesImpl atts = new AttributesImpl(); 045 atts.addCDATAAttribute("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation", "xsi:schemaLocation", "http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"); 046 XMLUtils.startElement(contentHandler, "OAI-PMH", atts); 047 048 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 049 TimeZone tz = TimeZone.getTimeZone("UTC"); 050 formatter.setTimeZone(tz); 051 XMLUtils.createElement(contentHandler, "responseDate", formatter.format(new Date())); 052 053 doGenerate(); 054 055 XMLUtils.endElement(contentHandler, "OAI-PMH"); 056 057 contentHandler.endDocument(); 058 } 059 060 /** 061 * Actually generates the OAI response. 062 * @throws IOException if an I/O error occurs 063 * @throws SAXException if an error occurs 064 * @throws ProcessingException if an error occurs 065 */ 066 protected abstract void doGenerate() throws IOException, SAXException, ProcessingException; 067 068 /** 069 * Generates SAX events representing an error. 070 * @param errorCode the OAI error code. 071 * @param errorLabel the error label. 072 * @throws SAXException if an error occurs while SAXing the OAI error. 073 */ 074 protected void generateError(String errorCode, String errorLabel) throws SAXException 075 { 076 AttributesImpl atts = new AttributesImpl(); 077 atts.addCDATAAttribute("code", errorCode); 078 XMLUtils.createElement(contentHandler, "error", atts, errorLabel); 079 } 080 081 /** 082 * Returns the base URL of the OAI repository. 083 * @return the base URL of the OAI repository. 084 */ 085 protected String getURL() 086 { 087 String url = StringUtils.removeEndIgnoreCase(Config.getInstance().getValueAsString("cms.url"), "index.html"); 088 089 StringBuilder result = new StringBuilder(url); 090 091 if (!url.endsWith("/")) 092 { 093 result.append('/'); 094 } 095 096 return result.append("_odf/OAI").toString(); 097 } 098}