All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.micro.quiz.QuizMasterAgent Maven / Gradle / Ivy

The newest version!
package jadex.micro.quiz;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import jadex.core.ComponentIdentifier;
import jadex.core.IComponent;
import jadex.execution.IExecutionFeature;
import jadex.future.Future;
import jadex.future.IFuture;
import jadex.future.ISubscriptionIntermediateFuture;
import jadex.future.ITerminationCommand;
import jadex.future.SubscriptionIntermediateFuture;
import jadex.micro.annotation.Agent;
import jadex.micro.quiz.model.NewQuizEvent;
import jadex.micro.quiz.model.Question;
import jadex.micro.quiz.model.QuestionEvent;
import jadex.micro.quiz.model.Quiz;
import jadex.micro.quiz.model.QuizEvent;
import jadex.micro.quiz.model.QuizResults;
import jadex.micro.quiz.model.ResultEvent;
import jadex.model.annotation.OnStart;
import jadex.providedservice.impl.service.ServiceCall;

/**
 *  The quiz master agent.
 */
@Agent
public class QuizMasterAgent implements IQuizService
{
	/** The agent. */
	@Agent
	protected IComponent agent;
	
	/** The current participants. */
	protected Map> subscriptions = new HashMap<>();
	
	/** The quiz. */
	protected Quiz quiz;
	
	/** The results. */
	protected Map results = new HashMap();
	
	/** The delay between questions. */
	protected long delay;
	
	/** The current question no. */
	protected int questioncnt = 0;
	
	public QuizMasterAgent()
	{
		this(15000);
	}
	
	public QuizMasterAgent(long delay)
	{
		this.delay = delay;
	}
	
	@OnStart
	public void start()
	{
		this.quiz = createQuiz();
		//System.out.println("master working");
		
		// wait for participants 
		agent.getFeature(IExecutionFeature.class).waitForDelay(5000).get();
		
		while(questioncnt participate()
	{
		SubscriptionIntermediateFuture ret = new SubscriptionIntermediateFuture();
		ComponentIdentifier caller = ServiceCall.getCurrentInvocation().getCaller();
		subscriptions.put(caller, ret);
		
		QuizResults res = results.get(caller);
		if(res==null)
		{
			res = new QuizResults();
			results.put(caller, res);
		}
		
		ret.addIntermediateResult(new NewQuizEvent(quiz.getName(), quiz.getNumberOfQuestions(), delay, quiz.getStart()));
		
		ret.setTerminationCommand(new ITerminationCommand()
		{
			public void terminated(Exception reason)
			{
				subscriptions.remove(caller);
			}
			
			public boolean checkTermination(Exception reason)
			{
				return true;
			}
		});
		return ret;
	}

	/**
	 *  Send an answer.
	 *  @param answer The answer.
	 */
	public IFuture sendAnswer(int answer, int questioncnt)
	{
		ComponentIdentifier caller = ServiceCall.getCurrentInvocation().getCaller();
		
		if(questioncnt!=this.questioncnt && questioncnt+1!=this.questioncnt)
			return new Future(new RuntimeException("Answer only to current questions allowed: "+questioncnt+" "+this.questioncnt));
		
		QuizResults res = results.get(caller);
		
		System.out.println("answer: "+answer+" "+questioncnt+" "+(quiz.getQuestion(questioncnt).getSolution()==answer));
		//System.out.println("antwort: "+(quiz.getQuestion(questioncnt).getSolution()==answer)+" "+answer);
		res.addResult(questioncnt, quiz.getQuestion(questioncnt).getSolution()==answer);
		//System.out.println("res: "+res.size()+" "+quiz.getNumberOfQuestions());
		
		/*if(res.size()==quiz.getNumberOfQuestions())
		{
			SubscriptionIntermediateFuture s = subscriptions.get(caller);
			if(s!=null)
			{
				s.addIntermediateResult(new ResultEvent(res));
				s.setFinished();
				subscriptions.remove(caller);
			}
			else
			{
				System.out.println("not found: "+caller+" "+results+" "+subscriptions);
			}
		}*/
		
		return IFuture.DONE;
	}
	
	/**
	 *  Publish a question to all subscribers.
	 *  @param question The question.
	 */
	public void publishQuestion(Question question, int questioncnt)
	{
		publishEvent(new QuestionEvent(question, questioncnt));
	}
	
	/**
	 *  Publish the results.
	 */
	public void publishResults()
	{
		for(ComponentIdentifier cid: results.keySet())
		{
			QuizResults res = results.get(cid);
			SubscriptionIntermediateFuture s = subscriptions.get(cid);
			s.addIntermediateResult(new ResultEvent(res));
			s.setFinished();
			subscriptions.remove(cid);
		}
	}
	
	/**
	 *  Publish a quiz event.
	 *  @param event The event.
	 */
	public void publishEvent(QuizEvent event)
	{
		for(SubscriptionIntermediateFuture subscription: subscriptions.values())
		{
			subscription.addIntermediateResult(event);
		}
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy