1 /**
  2  * 
  3  */
  4 package org.xmlBlaster.test.client;
  5 
  6 import java.util.logging.Logger;
  7 
  8 import junit.framework.TestCase;
  9 
 10 import org.xmlBlaster.client.I_Callback;
 11 import org.xmlBlaster.client.I_XmlBlasterAccess;
 12 import org.xmlBlaster.client.key.PublishKey;
 13 import org.xmlBlaster.client.key.UpdateKey;
 14 import org.xmlBlaster.client.qos.ConnectQos;
 15 import org.xmlBlaster.client.qos.ConnectReturnQos;
 16 import org.xmlBlaster.client.qos.DisconnectQos;
 17 import org.xmlBlaster.client.qos.PublishQos;
 18 import org.xmlBlaster.client.qos.PublishReturnQos;
 19 import org.xmlBlaster.client.qos.UpdateQos;
 20 import org.xmlBlaster.test.Util;
 21 import org.xmlBlaster.util.EmbeddedXmlBlaster;
 22 import org.xmlBlaster.util.Global;
 23 import org.xmlBlaster.util.MsgUnit;
 24 import org.xmlBlaster.util.SessionName;
 25 import org.xmlBlaster.util.XmlBlasterException;
 26 import org.xmlBlaster.util.def.Constants;
 27 import org.xmlBlaster.util.qos.address.Destination;
 28 
 29 /**
 30  * Testing XmlBlasterAccess.request() method.
 31  * <br /> 
 32  * We send a request and expect a response.
 33  * @author Marcel Ruff
 34  */
 35 public class TestRequestResponse extends TestCase {
 36    private static Logger log = Logger.getLogger(TestRequestResponse.class.getName());
 37 
 38    private Global glob;
 39    private EmbeddedXmlBlaster serverThread;
 40    private int serverPort = 9583;
 41    private boolean startEmbedded = true;
 42    
 43    private I_XmlBlasterAccess sender = null;
 44    private final String senderName = "TheDesperate";
 45    private I_XmlBlasterAccess receiver = null;
 46    private final String receiverName = "TheKnowing";
 47 
 48    public void testRequestResponse() {
 49       Global glob = Global.instance();
 50       
 51       try {
 52 
 53          {  // setup the sender client ...
 54             sender = glob.getXmlBlasterAccess();
 55 
 56             ConnectQos qos = new ConnectQos(sender.getGlobal(), senderName, "secret");
 57             ConnectReturnQos conRetQos = sender.connect(qos, null); // Login to xmlBlaster
 58 
 59             log.info("Sender connected to xmlBlaster " + conRetQos.getSessionName().getRelativeName());
 60          }
 61 
 62 
 63          {  // setup the receiver client which processes the request (usually another process) ...
 64             Global globReceiver = glob.getClone(null);
 65             receiver = globReceiver.getXmlBlasterAccess();
 66 
 67             ConnectQos qos = new ConnectQos(receiver.getGlobal(), receiverName, "secret");
 68             ConnectReturnQos conRetQos = receiver.connect(qos, new I_Callback() {
 69                public String update(String cbSessionId, UpdateKey updateKey, byte[] content, UpdateQos updateQos) {
 70                   log.info(receiverName+": Receiving asynchronous message '" + updateKey.getOid() + "' in receiver default handler");
 71                   log.info(receiverName+": Received: " + updateKey.toXml() + "\n <content>" + new String(content) + "</content>" + updateQos.toXml());
 72 
 73                   if (updateKey.isInternal()) return "";
 74                   if (updateQos.isErased()) return "";
 75                   try {
 76                      String tempTopicOid = updateQos.getClientProperty(Constants.JMS_REPLY_TO, ""); // __jms:JMSReplyTo
 77                      log.info(receiverName+": Got request, using topic '" + tempTopicOid + "' for response");
 78 
 79                      // Send reply back ...
 80                      PublishKey pk = new PublishKey(receiver.getGlobal(), tempTopicOid, "text/plain", "1.0");
 81                      PublishQos pq = new PublishQos(receiver.getGlobal());
 82                      MsgUnit msgUnit = new MsgUnit(pk, "On doubt no ultimate truth, my dear.", pq);
 83                      //try { Thread.sleep(8000); } catch (InterruptedException e) { e.printStackTrace(); }
 84                      PublishReturnQos retQos = receiver.publish(msgUnit);
 85                      log.info(receiverName+": Published reply message using temporary topic " + retQos.getKeyOid());
 86                   }
 87                   catch (XmlBlasterException e) {
 88                      log.severe(receiverName+": Sending reply to " + updateQos.getSender() + " failed: " + e.getMessage());
 89                   }
 90                   return "";
 91                }
 92             });  // Login to xmlBlaster, default handler for updates
 93 
 94             log.info("Receiver connected to xmlBlaster " + conRetQos.getSessionName().getRelativeName());
 95          }
 96 
 97          // Send a message to 'receiver' and block for the reply
 98          PublishKey pk = new PublishKey(sender.getGlobal(), "requestForEnlightenment");
 99          PublishQos pq = new PublishQos(sender.getGlobal());
100          pq.addDestination(new Destination(new SessionName(sender.getGlobal(), receiverName)));
101          MsgUnit msgUnit = new MsgUnit(pk, "Tell me the truth!", pq);
102          MsgUnit[] replies = sender.request(msgUnit, 3000, 1);
103          assertEquals("Missing reply message.", 1, replies.length);
104          assertEquals("On doubt no ultimate truth, my dear.", replies[0].getContentStr());
105          log.info(senderName+": Got " + replies.length + " reply :\n" + replies[0].toXml());
106       }
107       catch (XmlBlasterException e) {
108          fail("We have a problem: " + e.getMessage());
109       }
110       finally {
111          if (sender != null && sender.isConnected()) { sender.disconnect(new DisconnectQos(sender.getGlobal())); }
112          if (receiver != null && receiver.isConnected()) { receiver.disconnect(new DisconnectQos(receiver.getGlobal())); }
113       }
114    }
115 
116    /**
117     * @param arg0
118     */
119    public TestRequestResponse(String arg0) {
120       super(arg0);
121    }
122 
123    /* (non-Javadoc)
124     * @see junit.framework.TestCase#setUp()
125     */
126    protected void setUp() throws Exception {
127       super.setUp();
128       this.glob = Global.instance();
129       this.startEmbedded = this.glob.getProperty().get("startEmbedded", this.startEmbedded);
130       if (this.startEmbedded) {
131          glob.init(Util.getOtherServerPorts(serverPort));
132          String[] args = { };
133          glob.init(args);
134          this.serverThread = EmbeddedXmlBlaster.startXmlBlaster(glob);
135          log.info("XmlBlaster is ready for testing");
136       }
137 
138    }
139 
140    /* (non-Javadoc)
141     * @see junit.framework.TestCase#tearDown()
142     */
143    protected void tearDown() throws Exception {
144       super.tearDown();
145       if (this.startEmbedded) {
146          try { Thread.sleep(500L); } catch( InterruptedException i) {} // Wait some time
147          EmbeddedXmlBlaster.stopXmlBlaster(this.serverThread);
148          this.serverThread = null;
149       }
150 
151       // reset to default server port (necessary if other tests follow in the same JVM).
152       Util.resetPorts();
153    }
154 }


syntax highlighted by Code2HTML, v. 0.9.1