require 'div' require 'singleton' require 'RAA'; include RAA require 'soap/driver' require 'devel/logger' require 'hotpage' require 'mutexm' class RAADiv < Div::Div include Singleton include MutexM attr_accessor :server attr_accessor :proxy attr_accessor :size DefaultRAAServer = 'http://www.ruby-lang.org/~nahi/soap/raa/' InitialCoverSec = 7 * 24 * 3600 # 1 week CoverSec = 30 * 60 # 30 min UpdateInterval = 5 * 60 # 5 min def initialize @size = 10 @session = nil @div_class = type.to_s @div_id = self.id.to_s @action = nil @server = DefaultRAAServer @proxy = nil @raa = RAA::Driver.new( @server, @proxy ) @raa.setLogDev( '/var/tmp/raa-div.log' ) @raa.setLogLevel( Devel::Logger::INFO ) @hotItemPool = HotPage.new( &self.method( :hotOrder )) @t = Thread.new { poll } end def to_html(context) "\n" << "\n" << hotitem.collect { | info | productName = info.product.name version = info.product.version author = info.owner.name d = info.update category = info.category.to_s.sub(/^Application/, 'App').sub(/^Library/, 'Lib').sub(/^Documentation/, 'Doc') t = Time.gm( d.year, d.mon, d.mday, d.hour, d.min, d.sec ).localtime update = format( '%02d-%02dT%02d:%02d', t.mon, t.mday, t.hour, t.min ) title = "by #{ author }, #{ update }" <<__HERE__ __HERE__ }.join( "" ) << "
" << "RAA" << "
#{ h(productName) } #{ h(version) } [#{ h(category) }]
\n" end private def hotitem synchronize do @hotItemPool.pages[ 0, @size ] end end def poll milestone = Time.at( Time.now.gmtime - InitialCoverSec ) while true begin t = milestone milestone = Time.at( Time.now.gmtime - CoverSec ) items = begin @raa.getModifiedInfoSince( t ) rescue HTTPAccess2::Session::BadResponse # Try again. @raa.getModifiedInfoSince( t ) end synchronize do oldItems = @hotItemPool.__pages items.each do |item| old = oldItems.find { |i| i.eql?( item ) } if old @hotItemPool.delete( old ) end @hotItemPool << item end end @raa.log.info "Got #{ items.size } items." rescue Exception @raa.log.fatal $! end sleep UpdateInterval end end def hotOrder( a, b ) b.update <=> a.update end end if __FILE__ == $0 a = RAADiv.instance while true p a.to_html(nil) sleep 10 end end