TestAgentServer.java

[java]
/** **** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is WebService Integration Gateway (WSIG).
*
* The Initial Developer of the Original Code is
* Whitestein Technologies AG.
* Portions created by the Initial Developer are Copyright (C) 2004, 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Jozef Nagy (jna at whitestein.com)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.whitestein.wsig.test;

import jade.content.abs.AbsPrimitive;
import jade.content.abs.AbsContentElement;
import jade.content.abs.AbsObject;
import jade.content.lang.sl.SL0Vocabulary;
import jade.content.lang.sl.SLCodec;
import jade.content.lang.Codec.CodecException;
import jade.content.onto.BasicOntology;
import jade.content.onto.OntologyException;
import jade.content.onto.basic.Action;
import jade.core.Agent;
import jade.core.AID;
import jade.core.behaviours.CyclicBehaviour;
import jade.domain.FIPANames;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.FIPAManagementVocabulary;
import jade.domain.FIPAAgentManagement.FIPAManagementOntology;
import jade.domain.FIPAAgentManagement.Property;
import jade.domain.FIPAAgentManagement.Register;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAAgentManagement.Deregister;
import jade.lang.acl.ACLMessage;

import com.whitestein.wsig.Configuration;
import com.whitestein.wsig.fipa.SL0Helper;
import com.whitestein.wsig.translator.FIPASL0ToSOAP;

import org.apache.log4j.Logger;

/**
* @author jna
*
* testing agent as a server.
* A server agent is implemented for testing purpose.
*/
public class TestAgentServer extends Agent {

private String UNNAMED = "_JADE.UNNAMED";
private Logger log = Logger.getLogger(TestAgentServer.class.getName());
public static AID myAID = null;

private SLCodec codec = new SLCodec(0);
private DFAgentDescription dfad = new DFAgentDescription();
public static final String SERVICE_PLUS = "plus";
private int convId = 0;

protected void setup() {
log.info("A TestAgentServer is starting.");

// add behaviour of the Agent
this.addBehaviour( new CyclicBehaviour( this ) {
public void action() {
ACLMessage msg = myAgent.receive();
if ( msg != null ) {
switch ( msg.getPerformative() ) {
case ACLMessage.REQUEST:
doFIPARequest( msg );
break;
default:
// other messages are ignored
break;
}

try {
log.debug("A testAgentServer receives: "
+ SL0Helper.toString(msg) );
}catch ( Exception e ) {
log.error(e);
}

}else{
block();
}
}
} );

// ——————————
// register the agent into the DF

// pripare a message
ACLMessage msg = new ACLMessage( ACLMessage.REQUEST );
AID dfAID = new AID( "df", AID.ISLOCALNAME );
msg.addReceiver( dfAID );
msg.setSender( this.getAID());
msg.setConversationId( "conv_" + convId ++ );
msg.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
msg.setOntology(FIPAManagementVocabulary.NAME);

// pripare a DFAgentDescription
dfad.setName( this.getAID());
dfad.addLanguages( FIPANames.ContentLanguage.FIPA_SL0 );
dfad.addProtocols( FIPANames.InteractionProtocol.FIPA_REQUEST );
ServiceDescription sd;
sd = new ServiceDescription();
sd.setName( SERVICE_PLUS ); // here is the service name
sd.addLanguages( FIPANames.ContentLanguage.FIPA_SL0 );
sd.addProtocols( FIPANames.InteractionProtocol.FIPA_REQUEST );
sd.setType("web-service");
// or set properties
Property p = new Property("type","(set web-service)");
sd.addProperties( p );
dfad.addServices(sd);

//set register’s argument
Register reg = new Register();
reg.setDescription(dfad);

// create registration’s action
Action action = new Action( this.getAID(), reg );

// send the request for registration
try {
getContentManager().registerLanguage( codec );
getContentManager().registerOntology(
FIPAManagementOntology.getInstance());
getContentManager().fillContent(msg, action);
send(msg);
}catch (Exception e) {
// something is wrong
e.printStackTrace();
}

// ——————————

log.debug("A TestAgentServer is started.");
}

protected void takeDown() {
//deregister itself from the DF
AID dfAID = new AID( "df", AID.ISLOCALNAME );
ACLMessage msg = new ACLMessage( ACLMessage.REQUEST );
msg.addReceiver( dfAID ); // Configuration.getInstance().getGatewayAID());
msg.setSender( this.getAID());
msg.setConversationId( "conv_" + convId ++ );
msg.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
msg.setOntology(FIPAManagementVocabulary.NAME);

//set deregister’s argument
Deregister dereg = new Deregister();
dereg.setDescription(dfad);

// create registration’s action
Action action = new Action( this.getAID(), dereg );

try {
getContentManager().registerLanguage( codec );
getContentManager().registerOntology(FIPAManagementOntology.getInstance());
getContentManager().fillContent(msg, action);
send(msg);
}catch (Exception e) {
log.error( e );
}

log.debug("A TestAgentServer is taken down now.");
}

/**
* serves a request
*
* @param acl a request
*/
private void doFIPARequest( ACLMessage acl ) {
ACLMessage resp = acl.createReply();
AbsContentElement ac = null;
AbsObject ao, ao2;
long sum = 0;
String str = "";

// decode the request
try {
ac = codec.decode( BasicOntology.getInstance(), acl.getContent() );
}catch ( CodecException ce ) {
str = "(error CodecException ( " + ce + " ))";
SL0Helper.fillAsNotUnderstood( acl, resp, str );
send(resp);
return;
}

if( null == ac ) {
str = "(error action null)";
SL0Helper.fillAsNotUnderstood( acl, resp, str );
send(resp);
return;
}

if ( ! SL0Vocabulary.ACTION.equalsIgnoreCase( ac.getTypeName()) ) {
str = "(unknown action_format)";
SL0Helper.fillAsNotUnderstood( acl, resp, str );
send(resp);
return;
}else{
// parse the action
ao = FIPASL0ToSOAP.getActionSlot( ac );
if ( null == ao ) {
str = "(unknown action_slot_format)";
SL0Helper.fillAsNotUnderstood( acl, resp, str );
send(resp);
return;
}

// check a service name
String opName = ao.getTypeName();
if ( SERVICE_PLUS.equalsIgnoreCase(opName) ) {
// unnamed parameters are expected
if ( ! FIPASL0ToSOAP.isWithUnnamed(ao) ) {
str = "(unknown (format " + opName + " ))";
SL0Helper.fillAsNotUnderstood( acl, resp, str );
send(resp);
return;
}

// do plus on agruments
String[] name = ao.getNames();
for(int i = 0; i < ao.getCount(); i ++ ) {
// get unnamed slot
ao2 = ao.getAbsObject( UNNAMED+i );
try{
sum += ((AbsPrimitive)ao2).getLong();
}catch(java.lang.ClassCastException cce) {
str = "(error (argument_format " + opName + " at " + i + " ))";
SL0Helper.fillAsNotUnderstood( acl, resp, str );
send(resp);
return;
}
}
resp = SL0Helper.createInformResult( acl, "" + sum );
}else{
str = "(unknown (service " + opName + " ))";
SL0Helper.fillAsNotUnderstood( acl, resp, str );
}
}

send(resp);
}

}
[/java]