Class: TaskJuggler::ReportServer
- Includes:
- ProcessIntercom
- Defined in:
- lib/taskjuggler/daemon/ReportServer.rb
Instance Attribute Summary collapse
-
#authKey ⇒ Object
readonly
Returns the value of attribute authKey.
-
#uri ⇒ Object
readonly
Returns the value of attribute uri.
Instance Method Summary collapse
- #addFile(file) ⇒ Object
- #checkStatusSheet(sheet) ⇒ Object
- #checkTimeSheet(sheet) ⇒ Object
- #generateReport(id, regExpMode, formats, dynamicAttributes) ⇒ Object
-
#initialize(tj, logConsole = false) ⇒ ReportServer
constructor
A new instance of ReportServer.
- #listReports(id, regExpMode) ⇒ Object
- #ping ⇒ Object
Methods included from ProcessIntercom
#checkKey, #connect, #disconnect, #generateAuthKey, #initIntercom, #restartTimer, #startTerminator, #terminate, #timerExpired?
Methods included from MessageHandler
#critical, #debug, #error, #fatal, #info, #warning
Constructor Details
#initialize(tj, logConsole = false) ⇒ ReportServer
Returns a new instance of ReportServer.
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 27 def initialize(tj, logConsole = false) initIntercom @pid = nil @uri = nil # A reference to the TaskJuggler object that holds the project data. @tj = tj # This is set to the ID(s) of the reports that should be generated. @reportId = 'unknown' @lastPing = TjTime.new # We've started a DRb server before. This will continue to live somewhat # in the child. All attempts to create a DRb connection from the child # to the parent will end up in the child again. So we use a Pipe to # communicate the URI of the child DRb server to the parent. The # communication from the parent to the child is not affected by the # zombie DRb server in the child process. rd, wr = IO.pipe if (@pid = fork) == -1 fatal('rs_fork_failed', 'ReportServer fork failed') elsif @pid.nil? if logConsole # If the Broker wasn't daemonized, log stdout and stderr to PID # specific files. $stderr.reopen("tj3d.rs.#{$$}.stderr", 'w') $stdout.reopen("tj3d.rs.#{$$}.stdout", 'w') end begin # This is the child $SAFE = 1 DRb.install_acl(ACL.new(%w[ deny all allow 127.0.0.1 ])) iFace = ReportServerIface.new(self) begin uri = DRb.start_service('druby://127.0.0.1:0', iFace).uri debug('', "Report server is listening on #{uri}") rescue error('rs_cannot_start_drb', "ReportServer can't start DRb: #{$!}") end # Send the URI of the newly started DRb server to the parent process. rd.close wr.write uri wr.close # Start a Thread that waits for the @terminate flag to be set and does # other background tasks. startTerminator startWatchDog # Cleanup the DRb threads DRb.thread.join debug('', 'Report server terminated') exit 0 rescue => exception # TjRuntimeError exceptions are simply passed through. if exception.is_a?(TjRuntimeError) raise TjRuntimeError, $! end error('rs_unexp_excp', "ReportServer caught unexpected exception: #{$!}") end else Process.detach(@pid) # This is the parent wr.close @uri = rd.read rd.close end end |
Instance Attribute Details
#authKey ⇒ Object (readonly)
Returns the value of attribute authKey.
25 26 27 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 25 def authKey @authKey end |
#uri ⇒ Object (readonly)
Returns the value of attribute uri.
25 26 27 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 25 def uri @uri end |
Instance Method Details
#addFile(file) ⇒ Object
107 108 109 110 111 112 113 114 115 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 107 def addFile(file) begin @tj.parseFile(file, :reportPropertiesFile) rescue TjRuntimeError return false end restartTimer true end |
#checkStatusSheet(sheet) ⇒ Object
164 165 166 167 168 169 170 171 172 173 174 175 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 164 def checkStatusSheet(sheet) info('check_status_sheet', "Checking status sheet #{sheet}") @reportId = 'statussheet' begin ok = @tj.checkStatusSheet(sheet) debug('', "Status sheet #{sheet} is #{ok ? '' : 'not '}ok") rescue TjRuntimeError return false end restartTimer ok end |
#checkTimeSheet(sheet) ⇒ Object
151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 151 def checkTimeSheet(sheet) info('check_time_sheet', "Checking time sheet #{sheet}") @reportId = 'timesheet' begin ok = @tj.checkTimeSheet(sheet) debug('', "Time sheet #{sheet} is #{ok ? '' : 'not '}ok") rescue TjRuntimeError return false end restartTimer ok end |
#generateReport(id, regExpMode, formats, dynamicAttributes) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 117 def generateReport(id, regExpMode, formats, dynamicAttributes) info('generating_report', "Generating report #{id}") startTime = Time.now @reportId = id begin if (ok = @tj.generateReport(id, regExpMode, formats, dynamicAttributes)) info('report_id_generated', "Report #{id} generated in #{Time.now - startTime} seconds") else error('report_generation_failed', "Report generation of #{id} failed") end rescue TjRuntimeError return false end restartTimer ok end |
#listReports(id, regExpMode) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/taskjuggler/daemon/ReportServer.rb', line 135 def listReports(id, regExpMode) info('listing_report_id', "Listing report #{id}") begin if (ok = @tj.listReports(id, regExpMode)) debug('', "Report list for #{id} generated") else error('repor_list_comp_failed', "Report list compilation of #{id} failed") end rescue TjRuntimeError return false end restartTimer ok end |