package com.limegroup.gnutella.archive;
import java.io.IOException;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
class DirectContribution extends ArchiveContribution {
private String _identifier;
private String _ftpServer;
private String _ftpPath;
private String _verificationUrl;
private Object _requestLock = new Object();
private ArchiveRequest _request = null;
public DirectContribution(String username, String password, String title,
String description, int media)
throws DescriptionTooShortException {
super(username, password, title, description, media);
}
public DirectContribution(String username, String password, String title,
String description, int media, int collection, int type)
throws DescriptionTooShortException {
super(username, password, title, description, media, collection, type);
}
public String getIdentifier() {
return _identifier;
}
public String getVerificationUrl() {
return _verificationUrl;
}
protected String getFtpServer() {
return _ftpServer;
}
protected String getFtpPath() {
return _ftpPath;
}
protected boolean isFtpDirPreMade() {
return true;
}
public void cancel() {
super.cancel();
synchronized( _requestLock ) {
if ( _request != null ) {
_request.cancel();
_request = null;
}
}
}
/**
* normalizes identifier and checks with Internet Archive
* if identifier is available.
* throws a IdentifierUnavailableException if the identifier
* is not available
* otherwise, returns normalized identifier
*
* @throws IdentifierUnavailableException
* If the identifier is not available
*
* @throws BadResponseException
* If we get a bad response from Internet Archive
*
* @throws HttpException
* If something bad happens in the http layer
*
* @throws IOException
* If something bad happens during I/O
*
* @throws IllegalStateException
* If java's xml parser configuration is bad
*
*/
public String requestIdentifier(String identifier)
throws IdentifierUnavailableException, BadResponseException,
HttpException, IOException {
final String CREATE_ID_URL = "http://www.archive.org:80/create.php";
_identifier = null;
// normalize the identifier
String nId = Archives.normalizeName( identifier );
ArchiveRequest request = new ArchiveRequest( CREATE_ID_URL, new NameValuePair[] {
new NameValuePair( "xml", "1" ),
new NameValuePair( "user", getUsername() ),
new NameValuePair( "identifier", nId )});
synchronized( _requestLock ) {
_request = request;
}
ArchiveResponse response;
try {
request.execute();
response = request.getResponse();
} finally {
synchronized( _requestLock ){
_request = null;
}
}
final String resultType = response.getResultType();
if ( resultType == ArchiveResponse.RESULT_TYPE_SUCCESS ) {
final String url = response.getUrl();
if ( url.equals( "" ) ) {
throw new BadResponseException( "successful result, but no url given" );
}
final String[] urlSplit = url.split( "/", 2 );
if ( urlSplit.length < 2 ) {
throw new BadResponseException( "No slash (/) present to separate server from path: " + url );
}
// we're all good now
_ftpServer = urlSplit[0];
_ftpPath = "/" + urlSplit[1];
_identifier = nId;
// set verification URL
_verificationUrl = "http://www.archive.org/details/" + _identifier;
return _identifier;
} else if ( resultType == ArchiveResponse.RESULT_TYPE_ERROR ) {
throw new IdentifierUnavailableException( response.getMessage(), nId );
} else {
// unidentified type
throw new BadResponseException ( "unidentified result type:" + resultType );
}
}
/**
*
* @throws HttpException
* If something bad happens in the http layer
*
* @throws IOException
* If something bad happens during I/O
*
* @throws IllegalStateException
* If username or identifier is not set.
*
* @throws BadResponseException
* If the checkin fails
*
*/
protected void checkin() throws HttpException, BadResponseException, IOException {
final String CHECKIN_URL = "http://www.archive.org/checkin.php";
final String username = getUsername();
if ( username == null ) {
throw new IllegalStateException( "username not set" );
}
if ( _identifier == null ) {
throw new IllegalStateException( "identifier not set" );
}
ArchiveRequest request = new ArchiveRequest( CHECKIN_URL, new NameValuePair[] {
new NameValuePair( "xml", "1" ),
new NameValuePair( "user", username ),
new NameValuePair( "identifier", _identifier )
});
synchronized( _requestLock ) {
_request = request;
}
ArchiveResponse response;
try {
request.execute();
response = request.getResponse();
} finally {
synchronized( _requestLock ) {
_request = null;
}
}
final String resultType = response.getResultType();
if ( resultType == ArchiveResponse.RESULT_TYPE_SUCCESS ) {
return;
} else if ( resultType == ArchiveResponse.RESULT_TYPE_ERROR ) {
throw new BadResponseException( "checkin failed: " + response.getMessage() );
} else {
throw new BadResponseException( "unidentified result type:" + resultType );
}
}
}