/*
* Copyright 2011 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.mas.util;
import org.drools.mas.body.acts.*;
import org.drools.mas.body.content.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import org.drools.mas.ACLMessage;
import org.drools.mas.Act;
import org.drools.mas.AgentID;
import org.drools.mas.Encodings;
/**
ACL Message factory
Build messages corresponding to any standard communication act, as defined by the FIPA standard.
accept-proposal( Action action, Rule condition )
agree( Action action, Rule condition )
cancel( Action action )
call-for-proposal( Action action, Rule precondition )
confirm( Object proposition )
disconfirm( Object proposition )
failure( Action action, Object cause )
inform( Object proposition )
inform-if( Object proposition )
inform-ref( Map references )
not-understood( Object act, Object cause )
propagate( Identity[] targets, ACLMesasge message, Rule condition )
propose( Action act, Rule precondition )
proxy( Identity[] targets, ACLMesasge message, Rule condition )
query-if( Object proposition )
query-ref( Query query )
refuse( Action act, Object cause )
reject-proposal( Action call, Action proposal, Object cause )
request( Action action )
request-when( Action action, Rule condition )
request-whenever( Action action, Rule condition )
subscribe( Query query )
Message content is encoded in string format, either XML or JSON
*/
public class ACLMessageFactory implements Serializable {
private static AtomicLong idCounter = new AtomicLong();
private static AtomicLong convCounter = new AtomicLong();
private static ACLMessageFactory instance;
public static ACLMessageFactory getInstance(){
if(instance == null){
instance = new ACLMessageFactory(Encodings.XML);
}
return instance;
}
private long newId() {
return idCounter.incrementAndGet();
}
private long newConversationId() {
return convCounter.incrementAndGet();
}
private Encodings defaultEncoding = Encodings.XML;
public Encodings getDefaultEncoding() {
return defaultEncoding;
}
public void setDefaultEncoding(Encodings defaultEncoding) {
this.defaultEncoding = defaultEncoding;
}
public ACLMessageFactory(Encodings defEncoding) {
this.setDefaultEncoding(defEncoding);
}
public ACLMessage newMessage() {
return new ACLMessage( UUID.randomUUID().toString()+"-"+newId() );
}
protected ACLMessage newMessage( String sender, String receiver ) {
ACLMessage msg = new ACLMessage();
AgentID senderAgent = new AgentID();
senderAgent.setName( sender );
msg.setSender( senderAgent );
msg.setConversationId( senderAgent.toString() +"-"+ newConversationId());
msg.setId( senderAgent.toString() +"-"+ newId());
List<AgentID> recSet = msg.getReceiver();
AgentID receiverAgent = new AgentID();
receiverAgent.setName( receiver );
recSet.add( receiverAgent );
msg.setEncoding( getDefaultEncoding() );
return msg;
}
protected ACLMessage createReply(ACLMessage inMsg, AgentID sender) {
ACLMessage msg = newMessage();
msg.setEncoding(inMsg.getEncoding());
msg.setSender(sender);
List<AgentID> recSet = new ArrayList<AgentID>();
recSet.add(inMsg.getSender());
msg.setReceiver(recSet);
msg.setConversationId(inMsg.getConversationId());
msg.setInReplyTo(inMsg.getId());
return msg;
}
private boolean setMessageBody(ACLMessage msg, AbstractMessageBody body) {
msg.setPerformative(body.getPerformative());
if (getDefaultEncoding() != Encodings.NONE) {
MessageContentEncoder.encodeBody(body, getDefaultEncoding());
}
msg.setBody(body);
return true;
}
public ACLMessage newAcceptProposalMessage(String sender, String receiver, Action action, Rule condition) {
ACLMessage msg = newMessage(sender, receiver);
AcceptProposal body = new AcceptProposal();
body.setPerformative(Act.ACCEPT);
action.setMsgId(msg.getId());
condition.setMsgId(msg.getId());
body.setAction(action);
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newAgreeMessage(String sender, String receiver, Action action, Rule condition) {
ACLMessage msg = newMessage(sender, receiver);
Agree body = new Agree();
body.setPerformative(Act.AGREE);
action.setMsgId(msg.getId());
condition.setMsgId(msg.getId());
body.setAction(action);
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newCancelMessage(String sender, String receiver, Action action) {
ACLMessage msg = newMessage(sender, receiver);
Cancel body = new Cancel();
body.setPerformative(Act.CANCEL);
action.setMsgId(msg.getId());
body.setAction(action);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newCallForProposalMessage(String sender, String receiver, Action action, Rule condition) {
ACLMessage msg = newMessage(sender, receiver);
CallForProposal body = new CallForProposal();
body.setPerformative(Act.CALL_FOR_PROPOSAL);
action.setMsgId(msg.getId());
condition.setMsgId(msg.getId());
body.setAction(action);
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newConfirmMessage(String sender, String receiver, Object proposition) {
ACLMessage msg = newMessage(sender, receiver);
Confirm body = new Confirm();
body.setPerformative(Act.CONFIRM);
Info info = new Info();
info.setData(proposition);
info.setMsgId(msg.getId());
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newDisconfirmMessage(String sender, String receiver, Object proposition) {
ACLMessage msg = newMessage(sender, receiver);
Disconfirm body = new Disconfirm();
body.setPerformative(Act.DISCONFIRM);
Info info = new Info();
info.setData(proposition);
info.setMsgId(msg.getId());
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newFailureMessage(String sender, String receiver, Action action, Object cause) {
ACLMessage msg = newMessage(sender, receiver);
Failure body = new Failure();
body.setPerformative(Act.FAILURE);
body.setAction(action);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(cause);
body.setAction(action);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newInformMessage(String sender, String receiver, Object proposition) {
ACLMessage msg = newMessage(sender, receiver);
Inform body = new Inform();
body.setPerformative(Act.INFORM);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(proposition);
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newInformIfMessage(String sender, String receiver, Object proposition) {
ACLMessage msg = newMessage(sender, receiver);
InformIf body = new InformIf();
body.setPerformative(Act.INFORM_IF);
Info info = new Info();
info.setData(proposition);
info.setMsgId(msg.getId());
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newInformRefMessage(String sender, String receiver, Ref references) {
ACLMessage msg = newMessage(sender, receiver);
InformRef body = new InformRef();
body.setPerformative(Act.INFORM_REF);
body.setReferences(references);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newNotUnderstoodMessage(String sender, String receiver, Action action, Object cause) {
ACLMessage msg = newMessage(sender, receiver);
NotUnderstood body = new NotUnderstood();
body.setPerformative(Act.NOT_UNDERSTOOD);
body.setAction(action);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(cause);
body.setCause(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newPropagateMessage(String sender, String receiver, AgentID[] targets, ACLMessage innerMsg, Rule condition) {
ACLMessage msg = newMessage(sender, receiver);
Propagate body = new Propagate();
body.setPerformative(Act.PROPAGATE);
body.setTargets(targets);
body.setMessage(msg);
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newProposeMessage(String sender, String receiver, Action action, Rule precondition) {
ACLMessage msg = newMessage(sender, receiver);
Propose body = new Propose();
body.setPerformative(Act.PROPOSE);
action.setMsgId(msg.getId());
body.setAction(action);
body.setCondition(precondition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newProxyMessage(String sender, String receiver, AgentID[] targets, ACLMessage innerMsg, Rule condition) {
ACLMessage msg = newMessage(sender, receiver);
Proxy body = new Proxy();
body.setPerformative(Act.PROXY);
body.setTargets(targets);
body.setMessage(innerMsg);
condition.setMsgId(msg.getId());
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newQueryIfMessage(String sender, String receiver, Object proposition) {
ACLMessage msg = newMessage(sender, receiver);
QueryIf body = new QueryIf();
body.setPerformative(Act.QUERY_IF);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(proposition);
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newQueryRefMessage(String sender, String receiver, Query query) {
ACLMessage msg = newMessage(sender, receiver);
QueryRef body = new QueryRef();
body.setPerformative(Act.QUERY_REF);
query.setMsgId(msg.getId());
body.setQuery(query);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newRefuseMessage(String sender, String receiver, Action action, Object cause) {
ACLMessage msg = newMessage(sender, receiver);
Refuse body = new Refuse();
body.setPerformative(Act.REFUSE);
action.setMsgId(msg.getId());
body.setAction(action);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(cause);
body.setCause(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newRejectProposalMessage(String sender, String receiver, Action call, Action proposal, Object cause) {
ACLMessage msg = newMessage(sender, receiver);
Reject body = new Reject();
body.setPerformative(Act.REJECT);
call.setMsgId(msg.getId());
body.setCall(call);
proposal.setMsgId(msg.getId());
body.setProposal(proposal);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(cause);
body.setCause(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newRequestMessage(String sender, String receiver, Action action) {
ACLMessage msg = newMessage(sender, receiver);
Request body = new Request();
body.setPerformative(Act.REQUEST);
action.setMsgId(msg.getId());
body.setAction(action);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newRequestWhenMessage(String sender, String receiver, Action action, Rule condition) {
ACLMessage msg = newMessage(sender, receiver);
RequestWhen body = new RequestWhen();
body.setPerformative(Act.REQUEST_WHEN);
action.setMsgId(msg.getId());
body.setAction(action);
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newRequestWheneverMessage(String sender, String receiver, Action action, Rule condition) {
ACLMessage msg = newMessage(sender, receiver);
RequestWhenever body = new RequestWhenever();
body.setPerformative(Act.REQUEST_WHENEVER);
action.setMsgId(msg.getId());
condition.setMsgId(msg.getId());
body.setAction(action);
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newSubscribeMessage(String sender, String receiver, Query query) {
ACLMessage msg = newMessage(sender, receiver);
Subscribe body = new Subscribe();
body.setPerformative(Act.SUBSCRIBE);
query.setMsgId(msg.getId());
body.setQuery(query);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithAcceptProposalMessage(ACLMessage origin, AgentID sender, Action action, Rule condition) {
ACLMessage msg = createReply(origin, sender);
AcceptProposal body = new AcceptProposal();
body.setPerformative(Act.ACCEPT);
action.setMsgId(msg.getId());
body.setAction(action);
condition.setMsgId(msg.getId());
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithAgreeMessage(ACLMessage origin, AgentID sender, Action action, Rule condition) {
ACLMessage msg = createReply(origin, sender);
Agree body = new Agree();
body.setPerformative(Act.AGREE);
action.setMsgId(msg.getId());
body.setAction(action);
condition.setMsgId(msg.getId());
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithCancelMessage(ACLMessage origin, AgentID sender, Action action) {
ACLMessage msg = createReply(origin, sender);
Cancel body = new Cancel();
body.setPerformative(Act.CANCEL);
action.setMsgId(msg.getId());
body.setAction(action);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithCallForProposalMessage(ACLMessage origin, AgentID sender, Action action, Rule condition) {
ACLMessage msg = createReply(origin, sender);
action.setMsgId(msg.getId());
condition.setMsgId(msg.getId());
CallForProposal body = new CallForProposal(action, condition);
body.setPerformative(Act.CALL_FOR_PROPOSAL);
body.setAction(action);
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithConfirmMessage(ACLMessage origin, AgentID sender, Object proposition) {
ACLMessage msg = createReply(origin, sender);
Confirm body = new Confirm();
body.setPerformative(Act.CONFIRM);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(proposition);
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithDisconfirmMessage(ACLMessage origin, AgentID sender, Object proposition) {
ACLMessage msg = createReply(origin, sender);
Disconfirm body = new Disconfirm();
body.setPerformative(Act.DISCONFIRM);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(proposition);
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithFailureMessage(ACLMessage origin, AgentID sender, Action action, Object cause) {
ACLMessage msg = createReply(origin, sender);
Failure body = new Failure( );
body.setPerformative(Act.FAILURE);
body.setAction(action);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(cause);
body.setCause(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithInformMessage(ACLMessage origin, AgentID sender, Object proposition) {
ACLMessage msg = createReply(origin, sender);
Inform body = new Inform();
body.setPerformative(Act.INFORM);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(proposition);
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithInformIfMessage(ACLMessage origin, AgentID sender, Object proposition) {
ACLMessage msg = createReply(origin, sender);
InformIf body = new InformIf();
body.setPerformative(Act.INFORM_IF);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(proposition);
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithInformRefMessage(ACLMessage origin, AgentID sender, Ref references) {
ACLMessage msg = createReply(origin, sender);
InformRef body = new InformRef();
body.setPerformative(Act.INFORM_REF);
references.setMsgId(msg.getId());
body.setReferences(references);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithNotUnderstoodMessage(ACLMessage origin, AgentID sender, Action action, Object cause) {
ACLMessage msg = createReply(origin, sender);
NotUnderstood body = new NotUnderstood();
body.setPerformative(Act.NOT_UNDERSTOOD);
body.setAction(action);
Info info = new Info();
info.setData(cause);
info.setMsgId(msg.getId());
body.setCause(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithPropagateMessage(ACLMessage origin, AgentID sender, AgentID[] targets, ACLMessage innerMsg, Rule condition) {
ACLMessage msg = createReply(origin, sender);
Propagate body = new Propagate();
body.setPerformative(Act.PROPAGATE);
body.setTargets(targets);
body.setMessage(innerMsg);
condition.setMsgId(msg.getId());
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithProposeMessage(ACLMessage origin, AgentID sender, Action action, Rule precondition) {
ACLMessage msg = createReply(origin, sender);
Propose body = new Propose();
body.setPerformative(Act.PROPOSE);
action.setMsgId(msg.getId());
body.setAction(action);
precondition.setMsgId(msg.getId());
body.setCondition(precondition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithProxyMessage(ACLMessage origin, AgentID sender, AgentID[] targets, ACLMessage innerMsg, Rule condition) {
ACLMessage msg = createReply(origin, sender);
Proxy body = new Proxy();
body.setPerformative(Act.PROXY);
body.setTargets(targets);
body.setMessage(innerMsg);
condition.setMsgId(msg.getId());
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithQueryIfMessage(ACLMessage origin, AgentID sender, Object proposition) {
ACLMessage msg = createReply(origin, sender);
QueryIf body = new QueryIf();
body.setPerformative(Act.QUERY_IF);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(proposition);
body.setProposition(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithQueryRefMessage(ACLMessage origin, AgentID sender, Query query) {
ACLMessage msg = createReply(origin, sender);
QueryRef body = new QueryRef();
body.setPerformative(Act.QUERY_IF);
query.setMsgId(msg.getId());
body.setQuery(query);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithRefuseMessage(ACLMessage origin, AgentID sender, Action action, Object cause) {
ACLMessage msg = createReply(origin, sender);
Refuse body = new Refuse();
body.setPerformative(Act.REFUSE);
body.setAction(action);
Info info = new Info();
info.setMsgId(msg.getId());
info.setData(cause);
body.setCause(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithRejectProposalMessage(ACLMessage origin, AgentID sender, Action call, Action proposal, Object cause) {
ACLMessage msg = createReply(origin, sender);
Reject body = new Reject();
body.setPerformative(Act.REJECT);
body.setCall(call);
body.setProposal(proposal);
Info info = new Info();
info.setData(cause);
body.setCause(info);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithRequestMessage(ACLMessage origin, AgentID sender, Action action) {
ACLMessage msg = createReply(origin, sender);
Request body = new Request();
body.setPerformative(Act.REQUEST);
action.setMsgId(msg.getId());
body.setAction(action);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithRequestWhenMessage(ACLMessage origin, AgentID sender, Action action, Rule condition) {
ACLMessage msg = createReply(origin, sender);
RequestWhen body = new RequestWhen(action, condition);
body.setPerformative(Act.REQUEST_WHEN);
action.setMsgId(msg.getId());
body.setAction(action);
condition.setMsgId(msg.getId());
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithRequestWheneverMessage(ACLMessage origin, AgentID sender, Action action, Rule condition) {
ACLMessage msg = createReply(origin, sender);
RequestWhenever body = new RequestWhenever();
body.setPerformative(Act.REQUEST_WHENEVER);
action.setMsgId(msg.getId());
body.setAction(action);
condition.setMsgId(msg.getId());
body.setCondition(condition);
setMessageBody(msg, body);
return msg;
}
public ACLMessage newReplyWithSubscribeMessage(ACLMessage origin, AgentID sender, Query query) {
ACLMessage msg = createReply(origin, sender);
Subscribe body = new Subscribe();
body.setPerformative(Act.SUBSCRIBE);
query.setMsgId(msg.getId());
body.setQuery(query);
setMessageBody(msg, body);
return msg;
}
}