Change Log
The FIPAOSFactory is a factory for factories. The mapping for factories is contained within the fipaos-factory.properties. These mappings are used by the FIPAOSFactory to load the default factories that are to be made available to FIPAOS. It is then possible to request the FIPAOSFactory for a factory for a specific implementation. It is then possible to have different implementations of factories for particular configurations of FIPAOS that can alter the components or behaviour of components in a configurable manner.
Better error handling and support for wrapping multiple wrapped exceptions.
Method added for DF registration.
Updated to use the DataMapperFactory.
Contribution from Andres Ederra – hasActiveConversations()
Contributions from Andres Ederra(fix fipa-query), Yun Ding(fix not-understood loop)
Updated to make use of the DatamapperFactory
Updated to use FIPAOSFactory
SetEnvelope() method added
Updated to use FIPAOSFactory
Updated by Ovidiu-Valentin Drugan to handle content-transfer-encoding
Updated by Ovidiu-Valentin Drugan to handle content-transfer-encoding
Updated to use FIPAOSFactory
String-ACL format code removed and moved into fipaos.parser.acl.string.Parser
Base class useful for subscription.
DF specific subscription actions
References to ACLParser removed
References to ACLParser removed
Added setAgentID method
Deprecated get/setAgentName
setPayloadLength() PAYLOAD_ENCODING changed to PAYLOAD_LENGTH
PropertyTemplate
made serializable
Now extends FIPAOSException with the functionality moved to the superclass
Incorporated into the new Datamapping Architecture
Byte-length encoding bug fixed
Reply-with bug fixed – reply-with slot was not being set when parsing a stringified ACL message
Incorporated into the new Datamapping Architecture
Abstract datamapping architecture developed from code contributed by Bob Krause. This is an abstract layer between the data representation and the concrete instance. The inteface presented is marshall and unmarshall and the architecture supports java properties, abstract script (with implementations of bat and sh binders) and XML(see fipaos.parser.databinding package).
References to ACLParser removed
Updated subscription mechanism in the DF to allow agents to subscribe to the DF and be informed of updates to the DF database for agents that register, deregister or modify their DFAgentDescription registered with the DF.
Basic functionality added to provide a task similar to DFSearchTask
Updated to make use of new FIPAOSFactory class to simplify addition of new TransportProvider instances
Timing bug fixed
Modifications to make JDK1.1 compatible
FIPAOS now has its own class loader. This has been created to try and alleviate the problems encountered with setting of the classpath and configuration issues associated with the previous method of setting environment variable in the SetupFIPAOS.bat/sh files.
Configurable aggressive garbage collection added to the AgentLoader.
Concrete implementation that will interact with the datamapper(Script binder) for the StartFIPAOS.bat/sh scripts.
Concrete implementation that will interact with the datamapper(properties binder) for the fipa-os.properties file.
Updated inline with FIPAOSClassloader mechanism.
Updated to use the system property "user.dir" to locate the current directory rather than assuming OS has set current-dir correctly....
This allows better compatibility with the Installer, since the Installer can change the current-directory by simply specifying "-Duser.dir=x" as an option when launching the Wizard
Moved functionality from the Configurator into the Wizard:
Default Agent Profile
Agent Loader
Installation Properties
Aggressive Garbage Collection
Bug fix by Bob Krause.
Updated inline with FIPAOSClassloader mechanism.
populate() and unpopulate() methods added to set/get all properties of an object to/from a Map
· Added getReceiverAID() method to enable easy access to first entry in receivers field.
· Added FIPA_OS_SERIALIZATION as an encoding mechanism.
· Fixed auto-encoding/decoding mechanisms for XC00070F compliance.
New wrapper objects that allow SL-style context to be added to the content of an ACL message. A content action message can now be split into an actor and an action. A content result message can now contain the original action object plus a result object.
Added getDynamicClassPropertyHints() method for use with the DynamicClass.getProperties() mechanism
Added public int hashCode() for obtaining a unique hashCode for an AgentID. This allows AgentID objects to be used correctly inside a Hashtable. When 2 unique AgentID objects are created from equivalent String objects, the hashCodes will be equal and so the AgentID’s will overwrite each other in the Hashtable.
Re-added public constructor for use with AgentLoader
Updated to allow STRING_COMPARE to accept arbitrary objects and use toString() to obtain a Stringified representation to compare.
Deprecated due to introduction of XML data-binding.
Removed all notions of a Conversation occurring between more than two Agents at once, hence simplifying the logic of this class (since an Agent is either the initiator or participant within a conversation, all uses of findParticipant() have been removed).
Multicast is still treated as a special case (since multicasts are assumed not to follow a protocol, these constraints on the Conversation are unnecessary).
Added better support for multicast messages. Removed case-sensitivity for AgentIDs and performatives.
Added functionality to enable notification of message delivery abnormalities to ConversationListener.
Added guards to prevent un-expected NPE's (these are caused by a Conversation object being removed whilst checkState() is being invoked).
Removed deprecated method getDatabase( String name, String classname ). A database must now be created using a name and a database profile object.
Incorporated fixes by Michael Dobisek. Conversation ID wasn't being saved correctly for use when ending the Task.
Updated content of messages to be sent to DF so they use AMA objects rather than String's
Added ability to completely disable DIAGNOSTICS by using the command line switch
-Ddebug.off=true.
Renamed variable _diagnostics_off to __diagnostics_off
Updated to cater for ThreadPool threads (DIAGNOSTICS get the ThreadGroup that they belong to).
Added code to deregister with AMS when shutting down
Added constructor to enable instantiation within a MicroFIPAOS environment.
Synchronized the methods to prevent problems with file sharing between multiple agents.
Added ImmutableHint inner-class to allow representation of the fact than an object is immutable (assumes object takes a single String as an argument to its constructor, and has a toString() method which are related)
Updated to allow messaging events to be propagated using the MessageListener interface.
Added control of thread management to the GUI and "NoDatabase" option to default agent profile.
Created TransportDefinition class to allow easier configuration of transports that do not use an external naming service program (such as Stefan Channing's HTTP transport).
Made JDK1.1 compatibility changes (i.e. updated java.util.Tree constructors to use fipaos.util.Comparators.* as comparators).
Updated so that CORBANAME protocol replaces use of IIOP protocol.
Added code to attempt to resolve IOR, to indicate if an IOR is usable by the JavaIDL implementation.
Updated send() method to accept Message objects rather than ACL messages to enable VisualACLParser to modify envelope parameters.
Made JDK1.1 compatibility changes (i.e. changed from JList.setListData( Vector ) to JList.setListData( Object[] ) )
A new ACL parser implementation has been created that does not rely on JavaCC.
Added a new external HTTP transport that has been contributed by Stefan Channing.
Added the eMarkets tutorial to FIPA-OS. This is an example framework for building electronic marketplaces using the FIPA-OS agent platform.
Updated code to correctly return the number of PingAgents found in initial DF query.
Changed the ping agent response message to use the same ACL encoding (plain or bit-efficient) as the initial query-ref message.
Removed caching of references (now taken care of in MTPBase), and added "live" check into sendMessage().
Updated to use an AgentID instead of a String for the ID of the agent that owns the conversation.
Updated based upon Andrés Ederra's contribution.
Updated to handle use of CORBANAME URL's, and publish its own CORBANAME URL.
The run() method now resets local references to null as soon as possible to improve garbage collection.
Added support for:
Fixed a bug where NotUnderstood handler method did not contain protocol prefix.
Updated built-in test harness to check that the CORBANAME style URL can be handled
No longer blocks. Makes use of the TM timeout facility to provide the same functionality.
Added cloneDataboundObject method to allow decoupling of copied data-bound objects.
Added an XML representation of the FIPA Envelope to support specification XC00085G.
Zeus data-binding is used to convert between the object and XML representations.
The RMIComms implementation has been extended to make use of the Java Secure Socket Extension available from the JavaSoft website (http://www.javasoft.com/), enabling secure agent communication. This can be enabled by specifying the protocol type to be “fipaos-rmi-ssl” rather than “fipaos-rmi” for internal MTP’s used by an Agent.
NOTE: This feature can only be used with Java 2 compatible VM’s.
A new abstract class called DFGUIAgent has been added to support different types of GUIs for DFs. The class (that fully functional DF GUI agents extend) implements basic functionality for subscribing to DFs, caching DF agent descriptions, listing them, adding in new DFs, informing the Agent about DF content changes and cancelling subscription when shutting down.
SwingDFGUIAgent extends DFGUIAgent and provides FIPA-OS a DF GUI implemented with JDK’s Swing classes. This agent provides basic GUI functionality for viewing DF contents by subscribing to home platform DFs and when wanted querying remote platforms, and also viewing agent registrations/modifications/deregistrations.
In order to simplify the process of configuring FIPA-OS installations, a configuration wizard has been created to simplify the most common configuration issues. The Configurator is still bundled since the wizard only provides the ability to configure a sub-set of the options available from the Configurator.
A new feature has been added to the DF to support DFGUIAgent. Agents are now able to subscribe to a DF, and receive updates from the DF every time an agent is registered, modified or deregistered. Subscription only works inside a platform, and uses FIPA’s subscribe protocol.
The AMS has been rewritten using modular Tasks to replace the current monolithic AMSIncomingTask. The AMS supports all the previous supported tasks including register, deregister, modify and search. A new GetDescriptionTask has also been written to handle get-description request. Currently, an empty transport description is returned but this will be addressed in a future release.
Support for XML-specific databinding has been introduced. In the future this will be generalised to provide generic databinding support for a number of content-encodings. (Databinding provides a mechanism for stringifying objects into some content encoding).
The AgentLoader GUI has been revamped to make it more intuitive, and has been updated to safely shutdown Agents when exiting, rather than just killing them immediately. Agent can also be “activated” (i.e. have their activate() method invoked) by double-clicking their name in the Started-Agent list.
Through the incorporation of a new API (fipaos.agent.task.SynchronousTask), Tasks can now be executed synchronously from an Agent implementation, rather than asynchronously.
This hopefully resolves several issues relating to the coupling of Conversation objects, including NullPointerException’s in ConversationManager.checkState(), Conversation.getState(), and the cause of several ProtocolErrorException’s & subsequent intermittent not-understood messages.
Other fixes:
Other improvements:
Decoupled registration callback methods from the actual Task making the call back to enable use of SynchronousTask within these methods.
Added an inner class TopLevelHandlerTask that allows doneX methods to be implemented at the agent level in order to handle completion of tasks that were created at the agent level.
Removed deprecated overloaded agent registration methods.
Added deregistration API calls:
Created a superclass exception FIPAOSException in package fipaos. All future FIPA-OS exceptions will be subclassed under this exception structure.
Created new exceptions for failures in platform registration. The platform registration exception superclass fipaos.platform.RegistrationException has a getExceptionReason() method which allows the programmer to detect a non-critical “agent-already-registered” failure.
Two RegistrationException subclasses have been created to handle DF and AMS registration failure: fipaos.platform.ams.AMSRegistrationException and fipaos.platform.df.DFRegistrationException.
Altered AMSRegistrationTask and DFRegistrationTask to simply invoke doneX on their parent task. This replaces the previous registrationX methods in the agent shell.
Added fipaos.platform.ams.AMSDeregistrationTask and fipaos.platform.df.DFDeregistrationTask to allow agents to easily deregister with the platform agents.
The tutorial agents now override the FIPAOSAgent shutdown() method by using the new agent shell API calls to deregister the agent from the DF and AMS (if registered) before called super.shutdown() to close down the core agent components.
Updated the configuration tool to support the new XML data binding profiles. Added support for editing ProtocolProfile objects to the agent profile tab. Added a new tab to allow editing of the AgentLoader profile.
The max-result search constraint has been implemented in the Directory Facilitator. The max-result constraint specifies the number of results that can be returned to the sender.
Added extra DIAGNOSTICS output to SunIIOPComms / MTPBase to aid interoperability testing and debugging, and added error-strings to compliment Service error-codes. The ACL.toString() method was updated to fix an issue with the format of the ACL message it produced
In order to aid compatibility with various CORBA implementations, the ability to disable the call to org.omg.CORBA.Object._non_existent() has been added when attempting to send a message to a remote ACC using the SunIDLComms MTP. This can be achieved by adding –Dsunidl.use.non.existent=false to the options for the JVM.
The Windows Batch and Unix/Linux SH Scripts have been updated so that they automatically add all files with .jar or .zip extension in the imports directory to the classpath, enabling third-party components to be added to the classpath by simply copying them into this directory.
The requirement for the Linux SH Scripts to be executed in the same directory as the SetupFIPAOS script has also been removed (this assumes that the FIPA-OS “bat” directory is in your path).
The version of the Xerces XML Parser now bundled with FIPA-OS has been upgraded to v1.2.1
To enable a simplified process for reverting the FIPA-OS codebase to work with JDK1.1, a number of classes have been modified to rely only on JDK1.1 classes and methods (this excludes collections).
Updated to automatically change the transport address hostname to an IP address if “localhost” is used, and stubs have been re-built to allow use with JDK1.1 (hence these may not be backwardly compatible with previous FIPA-OS releases).
The RMI NS now persistently stores references to Agents using the SerializationDatabase,
enabling a NS to be restarted after failure without having to restart all of
the Agents on a platform (and hence enabling them to re-register with the NS).
The NS systematically detects “invalid” references after it re-starts, removing
them from the NS (where “invalid” indicates the Agent associated with the reference
is no longer reachable for some reason).
This functionality requires that the RMI-NS is NOT executed within the same
JVM as other Agents, and so no longer automatically starts when required – THE
RMI-NS MUST NOW BE MANUALLY STARTED BEFORE AGENTS CAN COMMUNICATE USING RMI
All of the bug-fixes and efficiency improvements from FIPA-OS v1.3.1 Patch 1 have been incorporated into this release, including improved garbage collection for Task’s, Conversation’s, and the more efficient SerializationDatabase implementation:
Memory leaks involving these components of FIPA-OS have now been plugged - previously the ConversationManager and PlannerScheduler were not archiving Conversations once they were complete. Task's were also not being removed from the TaskManager upon completion. Thanks to Robert E Bruce for alerting us to this problem.
This class was previously maintaining a reference to the last object retrieved from the Queue it was monitoring until the Queue produced another Object, hindering garbage collection.
Some Task's of these Agents were not invoking the done() method upon completion, preventing them from being garbage collected.
This Database implementation previously required the entire DB to be present in memory during a transaction - this has been re-implemented such that this is no longer the case. The trade-off is that each object in the database is now stored in an individual file within the file-system.
When an Agent was shutdown and restarted, sometimes messages wouldn't reach it due to a problem introduced by the caching mechanism of the RMIComms object. The CommMultiplexorService was also mis-using the Map.keySet() method, since it assumed that the Set returned was decoupled from the original Map – this resulted in "missing/unavailable" MTP's in certain circumstances.
The AgentLoader can now operate without a GUI, either through specifying a command-line option of "-nogui", or by detecting that a GUI cannot be opened (i.e. in a Linux/UNIX OS where X-Windows is not available).
The existing PlannerScheduler has been amalgamated into the ConversationManager since the current implementation does nothing more than forward Conversation updates.
The TaskManager has been radically changed internally so that an event-based model is used, rather than the “ad-hoc” messaging mechanisms used previously. The event-types used by the TaskManager can be found in the fipaos.agent.task.event package.
Some of the Task’s within the fipaos.platform.df package were not invoking done() correctly – this has been fixed to enable these Task’s to be garbage collected.
The ability to select whether the AgentLoader’s GUI should start-up has been built into the Configurator, along with the ability to specify the DIAGNOSTICS levels for output to screen and file.
The Configurator GUI labelling has also undergone the following changes to its labels in order to clarify their meaning:
"Internal Platform Addresses" => "Platform Transport Naming Services"
"External Platform Addresses" => "External Transport Naming Services"
"Local Address Location" => "Publish Transport Addresses To"
"Internal Platform Addresses" => "Platform Transport Naming Services"
"Internal Addresses" => "Naming Service URL"
"External Addresses" => "Naming Service URL"
"Addresses" => "Location of published addresses"
"Home Agent Platform" => "Platform name"
Improved error handling has been incorporated into the JESSAgent shell.
The Tutorial Agents have now been split from the main FIPA-OS Distribution in order to prevent updating tutorials holding back releases of FIPA-OS, and reduce the size of the main download for people simply upgrading.
A GUI has been added to the PingAgent to enable the current state of the ping’s the Agent performs to be viewed.
Updated to make use of the updated TaskManager, and incorporates a new sendNotUnderstood() method which allows a reason to be specified.
This class has now been updated to implement the Parser interface in-line with the RDFContentHandler and XMLContentHandler.
Removed deprecated methods from the Task class.
The general efficiency of this component has been addressed through the use of StringBuffer’s to improve concatenation speed, the use of separate queues for output to screen and to file, checking of the level of a println() call BEFORE it is added to a queue and the removal of calls to flush() after every println() call.
The getProfileDirectory() method now ensures that the value returned has a “/” or “\” appended as appropriate for the host OS.
This name change has been made in order to enable first-time users to easily identify which batch/script file should be executed to start a (simple) platform.
FIPAOSAgent, MTS, MTP’s, Service’s, TaskManager, and ConversationManager components have all been updated to improve the de-referencing of objects at Agent shutdown, in order to improve garbage collection of deceased Agents.
Bug fixes to the ACC bootstrapping code, which previously prevented initial recovery of remote platform addresses over HTTP.
The VisualACLParser and IOTestAgent classes have been re-written to improve the quality of there code, and remove a number of bugs in the UI (including the inability to save).
Minor modifications done to ensure that the FIPAManagement objects constructed satisfy the mandatory attribute requirements.
A new method getAgentState has been added to FIPAOSAgent to
return the state of the agent. Currently, only 2 states are supported: active
and unknown.
The FIPAOSAgent String instance variable _db_class_name has been replaced by a DatabaseProfile instance variable _database_profile. This change fixes the problem with agents ignoring the database location
profile parameter.
The Exception handling for done methods and handle methods has been improved so that Exceptions are caught and displayed at diagnostics level 3.
The ConversationManager constructor now takes a DatabaseProfile passed from the FIPAOSAgent instead of a String containing the database class name. This change fixes the problem with agents ignoring the database location profile parameter.
The PlannerScheduler constructor now takes a DatabaseProfile passed from the ConversationManager instead of a String containing the database class name. This change fixes the problem with agents ignoring the database location profile parameter.
Changed AgentManagementSystem to reflect the use of a DatabaseProfile instead of just the database class name in order to support correct use of database locations.
The DatabaseFactory method getDatabase(String name, DatabaseProfile profile) now correctly uses the database location from the profile.
The DatabaseObject now extends Serializable.
Two improvements have been made to this class:
The profile wrapper class "AgentProfile" has been updated to allow the configuration tool to edit the default agent profile.
The configuration tool now uses the correct separator for
the ACC database location on a non-Windows OS.
The configuration tool now displays the last known location instead of an empty
box when trying to locate the configuration files
The configuration tool now allows the configuration of the default agent profile
"default.profile". The user can set the internal platform addresses,
database location, and database type to be used by agents that do not have their
own profile.
The Loader GUI polls the state of the agents stored in the Agent Loader once every 5 seconds to remove agents that have been shutdown.
The FIPA Management objects in the package fipaos.ont.fipa.fipaman should now throw an IlegalArgument exception when a mandatory attribute is missing.
A new platform-independant installer has been produced and incorporated into the distribution as an alternative to the plain ZIP and GZ archives
The following two packages have moved:
fipaos.fipa => fipaos.ont.fipa
fipaos.ont.fipaman => fipaos.ont.fipa.fipaman
Some files that were previously in the original packages have changed package also, and some have been removed due to updates to meet the FIPA 2000 specifications (see below). New classes (such as Envelope, ACL and others) have been added to represent the relevant FIPA-defined objects within FIPA-OS.
In addition, the following packages have moved:
fipaos.comm => fipaos.mts
Tutorial agents have been adapted to use the new FIPA Management objects and changes made due to package restructuring.
The underlying Agent transport service has been upgraded to support a layered/stack model for "services" that interact/modify incoming/outgoing messages, and has been upgraded to support the FIPA XC00067B (Message Transport Service) and XC00075C (IIOP Message Transport Protocol) specifications. In-line with the FIPA 2000 specification, the comm package has been renamed to mts (Message Transport Service).
Each MTP now has a transport-level address in the form of a URL, in order to simplify configuration of transports.
Usage of Tasks and the TaskManager has been simplified through the automation of several tasks (such as registration of tasks against conversations, and initialisation of references to the TaskManager), and the addition of the notion of child-tasks. Tutorial 2 highlights use of the enhanced functionality.
Due to changes within the FIPA-OS architecture, the information required from the platform.profile, acc.profile and various Agent profiles has changed. The most noticeable difference is that URL's are now used to specify transport specific details (such as the location of the NS), and that Agents no longer required to have a specialised profile (a default profile is loaded in the case where an Agent does not have a specific profile).
A SLParser has been written to handle SL Content parsing (SL grammar based on XC0008D). Parser was written using JavaCC and provides several public methods for parsing SL Content at different levels:
Public Methods
All FIPA Management objects have been re-written according to FIPA 2000 standard as specified in XC00023F. All FIPA Management objects use the SL Parser for parsing and are moved to the package ont.fipa.fipaman.
The data type mapping used for the implementation is as follows:
Data Type |
Java Type |
Word |
java.lang.String |
String |
java.lang.String |
Boolean |
java.lang.Boolean |
Set |
java.util.Set |
Sequence |
java.util.List |
DirectoryFacilitator has been rewritten to use the Task interface design mechanism. Four tasks have been written for DF that include RegisterTask, DeregisterTask, ModifyTask and SearchTask. All the tasks can be found in the platform.df package.
The FIPA 2000 specification has demoted the ACC from the status of Agent, hence the AgentCommunicationChannelAgent has been removed, and replaced by an AgentCommunicationChannel class in the fipaos.mts.service package
The boot-strapping mechanisms have been revised to include the publishing of multiple transport addresses by an ACC, to enable more robust inter-platform communication.
The new version of JessAgent will be fundamentally different from the current version, and most of the API has been changed. This change takes advantage of the JESS OO Java API and make the JessAgent easier and more efficient to use.
In this version, JessAgent will no longer be a stand-alone agent, so to be able to get JESS functionality, agents will extend JessAgent (that extend FIPAOSAgent). The main reason for this change is that appears to be more appropriate to enable each agent requiring JESS functionality to have their own knowledge base unique to them that they can manipulate and access freely in preference to supporting a single "guru" agent.
There is a new tutorial agent called FactorialAgent, that will demonstrate the JessAgent functionality. A tutorial on how to use these is also included.
The database interface class has been updated to correct a typing mistake in a method signature and to add an overrided version of a method. The class is at : fipaos.skill.db.Database.
· void removeObject( String unique_id ) – allows an object to be removed from a database by specifying its unique identifier.
· void deleteRelation( String relation ) – renamed from deleteReleation.
These changes have been reflected in the following classes that implement the database interface :
fipaos.skill.db.memorydatabase.MemoryDatabase
fipaos.skill.db.memorydatabase.SerializationDatabase
A number of methods have been added to this class in order to provide in-built support for the String-Literal-Encoding and Byte-Length-Encoding mechanisms for content encoding.
· STRINGLITERAL_ENCODING – Specifies that the content should be encoded as a String-Literal
· BYTELENGTH_ENCODING – Specifies that the content should be encoded using Byte-Length-Encoding
· void setContent( String content, int encode )– Set the content of the message, and encodes it using the specified method (as defined by the new constants).
· String getContent()– Get the content of the message, and decodes it if it appears to be encoded in a known encoding (i.e. String-Literal or Byte-Length encodings).
· Updated code so concatenation of Strings is changed to Strings being built via the use of StringBuffers. This is to increase the speed and efficiency of code.
· Updated code so concatenation of Strings is changed to Strings being built via the use of StringBuffers. This is to increase the speed and efficiency of code.
· IORViewer tool now supports viewing IORs directly from a URL. This allows IORs on a web server to be viewed without having to save them to a file first.
The state package and classes of FIPA-OS have now been renamed to Task. This is to reflect the intended use of the classes and to avoid confusion with state machines.
· void forward( ACLMessage ) throws MessageSenderException – forwards an ACL message to its target agent. This should be used instead of _sm.forward(acl).
· ACLMessage getNewConversation( String ) – this returns an ACL message that is the first message of a new conversation with the specified protocol. This should be used instead of _sm.getNewConversation(protocol).
· ACLMessage void setContent( String content, int encode ) -sets the content of the ACLMessage to the specified content using the specified encoding mechanism. The encoding can be on of the ACLMessage static variables NO_ENCODING, STRINGLITERAL_ENCODING, BYTELENGTH_ENCODING. If NO_ENCODING is specified, then the call to this method is equivalent to setContent(String content).
· boolean registerTask( String ) – registers the calling task in the Task Manager with the specified conversation ID. This has the effect of routing all incoming messages with that conversation ID to the calling task.
· boolean searchDF( DFDescription )- performs a federated search of the local DF to a DF depth of 2, for any agents matching the specified DF description. Results are returned to a callback method, DFSearchResults(DFDescription[]). The return value is true if the search request was sent, not if the search was successful.
· boolean searchDF( DFDescription, Constraint )- performs a federated search of the local DF using the specified search constraint, for any agents matching the specified DF description. Results are returned to a callback method, DFSearchResults(DFDescription[]). The return value is true if the search request was sent, not if the search was successful.
· boolean searchDF( DFDescription, boolean )- performs a search of the local DF to a DF depth of 2 if the boolean parameter is true, or without federation if the parameter is false, for any agents matching the specified DF description. Results are returned to a callback method, DFSearchResults(DFDescription[]). The return value is true if the search request was sent, not if the search was successful.
· boolean searchDF( String, DFDescription, boolean )- performs a search of the specified DF to a DF depth of 2 if the boolean parameter is true, or without federation if the parameter is false, for any agents matching the specified DF description. Results are returned to a callback method, DFSearchResults(DFDescription[]). The return value is true if the search request was sent, not if the search was successful.
· boolean searchDF( String, DFDescription, Constraint, boolean )- performs a search of the specified DF using the specified constraint, federating the search if the boolean parameter is true, for any agents matching the specified DF description. Results are returned to a callback method, DFSearchResults(DFDescription[]). The return value is true if the search request was sent, not if the search was successful.
· Added FIPAAuctionEnglish protocol (FIPA ’97).
· Added FIPARecruiting protocol (FIPA ’99).
· Added FIPABrokering protocol (FIPA ’99).
· FIPAAuctionDutch now allows a CFP message to follow a CFP message as part of the same conversation, as specified in FIPA ’99.
The agent management constraint class has been updated to remove the use of class defined public integer constants to represent constraint types. The class is at fipaos.ont.fipaman.Constraint.
· boolean isConstraint( String type ) – returns true if the constraint object matches the type specified, and false if it does not.
· String getConstraintString() – returns the constraint type as a FIPA defined string constant.
· String getConstraintFnString() – returns the constraint function type as a FIPA defined string constant.
· int getConstraint() – it is preferable to use getConstraintString() and perform a string comparison with a FIPA constant.
· int getConstraintFn() - it is preferable to use getConstraintFnString() and perform a string comparison with a FIPA constant.
The package structure has been changed from aw.* to fipaos.* - the details are listed below. A conversion tool (PackageRenamer) is provided with this release of FIPA-OS to automatically convert any code constructed for a previous version of FIPA-OS from the old structure to the new structure.
· AgentWorldAgent -> FIPAOSAgent
· State -> Task
· StateManager -> TaskManager
· *State -> *Task (for indivdual state/task classes)
(in class StateManager/TaskManager)
· addState -> addTask
· removeState -> removeTask
· containsState -> containsTask
· saveState -> saveTask
· getState -> getTask
(in class AgentWorldAgent/FIPAOSAgent)
· setIdleState -> setListenerTask
· aw.tools.DIAGNOSTICS -> fipaos.util.DIAGNOSTICS
· aw.agent.state -> fipaos.agent.task
· aw.comms -> fipaos.comm
· aw.tools -> fipaos.tool
· aw.* -> fipaos.*
· An agent loader is included with this release. It will start the agents that have been specified within the loader.profile file in the same VM.
· It has a thread viewer to enable visualisation of all threads running in the virtual machine.
· Ability to shutdown an agent and kill off all threads associated with it ( the shutdown method within the agent is invoked, any clean up should be undertaken here and the super.shutdown() method called.).
§ There is a new Agent "shell" under fipaos.skill called JessAgent it uses the Java Expert System Shell (JESS) to allow an agent to have some intelligence. It subclasses the FIPAOSAgent class so that agent can make full uses of FIPA-OS messaging while using the JESS knowledge base to reason about the contents of FIPA messages.
· Step 3 – Platform Ping Agent has been added to show DF querying via the agent API, and pro-active agent tasks.
· Step 4 – Tag Agent has been added to show registering and using agent services with the DF, and task collaboration.
· Step 5 – Using the JessAgent shows how to run an example of the agent and describes the working of the agent.
· Code has been added to support the user of the Constraint Choice Language as described in [5].
· This code has been added into the package fipaos.skill.constraint.ccl.
· The code supports the creation and population of classes that correspond to the elements of the CCL Language Ontology. It also supports the parsing and deparsing of these objects using ContentHandlers. It should be noted here that only a subset of the elements of CCL have been implemented.
· Added addDuration( String UTC ) and addDuration( int, int .... ) to UTCDuration.
· Can now use any SAX 1.0 compliant parser - by default uses Apache’s Xerces XML parser, but by specifying the system property "aw.parser.xmlparser" with the name of an alternative class to use which has the SAX interface, other XML parser can be used.
· Introduced guidelines to version numbers used for FIPA-OS releases.
· Introduced a new State management package (aw.agent.state) which incorporates:
· State Manager;
· State abstract superclass;
· Predefined states for auto platform registration;
·
Extensions to AWA to incorporate state (new constructor,
methods).
See the tutorial 2, Ping Agent for an introduction on using states.
· InitialisationException's thrown by Comms implementations are now correctly passed back to the AgentComms class and displayed using DIAGNOSTICS.println(). Previously an exception wrapping the real exception was being thrown, but never unwrapped so the user would get "useful" error messages such as "Error initialising SunIDL: null".
· Diagnostics level to support information filters is more sophisticated: it can be set independently for persistence (file) output and in-line (memory) to another process such as a viewer.
· Most messages apart from test harnesses main() methods are now channeled via the DIAGNOSTICS object.
· Several key error messages generated within FIPA-OS are now tagged with a diagnostics level.
· More support for messages as structured Objects rather than 'flat text messages' to be sent to the DIAGNOSTICS object. In fact, println(String) and println(String,String) are replaced with println(Object message) and println(Object message,Object, source). The preferred method is however println(Object message,Object, source, int DiagnosticsLevel), i.e, the message is associated with a Diagnostics level.
· DIAGNOSTICS object can receive message using a generic message receiver interface called Sink.
· Post-processing objects such as message viewers can be attached to the DIAGNOSTICS object using the setSink(Sink viewer) method.
· DIAGNOSTICS object time-stamps message to persistent storage (not to memory).
· Output to file is of the form: timestamp SP source SP level SP message converted to String (where SP is user-configurable field separater (defaults to ":").
· Output to a post-processing object is of the form: Object message,Object, source. If no post-processing object is configured, post-processing object defaults to standard output.
· Automatic registration with local and remote platforms (provided by a state).
· Method calls available in AWA API (registerWithAMS and registerWithDF)
· New AWA protected variables:
· - _profile - Used to store the given agent's profile (internal store of data in the agent profile file).
· - _my_guid - Used to store the given agent's GUID.
· AMS is now state based (uses State Manager) and AMS sub-classes are in aw.platform.ams.
· Updated to transparently change the specified receiver GUID in an incomming message from an IOR to a GUID when necessary and vice versa for an outgoing message - changes the sender GUID to agent_name@iiop://...... to agent_name@IOR:........ to enable interoperability with platforms not supporting the GUID concept specified by FIPA.
· When the DFGUI searches the DF at startup or when the options menu option is chosen, the DF description used is for active agents only - this is to comply with the FIPA specification which requires at least one attribute for the df-description when searching.
· IORs can be handled within the address part of the GUID in the options menu.
· Agent Type Index now works from the view menu - types supported are df, fipa and other.
· Displays icons correctly for df, fipa and other and types in the main GUI.
· Displays the toolbar correctly in the main GUI.
· Updated to use the new State Manager.
· File dialog opens by default at the /fipa-os/examples/ directory.
Numerous bug fixes and feature enhancements have been made to the core FIPA-OS code base. The changes are summarised below.
· The entire FIPA-OS code base has been migrated to use Java 1.2. It is now no longer possible to use FIPA-OS with earlier versions of Java as some new features introduced in Java 1.2 are exploited within parts of the code.
· It is now possible to choice whether to start all of the platform agents (AMS, DF and ACC) in a single VM or in mulitple VMs.
· Removed the dependency on Metamata Diagnostics by introducing a dedicated Diagnostics class (aw.tools.DIAGNOSTICS) that supports multiple debug levels.
· Introduced guidelines for the package structure used in FIPA-OS to help developers navigate the code base and to determine where new classes should be added when developed.
· The filename used for storing the stringified IOR of the platform has been changed to the form PlatformAddress-PortNo-Target.
· A set of constants files have been introduced. The constants files are as follows:
· aw.fipa.FIPACONTANTS - this contains all FIPA defined constants, such as performatives, message types, protocol names and platform agent names.
· aw.ont.BASETOKENS - this contains all base characters and symbols that can be used in the creation of messages and internally in agents. These constants include characters like ; : , ! ? { } [ ] ( ) * / \ . @ T Z, as well as constructs such as IOR:// and words like result, action and done.
· aw.ont.fipaman.FIPAMANCONSTANTS - contains all fipa agent management ontology defined constants, such as DF, ACC and AMS actions, fipa exception names and DF/AMS description field names.
All ontologies will and should have their constants defined in a constants file in aw.ont.ontology.XCONSTANTS where ontology would reflect the actual name of the ontology. The classes have capitalised names to indicate the fact that they are constants.
· Introduced a new class aw.util.FlagHandler. The FlagHandler class provides a convenient method of storing many state flags in one place in an agent. If you need to set and check many boolean flags (for instance to record registration with the platform, initiation of a query, presence of some information etc.) then the flag handler provides a unified interface to an unbounded number of flags. The API provides methods to add, set, check and toggle flags. Support for mutually exclusive flags is also provided. The FlagHandler stores flags internally in a more efficient way than using a boolean for each flag, so use of this class for flag management in an agent reduces overhead. This class is used by the platform agents, and is therefore a required component of the FIPA-OS platform. For more information on the FlagHandler API, please consult the FIPA-OS javadocs.
· Profiles now enable multiple transports to be listed. The profiles also make better use of the RDF semantics. The profile changes are discussed further, below.
· The SL/ACL parsers have been updated to allow 0 as an acceptable number.
· The SetupFIPAOS.bat file has been simplified as only a single list of supported transports is now required and there is no further need to reference the Metamata Diagnostics classes.
A number of changes have occurred to the AgentWorldAgent API due to the overhaul of the underlying Comms layer. Details that developers should be aware of are described in the 'New Functionality' sub-section below.
· Certain methods have been depricated (i.e. setAgentGUID() and isPushing() ) since they are have been deemed inappropriate - the Agent's GUID cannot be changed for any reason at the moment for security reasons and the way that the Agent implementation is written will be based around whether is it using push or not.
· In the new version of AgentComms push is the default message delivery mechanism, but pull is supported for backwards compatibility with pre-FIPAOSv1.03 implementations.
· The agentcomms instance variable no longer exists in AgentWorldAgent - calls to agentcomms.getNextMessage() should change to getNextMessage(), which does the same thing when using pull without a ConversationManager.
· Messages/Conversation's aren't pushed to the Agent implementation until startPushing() is invoked - this method should be invoked from the Agent implementation once it has been fully initialised. The idea is that this prevents messages arriving at the Agent when using push before the Agent is ready for them.
The AMS has been updated to increase its functionality and to handle the Agent Management ontological rules more effectively.
· Includes the same functionality as described in FIPA97, Part 1 V2, Agent Management [1], but now also checks that the mandatory elements of a ams-description are included in action requests as specified in FIPA99, Part 1, Agent Management [4]. A mandatory-element-missing message is returned by the AMS if the check fails at any point.
· AMS authenticates agents by checking that they were created on the local agent platform.
· The register, deregister and modify actions can only be requested by the agent itself, its delegate or another AMS.
· Support for the search-agent action as described in FIPA99, Part 1, Agent Management [4].
· Support for the FIPA_exception keyword as described in FIPA99, Part 1, Agent Management [4] when failure or refuse messages are generated.
The DF has been updated to ensure that the rules of the Agent Management ontology are followed.
· The DF checks to ensure that all of the mandatory components of the df-description in a register action request.
· The test ACL message included in the Dfregister.txt file in the examples directory of the distribution has been updated to include a service description that contains all of the mandatory elements described in FIPA99, Part 1, Agent Management [4].
· The DF GUI displays the previously registered agents if the agent is restarted (see issue V1.02-I7).
The ACC has been updated such that it is more consistent with the emergent ideas in the FIPA99 specification for Agent Transport.
· The ACC supports direct message parsing as described in FIPA99, Part 1, Agent Management [4] and the ability for agents to request that the forward action is performed as described in FIPA97, Part 1 V2, Agent Management [1]. Support for the forward action has been deprecated.
New features have been added to the IOTestAgent to support the added complexity of agent names that include non-persistent parts, such as some IORs.
· Support for the variable %GUID% %NAME% %ADDRESS% in the test strings when use in test ACL message files. The variable will be instantiated with the actual agent GUID/NAME/ADDRESS when the message is sent.
· New features with the startIOTestAgent batch file include:
· Ability to specify the agent name to be adopted by the instance of IOTestAgent on startup. If no name is specified, the default name of IOTestAgent@iiop://GUID will be used.
· Specify /ior as a command line option, to use agentname@ior:… form. If not specified agentname@iiop… is used.
Example usage is given below:
StartIOTestAgent [<agentname>] [/ior]
·
Greater flexibility has been added to the Comms Transport layer, such that multiple transports can be supported by agents.
· Support for Sun IDL as a transport.
· Support for Voyager 3.11 as a transport, deprecating support for earlier versions of Voyager.
· Support for RMI as a IPMT.
· Ability for agents to support multiple transports in parallel e.g. the ACC could use RMI as the IPMT and Voyager as the inter-platform transport mechanism.
· Support for the FIPA99 MTS has been incorporated in the Comms Transport layer, but cannot currently be used by AgentWorldAgent as support in the Agent Profile has not been completed.
To handle agent names which meet the original requirements of FIPA97 for the Agent GUID and the recommendations of the FIPA99 Interoperability Technical Committee, FIPA-OS now supports two forms of Agent GUIDs. The changes to the AgentGUID class are summarised below:
· AgentGUID object will now accept agent GUIDs of the form agentname@IOR:…. where the data following the IOR label is the stringified IOR which can be used to message the specified agent.
· AgentGUID now has an equals( AgentGUID) method.
· AgentGUID( String ) constructor will check for the IOR field in the GUID and will construct the object accordingly. If the GUID uses IORs then the protocol field of the AgentGUID object will be set to 'IOR' and the target field will be set to the stringified IOR value. The host field is set to "", and the port is set to 0. The name is set if present.
· AgentGUID() constructor will still construct an empty GUID of the agentname@iiop://host:port/target form.
· toString() will return the correct string representation of IOR style GUIDs.
· getAddress() will return an IOR style GUID address if an IOR is used.
· getHost() will return a blank string ("") if the GUID uses an IOR.
· getPort() will return 0 if the GUID uses an IOR.
Functionality for agentname@iiop://host:port/target style GUIDs remains unchanged from version 1.01.
· isIOR() returns true if the GUID uses an IOR, false otherwise.
· setIOR( String ) sets the AgentGUID object to use the specified stringified IOR. The protocol is set to 'IOR' by this method.
· getIOR() returns the stringified IOR present in the GUID, including the 'IOR:' header (e.g. IOR:0000…..).
· equals( AgentGUID ) returns true if the current object equals the AgentGUID parameter. This method checks each field of the GUIDs for equality. This method works for both forms of accepted GUIDs.
FIPA-OSv1_03 uses a new set of agent profiles. This enables the agent profiles to be much more flexible. Although FIPA-OSv1_03 will not work with earlier versions of agent profiles, the transition from the old version of agent profiles to the new version is fairly straight forward.
· The Platform Profile has essentially remained the same as the old tag names are now preceded by the RDF namespace ap:
· The Agent Profile has been updated to use the semantics of RDF. The fields <transport-mechanism>, <transport-protocol>, <iiop> have been grouped into a transport object. For example, suppose your current profile has the following settings:
<transport-mechanism> Voyager</transport-mechanism>
<transport-protocol>iiop </transport-protocol>
<iiop>9001</iiop>
In your new profile you need a Transport object with the following settings:
<!-- Transport object -->
<ap:Transport rdf:about="transport1">
<ap:mechanism> Voyager </ap:mechanism>
<ap:protocol> iiop </ap:protocol>
<ap:port_number>9001</ap:port_number>
</ap:Transport>
· The field <agent1> has been replaced by a platform object that describes where the ACC publishes its IOR. For example, suppose your current ACC profile has the following settings:
<agent1>c:\apache\wwwroot\fipa-os\platforms\</agent1>
In your new profile you need a Platform object with the following settings:
<!-- Platform object -->
<ap:Platform rdf:about="localPlatform">
<ap:local_agent_platform_ior_location>
c:\apache\wwwroot\fipa-os\platforms\
</ap:local_agent_platform_ior_location>
</ap:Platform>
· The field <agent2> has been replaced by a platform object. . For example, suppose your current profile has the following settings:
<agent2>iiop://234.234.234.234:9000/acc, http://www.agent2.co.uk/fipa-os/Platforms/234-234-234-234-9000-acc</agent2>
In your new profile you need a Platform object with the following settings:
<!-- Platform object -->
<ap:Platform rdf:about="platformTinkywinky">
<ap:remote_agent_platform>
iiop:// 234.234.234.234:9000/acc
</ap:remote_agent_platform>
<ap:ior>
http://www.agent2.co.uk/fipa-os/Platforms/234-234-234-234-9000-acc </ap:ior>
</ap:Platform>
· The fields <agent3> and <agent4> are not present anymore in the new profiles. In fact, every agent specific field should now be specified in a separate object.
· The <agent5> field has been replaced by a database object. For example, suppose your current profile has the following settings:
<agent5>SerializationDatabase </agent5>
In your new profile you need a Database object with the following settings:
<!-- Database object -->
<ap:Database rdf:about="database1">
<ap:database_type>SerializationDatabase</ap:database_type>
<ap:database_location> </ap:database_location>
</ap:Database>
NOTE: the field database_location is reserved for future use of FIPA-OS. Currently this field is not being used, therefore any value this field may contain will be ignored.
· To partially address issue V1.01-I6 (see chapter 5 for details) the DF has been updated to support the depth-search min constraint.
· The Voyager transport binding now supports the IIOP protocol for inter-platform communication. Intra-platform communication using the Voyager transport binding remains unchanged.
· When the ACC is started it attempts to send inform messages to all remote platform ACCs, which it is aware of (e.g. specified in the ACC profile). This ensures that if non-persistance IORs are used by its platform all remote platforms are updated with its current IOR.
· Added a guard to ensure that if a remote platform's HTTP server cannot be accessed it does not attempt to use the potentially old (or unknown) platform IOR. In the situation where a remote platform's IOR cannot be retrieved a warning diagnostics message is generated.
· Added a guard to the RDF parser to ensure that an appropriate error message is produced if it is unable to dynamically load the required XML parser.