package com.limegroup.gnutella.archive;
import java.io.IOException;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
class AdvancedContribution extends ArchiveContribution {
private String _identifier;
private String _ftpServer;
private String _ftpPath;
private String _verificationUrl;
private Object _requestLock = new Object();
private ArchiveRequest _request = null;
private void initFtpServer() {
_ftpServer = Archives.getMediaString( getMedia() ) +
"-uploads.archive.org";
}
public AdvancedContribution(String username, String password, String title,
String description, int media)
throws DescriptionTooShortException {
super(username, password, title, description, media);
initFtpServer();
}
public AdvancedContribution(String username, String password, String title,
String description, int media, int collection, int type)
throws DescriptionTooShortException{
super(username, password, title, description, media, collection, type);
initFtpServer();
}
/**
* an advanced contribution requires a description of at least 5 words
*
* @throws DescriptionTooShortException
* If the description is less than 5 words
*/
private static final int DESCRIPTION_MIN_WORDS = 5;
private static final String MIN_WORDS_REGEX;
static {
if ( DESCRIPTION_MIN_WORDS == 1 ) {
MIN_WORDS_REGEX = "\\W*\\w+.*";
} else if ( DESCRIPTION_MIN_WORDS > 1 ) {
MIN_WORDS_REGEX = "\\W*(\\w+\\W+){"
+ Integer.toString( DESCRIPTION_MIN_WORDS - 1 )
+ "}\\w+.*";
} else {
MIN_WORDS_REGEX = ".*";
}
}
private static final Pattern MIN_WORDS_PATTERN =
Pattern.compile( MIN_WORDS_REGEX );
static void checkDescription( String description )
throws DescriptionTooShortException {
if (!MIN_WORDS_PATTERN.matcher( description ).matches()) {
throw new DescriptionTooShortException( description, DESCRIPTION_MIN_WORDS );
}
}
public void setDescription( String description ) throws DescriptionTooShortException {
checkDescription( description );
super.setDescription( description );
}
public String getIdentifier() {
return _identifier;
}
public String getVerificationUrl() {
return _verificationUrl;
}
protected String getFtpServer() {
return _ftpServer;
}
protected String getFtpPath() {
return _ftpPath;
}
protected boolean isFtpDirPreMade() {
return false;
}
public void cancel() {
super.cancel();
synchronized( _requestLock ) {
if ( _request != null ) {
_request.cancel();
}
}
}
public String requestIdentifier(String identifier)
throws IdentifierUnavailableException, BadResponseException,
HttpException, IOException {
final String CREATE_ID_URL = "http://www.archive.org/services/check_identifier.php";
_identifier = null;
// normalize the identifier
String nId = Archives.normalizeName( identifier );
synchronized( _requestLock ) {
_request = new ArchiveRequest( CREATE_ID_URL, new NameValuePair[] {
new NameValuePair( "identifier", nId )
});
}
_request.execute();
final ArchiveResponse response = _request.getResponse();
synchronized( _requestLock ){
_request = null;
}
final String resultType = response.getResultType();
if ( resultType == ArchiveResponse.RESULT_TYPE_SUCCESS ) {
// we're all good now
_ftpPath = _identifier = nId;
// set verification URL
_verificationUrl = "http://www.archive.org/" +
Archives.getMediaString( getMedia() ) + "/" +
Archives.getMediaString( getMedia() ) +
"-details-db.php?collection=" +
Archives.getCollectionString( getCollection() ) +
"&collectionid=" + _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 );
}
}
protected void checkin() throws HttpException, BadResponseException, IOException {
final String CHECKIN_URL = "http://www.archive.org/services/contrib-submit.php";
final String username = getUsername();
if ( username == null ) {
throw new IllegalStateException( "username not set" );
}
if ( _identifier == null ) {
throw new IllegalStateException( "identifier not set" );
}
synchronized( _requestLock ) {
_request = new ArchiveRequest( CHECKIN_URL, new NameValuePair[] {
new NameValuePair( "user_email", username ),
new NameValuePair( "server", getFtpServer() ),
new NameValuePair( "dir", _identifier )
});
}
_request.execute();
final ArchiveResponse response = _request.getResponse();
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 );
}
}
}