package de.se.buzzer.io;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.List;
import de.se.buzzer.LineContainer;
import de.se.buzzer.RequestBuilder;
import de.se.buzzer.conf.Context;
import de.se.buzzer.enums.RequestState;
import de.se.buzzer.handler.AnswerHandler;
import de.se.buzzer.handler.ContentLoaderInterface;
/**
*
* @author Master
*/
public class RequestHandler implements ContentLoaderInterface {
/** Connection Session ID*/
private long sessionId;
/** Connection to server*/
private MConnection connection;
/** State for Advertisement */
private RequestState state;
/** Wait Time*/
private int waitRequestTimeout = 30; // 30 Sekunden
/** Handler for Request */
private AnswerHandler answerHandler;
/**
* Start the request.
* @param para
*/
public void search(HashMap para) {
/*
* 0. Init
*/
answerHandler = new AnswerHandler(this);
/*
* 1. Connection
*/
try {
connection = new MConnection();
} catch ( UnknownHostException e ) {
state = RequestState.FAIL_OFFLINE;
return;
} catch ( IOException e ) {
state = RequestState.FAIL_F;
return;
}
/*
* 2. Create Session
*/
try {
sessionId = connection.createSession();
} catch ( Exception e ) {
state = RequestState.FAIL_SESSION;
return;
}
/*
* 3. Question
*/
try {
connection.sendQuestion( sessionId, RequestBuilder.generateRequest( para ) );
} catch ( Exception e ) {
state = RequestState.FAIL_SEND_QUSETION;
return;
}
/*
* 4. Answer Ready
*/
try {
long stampTime = System.currentTimeMillis();
while ( !connection.isQuestionReady( sessionId ) ) {
// Timeout
if ( System.currentTimeMillis() - stampTime > (waitRequestTimeout * 1000/*ms*/) ) {
state = RequestState.FAIL_WAIT_TIMEOUT;
return;
}
// Wait for next
Thread.sleep( 250 );
}
} catch ( Exception e ) {
state = RequestState.FAIL_WAIT_FOR_READY;
return;
}
/*
* 5. Anzahl
*/
try {
answerHandler.setCount( connection.readAnswerCount( sessionId ) );
} catch ( Exception e1 ) {
state = RequestState.FAIL_READ_FOR_CONTENT;
return;
}
/*
* 6. Anwort holen
*/
try {
answerHandler.putLines( loadLineContainers( 0 ) );
} catch ( Exception e ) {
state = RequestState.FAIL_READ_FOR_CONTENT;
return;
}
state = RequestState.FIRST_BLOCK_IS_READY;
}
@Override
public List loadLineContainers(int index) throws Exception {
try {
String answer = connection.readContent( sessionId, index /*Default*/, Context.count_max_answer );
return RequestBuilder.prepateContainer( answer );
} catch ( Exception e ) {
throw new Exception();
}
}
/**
* About the Connection / Request
*/
public void close() {
if ( sessionId > 0 )
connection.closeSession( sessionId );
}
/**
* @return
*/
public AnswerHandler getAnswerHandler() {
return answerHandler;
}
/**
* Get State
* @return
*/
public RequestState getRequestState() {
return state;
}
}