/*******************************************************************************
 * Dermi: A DHT-based Peer-to-Peer Middleware for Distributed Components.
 * Copyright (C) 2003-2004 Carles Pairot
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ******************************************************************************/

	CHANGES IN Dermi VERSIONS DOCUMENT
	
   
  VERSION 1.1
	----------------------------------------------

	 Documented addition of new KBRs to Dermi
	 Documented creation of Servers/Clients (naming, explain stateful replicas...)
	 Adaptation layer for Dermi: make Dermi transparent to different underlying DHT protocols and multicast services. 
	 Followed JDK 1.5 RMI conventions  
	 Dermi Implementation objects are not be forced to end in "Impl" !!!
 	 Comment the need for JDK 1.5 for compiling Dermi's source code
 	 All properties objects stored / loaded in XML (JDK 1.5 - storeToXML / loadFromXML)
	 What the hell was going on with the JUnit ListenerTest? -> Listeners were not removed correctly
	 Dermic disappeared. Dynamic proxies are the next logical step.
	 One skel to rule them all ;-)     
	 Get replica state using anycall primitive for object replicas.
	 Implemented asynchronous multicall.
 	 Checked race conditions. When calling the same method without sleeping between calls does not seem to work properly (variable
	  overrun in stub/skel?)
	 Defined JDK 1.5 annotations to specify which kind of call is wanted (anycall, multicall, directcall, ...).
	 Used JDK 1.4 logging facility for all System.out.* / System.err.*


  VERSION 1.0
	----------------------------------------------
	 Concurrency in stubs/skels: when more than one client "attacks" a server object using the same method, overlapping!
	 DOLR: Fixed connection bug, and API readapted.
	 private Object result; in stubs are expanded like previous variable result (to avoid race conditions)!!!
 	 Multicall is ONE-to-many: included source nodehandle in caller message.
 	 Use of constants for all hashtable event parameters (OBJECT, TYPE, SOURCE_NHANDLE,...).
	 All samples work again.
	 All JUnit tests work again
 	 Check retransmissions! In listeners, they were called more than once (!!!). Try ListenerTest calling 100 setX methods.
	  This seems to be due to the fact that the close() method does not really close the node and as we use the publishDirect()
	  primitive, it has no effect unsubscribing from the event service channel.
	 Dermi adapted to new Scribe Common API.
	 DInt: Distributed interception mechanism re-implemented.
	 DInt: When swapping roots, interceptor data moved to new one as well
	 DInt: Beware with interceptor failures!!! If an interceptor fails, are not lost now.
	 DInt: If starting two interceptors one after the other, it appeared a NullPointerException!!!
 	 close() method did it really close the pastry node?!?!? Don't believe so... :'-( Recompiled PastryNode adding the kill() method.
	 Anycalls/manycalls should not process again a retransmitted message. The object method is called once, storing result data
	  for possible retransmissions.
	 DOLR: When looking up an object, retransmit event in case of timeouts!
	 DOLR: Once it was active again, check JUnit class NamingTest.
	 DOLR: Reused the PastryNode in the Registry class so as not to open more nodes in case of client applications!
	 Packed modified FreePastry 1.3.2 files into a directory for recompilation purposes.
	 Checked if exceptions are thrown OK in stubs/skels
	 className attribute in is autodiscovered by stub/skel class name
   Recommented all code again.
	 isBound() method in FileRegistry class / Checked if needed in Registry (possibility of binding multiple server replicas)
    Eliminated 'ior.properties' file.
   What happens if anycall cannot be satisfied by any of the group members ??! Exception thrown.
	 ResultArrived is unnecessary. RemoteResultListener removed!
	 Anycall/Manycall exceptions are thrown back to the client !!!
	 Manycalls have been fine tuned (anycast event received 2 times for the first server?)
	 JDK 1.4.2 required because of incompatibilities in java.nio.*
	 More comprehensive output from sample examples (server implementations should show information when methods are being called).
	 Solved the bug "Server is not alive..." that appears sometimes when executing the reference user JUnit test (testReferenceUser).
	 More extensive anycall and manycall tests.
	 Improved event buffering algorithm (to avoid event losses when RvP changes, ...).
	 Solved "Timer already cancelled" bug: Commented out method kill() in DistPastryNode.java: // timer.cancel();
	 Major code refactoring
	 Migration to FreePastry 1.3.2
	 Dermi fully supports the Common API
	 Major bug fixes
	 Multicall, anycall, manycall and directcall implemented
	 All samples reimplemented from scratch


  VERSION 0.5b
	----------------------------------------------
   Migration to CBUS API  

  
  VERSION 0.4b
	----------------------------------------------
	 First implementation of decentralized directory and location service.
   Migration to FreePastry 1.3 API (Scribe app is pending).


  VERSION 0.3b
	----------------------------------------------
	 Minor bugs solved.
   'ant stubs' target added.
   Javadoc class documentation.
   Code refactoring.
   

  VERSION 0.2b
	----------------------------------------------
	 Filtering and distributed interception support.
   Filters generated using filterc.

   	   
  VERSION 0.1b
	----------------------------------------------
	 Compatibility with ANTS.COMM Stable V4.
	 Anycall generated by dermic.
	 Manycall generated by dermic.
	 JUnit tests w/ HTML reports.

   	   
  VERSION 0.1a
	----------------------------------------------
 	 ERMI examples functional.
 	 SyncCall, AnyCall and ManyCall functionalities added.
 	 Initial release.
  
--

Carles Pairot <cpairot@etse.urv.es>
Thu Jul 29 17:42:44 CEST 2004
