Older Changes * 10.4 OrgActivity is now an interface, implemented by OrgActivityImpl and constructable using the new class OplanFactory. * 10.2 * 10.0 publishAdd, publishChange and publishRemove now return void rather than boolean. Most users ignored the values anyway, so this change implies that serious problems (e.g. change cannot be committed) will result in an unchecked exception (BlackboardException) being thrown instead of an easy-to-ignore false return value. (bug 168) ActiveSubscriptionObject methods are now xxxToBlackboard rather than xxxToLogPlan and return void rather than boolean. ClusterIdentifier and NodeIdentifier are gone - all uses are replaced by the more generic MessageAddress. All matching accessors have been renamed accordingly. A 90% solution may be found in the 10.0 subdirectory of the ReleaseNotes in fixCID.pl - see the documentation for help. ClusterIdentifier.cleanToString() has been dropped entirely (use toString() instead). A better solution would be to not rely on MessageAddresses being one-to-one with organizations. All MessageAddress constructors are non-public. All construction must be through static factory methods (MessageAddress.getMessageAddress()) on the appropriate class. MessageAttributes are now attached to a MessageAddress via delegation using the MessageAddressWithAttributes class. This is generally transparent, though MTS aspects which are concerned about the details will may have to check for instanceof MessageAddressWithAttributes and then do getDelegate() to walk up to the parent or MessageAddress.getPrimary() to find the unadorned target. MessageAddress multicast constants have been prefixed with the string "MULTICAST_". An additional NULL_SINK constant has been added. AspectValues are now immutable (See bug 2430). This allows dramatic reduction in object copying, increased security and some significant performance improvements. There are several minor api changes implied by this change: AspectValue av = preference.getAV(); // av.setValue(47.0); // old preference.setAV(av.dupAspectValue(4.70)); // new Also, AspectValue is no longer Clonable, since there isn't any point. The AspectValue constructors have been replaced by factory methods: AspectValue newAspectValue(int type, long value); AspectValue newAspectValue(int type, double value); AspectValue newAspectValue(int type, float value); AspectValue newAspectValue(int type, int value); AspectValue newAspectValue(int type, Object o); The last defers to the type's factory to choose how to interpret o. AspectValue no longer implements AspectType. New AspectValue classes should include an AspectType.Factory instance which should be registered with AspectType.registry (See the source for AspectType for more information). AspectValue classes are strongly encouraged to have non-public constructors and public factory methods. For example: // old AspectValue av = new TimeAspectValue(AspectType.END_TIME, today); // new direct replacement - specific class factory AspectValue av = TimeAspectValue.create(AspectType.END_TIME, today); // the global factory has been updated to construct all the standard // (and, if registered, extended) aspects: // new - global factory AspectValue av = AspectValue.newAspectValue(AspectType.END_TIME, today); // new - slightly faster factory AspectValue av = AspectValue.newAspectValue(AspectType.EndTime, today); Basic AspectValue classes now use more appropriate actual storage types rather than all using double. e.g. dates are stored as longs, most floating-point values are stored as floats, etc. * 9.4.1 Many bugs fixed. * 9.4 * 9.2.1 Bootstrapper has been refactored to allow convenient subclassing and extension. See org.cougaar.bootstrap.Bootstrapper for details. ComponentDescription objects now support "priority" which specifies how sets of components, perhaps specified by different sources may be loaded. The component model now strongly recommends that components be loaded in the same order that they are specified, all other factors being equal. * 9.2 Cougaar now requires JDK 1.4. Bootstrapper has been moved: it is now in the bootstrap module (bootstrap.jar) and is in the package org.cougaar.bootstrap. All known scripts have been updated. Node is now represented by a NodeAgent, which is a genuine agent in all respects. NodeAgent has special privileges required to control the node. org.cougaar.util and org.cougaar.core.component have moved to the util module (util.jar). No package changes. Exceptions thrown by the component model are now generally runtime exceptions rather than checked ones. The actual exception implementations now use the new exception class abilities offered by jdk 1.4. * 9.0 * 8.6.1 New plugin scheduler allows running plugins (and other clients) from a pool of threads managed on a per-node basis rather than a single thread on a per-agent basis. Improved resource utilization (especially on SMP machines), reduced thread load for nodes with > 2 agents, simpler scheduling rules (simple fifo queue over pool). * 8.6.0 * 8.4.1 * 8.4.0 * 8.3.0 The Component chain Node->AgentManager->Agent/Cluster->PluginManager->Plugin is complete, with appropriate Binders and connection of ServiceBrokers so that low-level compoents can request high-level services. Binders control construction of components rather than the container. Wrapping Binders are now functional - see ServiceFilter and ServiceFilterBinder as examples. ServiceFilterBinder is a base class for installing Service monitors/proxies/wrappers between a standard binder and the component. There is an example of an instantiable extension in core/examples/org/cougaar/core/examples/PluginServiceFilter.java PluginServiceFilter monitors new subscription requests of the bound plugin. * 8.2.2 New INI file format to support BinderFactory loading: "insertionPoint = classname(Vector of Strings)" with backwards-compatibility for "cluster = " and "plugin = ". Node has been modified to load Components using ComponentDescriptions. * 8.2.1 ComponentModel name change: org.cougaar.core.component.Services has been renamed ServiceBroker to better reflect the function of the class as decided during the June 2001 BBN CDR (and as documented in the distributed CDR slides). Various other component/service model classes, methods, and argument names were modified to match (e.g. BindingSite.getServices() -> BindingSite.getServiceBroker()). * 8.2.0 Initial integration of Component and Service Model (CSM). Reimplementation of PluginAdapter in terms of CSM. First pass reimplementation of MessageTransport. Forward-port 7.2 (ALP Demo2000) features and bugfixes into 8.x world. * MB 8.0.1 Ported all XML code to use a single API, specifically Xerces-1.3.1. The majority of changes was the removal of old import statements that referenced old IBM parsers. org.cougaar.util.ConfigFinder was modifed to use the the DOMParser when reading in an XML file. It also now contains an inner class that extends EntityResolver. This new class is used to locate, via the config finder methods, any required DTD's that are defined within XML files. All files that serialized XML code now use XMLSerializable, which is the only way to serialize an XML document in Xerces. * MB 8.0 JDK 1.3 support. For the most part, this is a port of javaiopatch, but we are also using the RMI1.2 protocol exclusively, and a number of methods have changed exception handing slightly. Nearly all remaining references to "ALP" have been replaced by project-neutral names, often "COUGAAR". See core/doc/8.0/unalp for the conversion script (in perl) which was used and unalp.out for the output of that conversion script. Documentation files were generally not changed, so you will continue to see references to old symbols in ChangeLogs and so forth. The following classes were renamed as a result of running the script: glm/src/org/cougaar/domain/glm/ldm/plan/ALPRelationship.java -> GLMRelationship.java glm/src/org/cougaar/domain/glm/ldm/asset/ALPAsset.java -> GLMAsset.java glm/src/org/cougaar/domain/glm/ldm/ALPFactory.java -> GLMFactory.java glm/src/org/cougaar/domain/glm/ldm/ALPDomain.java -> GLMDomain.java glm/src/org/cougaar/domain/glm/util/GLMAsset.java -> AssetUtil.java glm/src/org/cougaar/domain/mlm/ui/views/ALPConsumer.java -> MLMConsumer.java glm/src/org/cougaar/domain/mlm/ui/producers/ALPProducer.java -> MLMProducer.java glm/src/org/cougaar/domain/mlm/ui/producers/ThreadedALPProducer.java -> ThreadedMLMProducer.java core/src/org/cougaar/core/cluster/ALPPlanServesLogicProvider.java -> BlackboardServesLogicProvider.java core/src/org/cougaar/core/cluster/XPlanServesALPPlan.java -> XPlanServesBlackboard.java core/src/org/cougaar/core/cluster/ALPPlan.java -> Blackboard.java server/src/org/cougaar/tools/server/ALPServer.java -> NodeServer.java server/src/org/cougaar/tools/server/RemoteALPServer.java -> RemoteNodeServer.java server/src/org/cougaar/tools/server/RemoteALPServerImpl.java -> RemoteNodeServerImpl.java What had been called the "alp" domain should now be loaded as "glm". To support this, Domains may implement a method to return alias names. Use of the aliases results in a warning, but otherwise everything will work - Aliases may be disabled at some point to force people to use the official name exclusively. All core modules have been updated to use "glm" over "alp", but "alp" and "mlm" may also be used in the interim. XML support is in the process of upgrading to use the standard XERCES package which is part of the APACHE project. Until complete, COUGAAR will continue to require both XERCES and IBM's XML4J. We expect this to be fixed in the next minor release (8.0.1). Initial checkin of Component Model with BindingSite, Binder. See org.cougaar.core.component.* for information. This is still a work in progress. Expect to see some parts of cougaar infrastructure ported to the component model in the next release (8.0.1). * MB 7.2 Minor patches. Released as a separate supported build as the basis for Alpine's 2001 demo branch line (branch tag "V7_2"). * MB 7.0.2 Minor Patches. Released as a separate supported build because of patch buildup. * MB 7.0.1 Default database connection information has been moved out of all standard ".q" and ".cfg" files. This means that Parameters are now required, either from a .cougaarrc file (was .alprc - see below) or as -D arguments on the java command line (org.cougaar.database, org.cougaar.database.user, org.cougaar.database.password). Parameters files have changed a bit. Previous versions used the file .alprc as found in the ConfigPath. Now, parameters are set first from a file ".cougaarrc" in $HOME and then by the file cougaar.rc somewhere in ConfigPath (e.g. in your society's config directory). This allows, for instance, databases to be selected in the the config directory but have individual usernames and passwords set outside on a per-user basis. See the javadoc for org.cougaar.util.Parameters for more information. A (non-functional) example of the format expected in these files is in this directory (core/doc) as "example.cougaarrc". At this point, .alprc is still searched for and used as before, albeit with warnings that they will be ignored in some future release. Changed the third party charting software from Sitraka (was KLGroup) jcchart400K.jar to an upgrade of jcchart451K.jar. Enables Inventory GUI improvements. Cannot mix and match different builds of glm and core. Promoted Delta's DBConnectionPool facility to org.cougaar.util. * MB 7.0 Package reorganization to support COUGAAR opensource release 7.0. Details may be found in 7.0/alp7.pkg. Changes are reflected in javadocs and other documentation. * MB 6.8.2 New PG in alp domain LocationSchedulePG is maintained by OrgRTDataPlugin (for "Home location") and by new OPlanWatcherLP (for oplan-directed location assignments). It is up to consumers to interpret the schedule and assign semantics. However, a useful method is TimeSpanSet.getMinimalIntersectingElement(long time) which when called on a schedule, will return the shortest element overlapping the specified time. This is experimental functionality at this point. NOTE: TimeSpan MIN_VALUE and MAX_VALUE are no longer == Long.MIN_VALUE and MAX_VALUE. This should not effect correct code, but you might notice slightly different dates in UIs for elements which represent unbounded time. It is very important that you not use Long.MIN/MAX_VALUE for schedules - *always* use TimeSpan.MIN/MAX_VALUE. * MB 6.8.1 bugfixes * MB 6.8 The new classloading Node bootstrapper may cause problems with certain IDEs. There are two workarounds: 1. call Node.launch instead of Node.main. 2. pass -Dalp.useBootstrapper=false to java command. Both options require that the classpath be complete and correct, as the bootstrapper will not do any jar-file searching. Also, the Bootstrapper's classloader will not load any classes which start with "java.", "javax.", "sun.", "com.sun." or "net.jini.". This list may be extended by supplying a -Dalp.bootstrapper.exclusions=foo.:bar. System property. The value of the property should be a list of package prefixes separated by colon (":") characters. New System property alp.message.fastTransport=true (default is false) optimizes the rmi message transport for societies where nodes usually contain multiple clusters. This option instructs the RMI MessageTransport to: 1. send messages via one thread-per node rather than one per cluster when possible. 2. registers each cluster as a redirect to the appropriate node. In addition, by default, each node will only register one server object regardless of how many clusters are served (e.g. multiple name entries will refer to the same server object). fastTransport and all the detailed settings it controls (useNodeDelivery, useNodeRedirect, useServerProxies, useLocalDelivery) may be mixed freely within a society so can be used to tune communities or individual nodes. The patch to java.io.ObjectInputStream which previously had sources in the core module and was built into alpio.jar, has been moved to its own module "javaiopatch". All the scripts have been updated accordingly. * MB 6.6 Add Automatic generation of "rate" measures in terms of base measures. See core/doc/details/MeasureWriter.txt for details on new and old features. (this part back-patched into MB 6.4.1) All "rate" measures now implement the interface alp.ldm.measures.Rate. The old (misnamed) Rate class is still available as AbstractRate. Add support for DataQuality measures on PropertyGroups. Details are described in core/doc/details/DataQuality.txt Replaced old directive message serialization technique with a lighter-weight solution. Greatly simplifies most old ldm object serialization code and allows finally dropping the old persistence mechanism (long unused). LogicProviders now appear to publish to the plan instantaneously rather than having to wait for the end of the transaction. This makes the run model of LPs internally consistant - that is, they are both invoked at a sub-transaction level and (now) have visibility into the logplan at the same level of granularity. Plugins may now use DynamicUnaryPredicate rather than UnaryPredicate for subscribing using predicates which select for things which are expected to change. Essentially, the new facility will automatically add or remove objects as a result of change events when the internal collection is out of phase with the current state of the objects. There is considerable overhead when using these predicates, so it is not the default. It still may only be used for standard subscriptions (CollectionSubscription and IncrementalSubscription and extensions), and the base objects that are being selected must be publishChanged by someone in order to pick up the modifications. Plugin.query(UnaryPredicate) is now *much* more efficient than one-shot subscriptions. Plugin should now use query in place of any existing subscribe/unsubscribe patterns. New Transaction objects are kept in thread-local references. Transaction contains the rendezvous point between ChangeReports (which had incorrectly been stored on the Publishable objects) and the subscriber/plan mechanisms. Also provides a useful hook to whatif processing. Old (broken) persistence support has been dropped entirely. The new (working) persistence support has been merged into the old package. The DomainManager will now first initialize Domains from properties (as before, looking for System properties of the form "alp.domain.foo=...") and then from a config file "LDMDomains.ini". The alpine tree has one of these files set up in the configs/common directory for alpine demo use. We expect that most people will prefer to the file method, but both are retained for compatability and flexibility. Node now uses Bootstrapper to re-classload itself with searched-for jars, etc. The makes it possible to start alp with only core.jar in the classpath. Startup scripts have been updated (simplified) accordingly. Classpath is still honored, and takes precedence over searched-for jars. See alp.society.Bootstrapper for more information. New (non-core) module "server" implements an application-server-like mechanism for running nodes (and societies) remotely. This facility is intended to be used for testing&integration and (perhaps) demo use. See server/doc/README for basic documentation and instructions. * MB 6.4 New default behavior for BehaviorGroups. See core/doc/details/BehaviorGroups.txt for details.