/*******************************************************************************
* Copyright (c) 2007, 2010 The Planets Project Partners.
*
* All rights reserved. This program and the accompanying
* materials are made available under the terms of the
* Apache License, Version 2.0 which accompanies
* this distribution, and is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package eu.planets_project.tb.impl.data.util;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import eu.planets_project.ifr.core.storage.api.DigitalObjectManager.DigitalObjectNotFoundException;
import eu.planets_project.ifr.core.storage.impl.util.PDURI;
import eu.planets_project.services.datatypes.DigitalObject;
import eu.planets_project.services.datatypes.Metadata;
import eu.planets_project.tb.api.data.util.DigitalObjectRefBean;
/**
* This servlet returns the content stored in the JCR repo for the provided
* digital object id (permanent uri).
*
* @author <a href="mailto:christian.sadilek@ait.ac.at">Christian Sadilek</a>
*/
public class TBDigitalObjectContentResolver extends HttpServlet {
private static final long serialVersionUID = -8269793550349486731L;
private static Log log = LogFactory.getLog(TBDigitalObjectContentResolver.class);
private DataHandlerImpl dh = new DataHandlerImpl();
private static final int BUFFER_SIZE = 4096;
private static final String ID_PARAMETER_NAME = "id";
private static final String MIME_TYPE_METADATA_NAME = "mimeType";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
InputStream is = null;
String id = request.getParameter(ID_PARAMETER_NAME);
try {
if(id==null) throw new DigitalObjectNotFoundException("id is null");
// Fix up any encoding issues:
id = PDURI.encodePlanetsUriStringAsUri(id).toASCIIString();
DigitalObjectRefBean digoRef = dh.get(id);
if(digoRef==null) throw new DigitalObjectNotFoundException("digital object "+id+" not found");
// set the metadata if it's contained within the digital object
DigitalObject object = digoRef.getDigitalObject();
for(Metadata md : object.getMetadata()) {
if(md.getName().equals(MIME_TYPE_METADATA_NAME))
response.setContentType(md.getContent());
}
is = digoRef.getContentAsStream();
// read from input stream and write to client
int bytesRead = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while((bytesRead=is.read(buffer))!=-1){
response.getOutputStream().write(buffer, 0, bytesRead);
}
} catch (DigitalObjectNotFoundException e) {
log.info(e.getMessage(),e);
response.sendError(HttpServletResponse.SC_NOT_FOUND, "object not found with id="+id);
} finally {
if(is!=null) is.close();
}
}
}