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; } }