/*
* 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;
import org.drools.mas.util.MessageContentEncoder;
import org.drools.mas.util.MapArgsAdapterHelper;
import org.drools.mas.util.MessageContentFactory;
import org.drools.mas.util.ACLMessageFactory;
import java.util.HashMap;
import org.drools.mas.body.acts.Inform;
import mock.MockFact;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import org.drools.mas.body.content.Action;
import org.drools.mas.body.content.Query;
import org.drools.mas.body.content.Ref;
import org.drools.mas.body.content.Rule;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Collections;
import java.util.Map;
import static junit.framework.Assert.*;
public class TestACLMessage {
@Test
@Ignore
public void testSerializeDeserializeArray() {
XStream json = new XStream(new JettisonMappedXmlDriver());
Object[] test = new Object[] { new String("aaa") , new Integer( 233), new String("bbb"), new String("aaa") };
String js = json.toXML(test);
Object o = json.fromXML(js);
Object[] rec = (Object[]) o;
assertEquals("aaa",rec[0]);
assertEquals(new Integer(233),rec[1]);
assertEquals("bbb",rec[2]);
assertEquals("aaa",rec[3]);
// Unfortunately, XStream cannot deserialize mixed-type arrays in the proper order!!!
}
@Test
public void testSerializeDeserialize() {
ACLMessageFactory factory = new ACLMessageFactory(Encodings.JSON);
Object source = new MockFact("x",24);
ACLMessage msg = factory.newInformMessage("dav","sot",source);
XStream cd = new XStream();
String xml = cd.toXML(msg);
System.out.println(xml);
ACLMessage msg2 = (ACLMessage) cd.fromXML(xml);
MessageContentEncoder.decodeBody(msg2.getBody(), msg2.getEncoding()) ;
// msg2.getBody().decode(msg2.getEncoding());
System.out.println(msg2);
Object target = ((Inform)msg2.getBody()).getProposition().getData();
assertEquals(source,target);
}
// @Test
// public void testJsonInspection() {
// ACLMessageFactory factory = new ACLMessageFactory(Encodings.JSON);
// ACLMessage msg = factory.newInformMessage("dav","sot",new MockFact("x",24));
//
// try {
// String s = msg.inspect("$..name[0]");
// assertEquals("x", s);
// } catch (Exception e) {
// e.printStackTrace();
// fail();
// }
// }
//
//
// @Test
// public void testXpathInspection() {
// ACLMessageFactory factory = new ACLMessageFactory(Encodings.JSON);
// Encodings def = factory.getDefaultEncoding();
// factory.setDefaultEncoding(Encodings.XML);
// ACLMessage msg = factory.newInformMessage("dav","sot",new MockFact("x",24));
// factory.setDefaultEncoding(def);
//
// try {
// String s = msg.inspect("//name");
// assertEquals("x",s);
// } catch (Exception e) {
// e.printStackTrace();
// fail();
// }
// }
@Test
public void testMessageConstruction() {
ACLMessageFactory factory = new ACLMessageFactory(Encodings.JSON);
Object obj = new String("x");
Action act = MessageContentFactory.newActionContent("act",new HashMap<String, Object>());
Query qry = MessageContentFactory.newQueryContent("test",1,2,3);//new Query();
Rule rule = new Rule();
rule.setDrl("when String( this == \"test\" )");
Map<String,Object> map = Collections.emptyMap();
Ref ref = new Ref();
ref.setReferences(MapArgsAdapterHelper.marshal(map));
AgentID[] tgts = new AgentID[0];
ACLMessage msg;
msg = factory.newAcceptProposalMessage("D", "S", act, rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.ACCEPT);
msg = factory.newAgreeMessage("D", "S", act, rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.AGREE);
msg = factory.newCancelMessage("D", "S", act);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.CANCEL);
msg = factory.newCallForProposalMessage("D", "S", act, rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.CALL_FOR_PROPOSAL);
msg = factory.newConfirmMessage("D", "S", obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.CONFIRM);
msg = factory.newDisconfirmMessage("D", "S", obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.DISCONFIRM);
msg = factory.newFailureMessage("D", "S", act, obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.FAILURE);
msg = factory.newInformMessage("D", "S", obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.INFORM);
msg = factory.newInformIfMessage("D", "S", obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.INFORM_IF);
msg = factory.newInformRefMessage("D", "S", ref);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.INFORM_REF);
msg = factory.newNotUnderstoodMessage("D", "S", act, obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.NOT_UNDERSTOOD);
msg = factory.newPropagateMessage("D", "S", tgts, msg, rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.PROPAGATE);
msg = factory.newProposeMessage("D","S", act, rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.PROPOSE);
msg = factory.newProxyMessage("D","S", tgts, msg, rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.PROXY);
msg = factory.newQueryIfMessage("D","S",obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.QUERY_IF);
msg = factory.newQueryRefMessage("D","S",qry);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.QUERY_REF);
msg = factory.newRefuseMessage("D","S", act, obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.REFUSE);
msg = factory.newRejectProposalMessage("D","S", act, act, obj);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.REJECT);
msg = factory.newRequestMessage("D","S",act);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.REQUEST);
msg = factory.newRequestWhenMessage("D","S",act,rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.REQUEST_WHEN);
msg = factory.newRequestWheneverMessage("D","S",act,rule);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.REQUEST_WHENEVER);
msg = factory.newSubscribeMessage("D","S",qry);
assertTrue(checkMessageIntegrity(msg));
assertEquals(msg.getPerformative(), Act.SUBSCRIBE);
}
private static boolean checkMessageIntegrity(ACLMessage msg) {
return msg.getId() != null &&
msg.getId().length() > 0 &&
ACLMessage.DEFAULT_ACL_MESSAGE_TYPE.equals(msg.getMessageType()) &&
msg.getConversationId() != null &&
msg.getConversationId().length() > 0 &&
msg.getSender() != null &&
msg.getReceiver() != null &&
msg.getPerformative() != null &&
msg.getBody() != null;
}
}