/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package org.fcrepo.server.storage.types;
import java.io.File;
import java.io.InputStream;
import org.fcrepo.common.Constants;
import org.fcrepo.server.Context;
import org.fcrepo.server.Server;
import org.fcrepo.server.errors.InitializationException;
import org.fcrepo.server.errors.StreamIOException;
import org.fcrepo.server.storage.ContentManagerParams;
import org.fcrepo.server.storage.ExternalContentManager;
/**
* Referenced Content.
*
* @author Chris Wilper
* @version $Id$
*/
public class DatastreamReferencedContent
extends Datastream {
private static ExternalContentManager s_ecm;
public DatastreamReferencedContent() {
}
@Override
public Datastream copy() {
DatastreamReferencedContent ds = new DatastreamReferencedContent();
copy(ds);
return ds;
}
/**
* Gets the external content manager which is used for the retrieval of
* content.
*
* @return an instance of <code>ExternalContentManager</code>
* @throws Exception is thrown in case the server is not able to find the module.
*/
private ExternalContentManager getExternalContentManager()
throws Exception {
if (s_ecm == null) {
Server server;
try {
server = Server.getInstance(new File(Constants.FEDORA_HOME),
false);
s_ecm = (ExternalContentManager) server
.getModule("org.fcrepo.server.storage.ExternalContentManager");
} catch (InitializationException e) {
throw new Exception(
"Unable to get ExternalContentManager Module: "
+ e.getMessage(), e);
}
}
return s_ecm;
}
/**
* Gets an InputStream to the content of this externally-referenced
* datastream.
*
* <p>The DSLocation of this datastream must be non-null before invoking
* this method.
*
* <p>If successful, the DSMIME type is automatically set based on the web
* server's response header. If the web server doesn't send a valid
* Content-type: header, as a last resort, the content-type is guessed by
* using a map of common extensions to mime-types.
*
* <p>If the content-length header is present in the response, DSSize will
* be set accordingly.
*
* @see org.fcrepo.server.storage.types.Datastream#getContentStream()
*/
@Override
public InputStream getContentStream(Context context) throws StreamIOException {
try {
ContentManagerParams params = new ContentManagerParams(DSLocation);
if (context != null ) {
params.setContext(context);
}
MIMETypedStream stream = getExternalContentManager()
.getExternalContent(params);
DSSize = getContentLength(stream);
return stream.getStream();
} catch (Exception ex) {
throw new StreamIOException("Error getting content stream", ex);
}
}
/**
* Returns the length of the content of this stream.
* @param stream the MIMETypedStream
* @return length the length of the content
*/
public long getContentLength(MIMETypedStream stream) {
long length = 0;
if (stream.header != null) {
for (int i = 0; i < stream.header.length; i++) {
if (stream.header[i].name != null
&& !stream.header[i].name.equalsIgnoreCase("")
&& stream.header[i].name.equalsIgnoreCase("content-length")) {
length = Long.parseLong(stream.header[i].value);
break;
}
}
}
return length;
}
@Override
public boolean isRepositoryManaged() {
return false;
}
}