/**
*
*/
package org.archive.wayback.replay;
import java.io.IOException;
import java.util.Map;
import org.archive.wayback.core.Resource;
/**
* Virtual {@link Resource} made up from pair of header resource
* and payload resource.
* This class is typically used for binding revisit record and
* revisited (original) resource together, making it look like
* one complete capture.
*/
public class CompositeResource extends Resource {
private final Resource headersResource;
private final Resource payloadResource;
/**
* constructor.
* @param headersResource Resource providing HTTP headers
* (revisit record).
* @param payloadResource Resource providing HTTP response entity
* (revisited original record).
*/
public CompositeResource(Resource headersResource, Resource payloadResource) {
this.headersResource = headersResource;
this.payloadResource = payloadResource;
}
/* (non-Javadoc)
* @see org.archive.wayback.core.Resource#close()
*/
@Override
public void close() throws IOException {
// TODO: should call close on both?
payloadResource.close();
}
/* (non-Javadoc)
* @see org.archive.wayback.core.Resource#getStatusCode()
*/
@Override
public int getStatusCode() {
return headersResource.getStatusCode();
}
/* (non-Javadoc)
* @see org.archive.wayback.core.Resource#getRecordLength()
*/
@Override
public long getRecordLength() {
// mmm, is this right?? maybe this method should not be
// part of public interface of Resource.
return payloadResource.getRecordLength();
}
/* (non-Javadoc)
* @see org.archive.wayback.core.Resource#getHttpHeaders()
*/
@Override
public Map<String, String> getHttpHeaders() {
// revisit record had no HTTP headers in early days.
if (headersResource.getRecordLength() == 0)
return payloadResource.getHttpHeaders();
else
return headersResource.getHttpHeaders();
}
@Override
public void parseHeaders() throws IOException {
// currently this is not supposed to be used.
// it is assumed parseHeaders() is already
// called on each Resource.
headersResource.parseHeaders();
payloadResource.parseHeaders();
}
@Override
public String getHeader(String headerName) {
// revisit record had no HTTP headers in early days.
if (headersResource.getRecordLength() == 0)
return payloadResource.getHeader(headerName);
else
return headersResource.getHeader(headerName);
}
@Override
public void setChunkedEncoding() throws IOException {
payloadResource.setChunkedEncoding();
}
@Override
public int available() throws IOException {
return payloadResource.available();
}
@Override
public void mark(int readlimit) {
payloadResource.mark(readlimit);
}
@Override
public boolean markSupported() {
return payloadResource.markSupported();
}
@Override
public int read() throws IOException {
return payloadResource.read();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return payloadResource.read(b, off, len);
}
@Override
public int read(byte[] b) throws IOException {
return payloadResource.read(b);
}
@Override
public void reset() throws IOException {
payloadResource.reset();
}
@Override
public long skip(long n) throws IOException {
return payloadResource.skip(n);
}
}