📄 achievereinitiator.java
字号:
if (allResponsesReceived) {
// Set an infite timeout to the replyReceiver.
replyReceiver.setDeadline(MsgReceiver.INFINITE);
ret = ALL_RESPONSES_RECEIVED;
}
}
else {
// Check whether all result notifications have been received
// (this is the case when there are no active sessions).
if (sessions.size() == 0) {
ret = ALL_RESULT_NOTIFICATIONS_RECEIVED;
}
}
return ret;
}
private String[] toBeReset = null;
/**
*/
protected String[] getToBeReset() {
if (toBeReset == null) {
toBeReset = new String[] {
HANDLE_AGREE,
HANDLE_REFUSE,
HANDLE_NOT_UNDERSTOOD,
HANDLE_INFORM,
HANDLE_FAILURE,
HANDLE_OUT_OF_SEQ
};
}
return toBeReset;
}
//#APIDOC_EXCLUDE_END
/**
* This method must return the vector of ACLMessage objects to be
* sent. It is called in the first state of this protocol.
* This default implementation just returns the ACLMessage object
* passed in the constructor. Programmers might prefer to override
* this method in order to return a vector of objects for 1:N conversations
* or also to prepare the messages during the execution of the behaviour.
* @param request the ACLMessage object passed in the constructor
* @return a Vector of ACLMessage objects.
* The values of the slot
* <code>reply-with</code> is ignored and a different value is assigned
* automatically by this class for each receiver.
**/
protected Vector prepareRequests(ACLMessage request) {
Vector l = new Vector(1);
l.addElement(request);
return l;
}
/**
* This method is called every time an <code>agree</code>
* message is received, which is not out-of-sequence according
* to the protocol rules.
* This default implementation does nothing; programmers might
* wish to override the method in case they need to react to this event.
* @param agree the received agree message
**/
protected void handleAgree(ACLMessage agree) {
}
/**
* This method is called every time a <code>refuse</code>
* message is received, which is not out-of-sequence according
* to the protocol rules.
* This default implementation does nothing; programmers might
* wish to override the method in case they need to react to this event.
* @param refuse the received refuse message
**/
protected void handleRefuse(ACLMessage refuse) {
}
/**
* This method is called every time a <code>inform</code>
* message is received, which is not out-of-sequence according
* to the protocol rules.
* This default implementation does nothing; programmers might
* wish to override the method in case they need to react to this event.
* @param inform the received inform message
**/
protected void handleInform(ACLMessage inform) {
}
/**
* This method is called when all the responses have been
* collected or when the timeout is expired.
* The used timeout is the minimum value of the slot <code>replyBy</code>
* of all the sent messages.
* By response message we intend here all the <code>agree, not-understood,
* refuse</code> received messages, which are not
* not out-of-sequence according
* to the protocol rules.
* This default implementation does nothing; programmers might
* wish to override the method in case they need to react to this event
* by analysing all the messages in just one call.
* @param responses the Vector of ACLMessage objects that have been received
**/
protected void handleAllResponses(Vector responses) {
}
/**
* This method is called when all the result notification messages
* have been
* collected.
* By result notification message we intend here all the <code>inform,
* failure</code> received messages, which are not
* not out-of-sequence according
* to the protocol rules.
* This default implementation does nothing; programmers might
* wish to override the method in case they need to react to this event
* by analysing all the messages in just one call.
* @param resultNodifications the Vector of ACLMessage object received
**/
protected void handleAllResultNotifications(Vector resultNotifications) {
}
/**
This method allows to register a user defined <code>Behaviour</code>
in the PREPARE_REQUESTS state.
This behaviour would override the homonymous method.
This method also set the
data store of the registered <code>Behaviour</code> to the
DataStore of this current behaviour.
It is responsibility of the registered behaviour to put the
Vector of ACLMessage objects to be sent
into the datastore at the <code>ALL_REQUESTS_KEY</code>
key.
The values of the slot
<code>reply-with</code> is ignored and a different value is assigned
automatically by this class for each receiver.
@param b the Behaviour that will handle this state
*/
public void registerPrepareRequests(Behaviour b) {
registerPrepareInitiations(b);
}
/**
This method allows to register a user defined <code>Behaviour</code>
in the HANDLE_AGREE state.
This behaviour would override the homonymous method.
This method also set the
data store of the registered <code>Behaviour</code> to the
DataStore of this current behaviour.
The registered behaviour can retrieve
the <code>agree</code> ACLMessage object received
from the datastore at the <code>REPLY_KEY</code>
key.
@param b the Behaviour that will handle this state
*/
public void registerHandleAgree(Behaviour b) {
registerState(b, HANDLE_AGREE);
b.setDataStore(getDataStore());
}
/**
This method allows to register a user defined <code>Behaviour</code>
in the HANDLE_INFORM state.
This behaviour would override the homonymous method.
This method also set the
data store of the registered <code>Behaviour</code> to the
DataStore of this current behaviour.
The registered behaviour can retrieve
the <code>inform</code> ACLMessage object received
from the datastore at the <code>REPLY_KEY</code>
key.
@param b the Behaviour that will handle this state
*/
public void registerHandleInform(Behaviour b) {
registerState(b, HANDLE_INFORM);
b.setDataStore(getDataStore());
}
/**
This method allows to register a user defined <code>Behaviour</code>
in the HANDLE_REFUSE state.
This behaviour would override the homonymous method.
This method also set the
data store of the registered <code>Behaviour</code> to the
DataStore of this current behaviour.
The registered behaviour can retrieve
the <code>refuse</code> ACLMessage object received
from the datastore at the <code>REPLY_KEY</code>
key.
@param b the Behaviour that will handle this state
*/
public void registerHandleRefuse(Behaviour b) {
registerState(b, HANDLE_REFUSE);
b.setDataStore(getDataStore());
}
/**
This method allows to register a user defined <code>Behaviour</code>
in the HANDLE_ALL_RESPONSES state.
This behaviour would override the homonymous method.
This method also set the
data store of the registered <code>Behaviour</code> to the
DataStore of this current behaviour.
The registered behaviour can retrieve
the vector of ACLMessage objects, received as a response,
from the datastore at the <code>ALL_RESPONSES_KEY</code>
key.
@param b the Behaviour that will handle this state
*/
public void registerHandleAllResponses(Behaviour b) {
registerState(b, HANDLE_ALL_RESPONSES);
b.setDataStore(getDataStore());
}
/**
This method allows to register a user defined <code>Behaviour</code>
in the HANDLE_ALL_RESULT_NOTIFICATIONS state.
This behaviour would override the homonymous method.
This method also set the
data store of the registered <code>Behaviour</code> to the
DataStore of this current behaviour.
The registered behaviour can retrieve
the Vector of ACLMessage objects, received as a result notification,
from the datastore at the <code>ALL_RESULT_NOTIFICATIONS_KEY</code>
key.
@param b the Behaviour that will handle this state
*/
public void registerHandleAllResultNotifications(Behaviour b) {
registerLastState(b, HANDLE_ALL_RESULT_NOTIFICATIONS);
b.setDataStore(getDataStore());
}
/**
* reset this behaviour
**/
protected void reinit() {
allResponsesReceived = false;
super.reinit();
}
//#APIDOC_EXCLUDE_BEGIN
/**
Initialize the data store.
**/
protected void initializeDataStore(ACLMessage msg){
super.initializeDataStore(msg);
Vector l = new Vector();
getDataStore().put(ALL_RESPONSES_KEY, l);
l = new Vector();
getDataStore().put(ALL_RESULT_NOTIFICATIONS_KEY, l);
}
//#APIDOC_EXCLUDE_END
protected ProtocolSession getSession(ACLMessage msg, int sessionIndex) {
return new Session();
}
/**
Inner class Session
*/
private static class Session implements ProtocolSession, Serializable {
// Session states
static final int INIT = 0;
static final int POSITIVE_RESPONSE_RECEIVED = 1;
static final int NEGATIVE_RESPONSE_RECEIVED = 2;
static final int RESULT_NOTIFICATION_RECEIVED = 3;
private int state = INIT;
public String getId() {
return null;
}
/**
return true if the received performative is valid with respect to
the current session state.
*/
public boolean update(int perf) {
switch (state) {
case INIT:
switch (perf) {
case ACLMessage.AGREE:
state = POSITIVE_RESPONSE_RECEIVED;
return true;
case ACLMessage.REFUSE:
case ACLMessage.NOT_UNDERSTOOD:
state = NEGATIVE_RESPONSE_RECEIVED;
return true;
case ACLMessage.INFORM:
case ACLMessage.FAILURE:
state = RESULT_NOTIFICATION_RECEIVED;
return true;
default:
return false;
}
case POSITIVE_RESPONSE_RECEIVED:
switch (perf) {
case ACLMessage.INFORM:
case ACLMessage.FAILURE:
state = RESULT_NOTIFICATION_RECEIVED;
return true;
default:
return false;
}
default:
return false;
}
}
public int getState() {
return state;
}
public boolean isCompleted() {
return (state == NEGATIVE_RESPONSE_RECEIVED || state == RESULT_NOTIFICATION_RECEIVED);
}
} // End of inner class Session
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -