# Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved. # Author: Nicolas Despres . # License: Gnu General Public License. # $LastChangedBy: ertai $ # $Id: service_manager.rb 186 2005-04-03 00:07:45Z ertai $ # A service must implement at least: # - start_service(uri, *args, &block) # - stop_service # - server # - thread # - uri module ServiceManager def start_service(service, uri=nil, *args, &block) @services = {} unless defined? @services service.start_service(uri, *args, &block) @services[service.uri] = service end def stop_service(uri) if defined? @services if service = @services.delete(uri) service.stop_service end end end def stop_services if defined? @services @services.keys.each do |uri| stop_service(uri) end end end def count_services if defined? @services @services.size else 0 end end def list_services if defined? @services @services.values else [] end end def join_services if defined? @services @services.each { |uri, service| service.thread.join } end end def each_services(&block) if defined? @services @services.each { |uri, service| block[uri, service] } end end def service_server(uri) @services[uri].server if defined? @services end end # module ServiceManager if defined? TEST_MODE or __FILE__ == $0 require 'test/unit/ui/yaml/testrunner' require 'drb' class ServiceManagerTest < Test::Unit::TestCase class Foo include ServiceManager end module MyService module_function def start_service(uri); end def stop_service; end def uri; 'toto'; end end def test_simple f = Foo.new f.start_service(DRb) assert_equal(1, f.count_services) f.start_service(DRb) assert_equal(2, f.count_services) f.start_service(MyService) [ DRb, DRb, MyService ].each do |s| assert(f.list_services.include?(s)) end assert_equal(3, f.count_services) f.stop_service(MyService.uri) assert_equal(2, f.count_services) f.start_service(MyService) [ DRb, DRb, MyService ].each do |s| assert(f.list_services.include?(s)) end f.stop_services assert_equal([], f.list_services) end end # class ServiceManagerTest end