taskjuggler 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (613) hide show
  1. data/CHANGELOG +1144 -2047
  2. data/README +1 -1
  3. data/Rakefile +6 -6
  4. data/data/css/tjmanual.css +20 -0
  5. data/data/css/tjreport.css +7 -6
  6. data/doc/AppConfig.html +136 -130
  7. data/doc/Arguments.html +46 -40
  8. data/doc/CHANGELOG.html +1162 -2057
  9. data/doc/COPYING.html +8 -2
  10. data/doc/Object.html +205 -199
  11. data/doc/README.html +9 -3
  12. data/doc/RuntimeConfig.html +75 -69
  13. data/doc/String.html +69 -63
  14. data/doc/TaskJuggler.html +350 -291
  15. data/doc/TaskJuggler/Account.html +26 -20
  16. data/doc/TaskJuggler/AccountAttribute.html +24 -18
  17. data/doc/TaskJuggler/AccountScenario.html +24 -18
  18. data/doc/TaskJuggler/Allocation.html +74 -68
  19. data/doc/TaskJuggler/AllocationAttribute.html +54 -48
  20. data/doc/TaskJuggler/AttributeBase.html +172 -93
  21. data/doc/TaskJuggler/AttributeDefinition.html +22 -16
  22. data/doc/TaskJuggler/AttributeOverwrite.html +586 -0
  23. data/doc/TaskJuggler/BatchProcessor.html +263 -257
  24. data/doc/TaskJuggler/Booking.html +44 -38
  25. data/doc/TaskJuggler/BookingListAttribute.html +25 -21
  26. data/doc/TaskJuggler/BooleanAttribute.html +24 -18
  27. data/doc/TaskJuggler/CSVFile.html +193 -187
  28. data/doc/TaskJuggler/CellSettingPattern.html +13 -7
  29. data/doc/TaskJuggler/CellSettingPatternList.html +25 -19
  30. data/doc/TaskJuggler/Charge.html +49 -43
  31. data/doc/TaskJuggler/ChargeListAttribute.html +21 -15
  32. data/doc/TaskJuggler/ChargeSet.html +94 -88
  33. data/doc/TaskJuggler/ChargeSetListAttribute.html +29 -25
  34. data/doc/TaskJuggler/CollisionDetector.html +142 -136
  35. data/doc/TaskJuggler/ColumnListAttribute.html +21 -17
  36. data/doc/TaskJuggler/ColumnTable.html +50 -44
  37. data/doc/TaskJuggler/Daemon.html +71 -50
  38. data/doc/TaskJuggler/DataCache.html +110 -58
  39. data/doc/TaskJuggler/DataCacheEntry.html +22 -16
  40. data/doc/TaskJuggler/DateAttribute.html +24 -18
  41. data/doc/TaskJuggler/DefinitionListAttribute.html +12 -6
  42. data/doc/TaskJuggler/DependencyListAttribute.html +29 -25
  43. data/doc/TaskJuggler/DurationAttribute.html +25 -19
  44. data/doc/TaskJuggler/FileList.html +25 -19
  45. data/doc/TaskJuggler/FileRecord.html +17 -11
  46. data/doc/TaskJuggler/FixnumAttribute.html +16 -10
  47. data/doc/TaskJuggler/FlagListAttribute.html +25 -21
  48. data/doc/TaskJuggler/FloatAttribute.html +20 -14
  49. data/doc/TaskJuggler/FormatListAttribute.html +17 -11
  50. data/doc/TaskJuggler/GanttChart.html +242 -236
  51. data/doc/TaskJuggler/GanttContainer.html +71 -67
  52. data/doc/TaskJuggler/GanttHeader.html +113 -107
  53. data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -20
  54. data/doc/TaskJuggler/GanttLine.html +217 -210
  55. data/doc/TaskJuggler/GanttLoadStack.html +89 -83
  56. data/doc/TaskJuggler/GanttMilestone.html +11 -6
  57. data/doc/TaskJuggler/GanttRouter.html +194 -186
  58. data/doc/TaskJuggler/GanttTaskBar.html +41 -34
  59. data/doc/TaskJuggler/HTMLDocument.html +52 -46
  60. data/doc/TaskJuggler/HTMLGraphics.html +58 -52
  61. data/doc/TaskJuggler/Interval.html +90 -84
  62. data/doc/TaskJuggler/IntervalList.html +777 -0
  63. data/doc/TaskJuggler/IntervalListAttribute.html +29 -25
  64. data/doc/TaskJuggler/JobInfo.html +36 -30
  65. data/doc/TaskJuggler/Journal.html +188 -177
  66. data/doc/TaskJuggler/JournalEntry.html +36 -30
  67. data/doc/TaskJuggler/JournalEntryList.html +88 -82
  68. data/doc/TaskJuggler/KeywordArray.html +12 -6
  69. data/doc/TaskJuggler/KeywordDocumentation.html +512 -503
  70. data/doc/TaskJuggler/Limits.html +111 -105
  71. data/doc/TaskJuggler/Limits/Limit.html +71 -65
  72. data/doc/TaskJuggler/LimitsAttribute.html +21 -15
  73. data/doc/TaskJuggler/ListAttributeBase.html +16 -10
  74. data/doc/TaskJuggler/Log.html +111 -105
  75. data/doc/TaskJuggler/LogFile.html +54 -48
  76. data/doc/TaskJuggler/LogicalAttribute.html +35 -29
  77. data/doc/TaskJuggler/LogicalExpression.html +32 -26
  78. data/doc/TaskJuggler/LogicalExpressionAttribute.html +16 -10
  79. data/doc/TaskJuggler/LogicalExpressionListAttribute.html +671 -0
  80. data/doc/TaskJuggler/LogicalFlag.html +24 -18
  81. data/doc/TaskJuggler/LogicalFunction.html +164 -158
  82. data/doc/TaskJuggler/LogicalOperation.html +138 -132
  83. data/doc/TaskJuggler/Macro.html +14 -8
  84. data/doc/TaskJuggler/MacroTable.html +42 -36
  85. data/doc/TaskJuggler/ManagerResponsibilities.html +19 -13
  86. data/doc/TaskJuggler/ManagerStatusRecord.html +23 -17
  87. data/doc/TaskJuggler/Message.html +56 -50
  88. data/doc/TaskJuggler/MessageHandler.html +73 -67
  89. data/doc/TaskJuggler/Navigator.html +92 -86
  90. data/doc/TaskJuggler/NavigatorElement.html +88 -82
  91. data/doc/TaskJuggler/NikuProject.html +15 -9
  92. data/doc/TaskJuggler/NikuReport.html +405 -370
  93. data/doc/TaskJuggler/NikuResource.html +13 -7
  94. data/doc/TaskJuggler/NodeListAttribute.html +13 -9
  95. data/doc/TaskJuggler/PlaceHolderCell.html +22 -16
  96. data/doc/TaskJuggler/ProcessIntercom.html +116 -110
  97. data/doc/TaskJuggler/ProcessIntercomIface.html +39 -33
  98. data/doc/TaskJuggler/Project.html +1064 -895
  99. data/doc/TaskJuggler/ProjectBroker.html +439 -366
  100. data/doc/TaskJuggler/ProjectBrokerIface.html +63 -53
  101. data/doc/TaskJuggler/ProjectFileParser.html +329 -319
  102. data/doc/TaskJuggler/ProjectFileScanner.html +351 -345
  103. data/doc/TaskJuggler/ProjectRecord.html +66 -60
  104. data/doc/TaskJuggler/ProjectServer.html +287 -280
  105. data/doc/TaskJuggler/ProjectServerIface.html +43 -37
  106. data/doc/TaskJuggler/PropertyAttribute.html +16 -10
  107. data/doc/TaskJuggler/PropertyList.html +205 -199
  108. data/doc/TaskJuggler/PropertySet.html +264 -296
  109. data/doc/TaskJuggler/PropertyTreeNode.html +455 -505
  110. data/doc/TaskJuggler/Query.html +309 -524
  111. data/doc/TaskJuggler/RTFHandlers.html +17 -11
  112. data/doc/TaskJuggler/RTFNavigator.html +33 -27
  113. data/doc/TaskJuggler/RTFQuery.html +135 -129
  114. data/doc/TaskJuggler/RTFReport.html +63 -57
  115. data/doc/TaskJuggler/RTFReportLink.html +55 -49
  116. data/doc/TaskJuggler/RTFWithQuerySupport.html +17 -11
  117. data/doc/TaskJuggler/RealFormat.html +64 -58
  118. data/doc/TaskJuggler/RealFormatAttribute.html +12 -6
  119. data/doc/TaskJuggler/ReferenceAttribute.html +35 -29
  120. data/doc/TaskJuggler/Report.html +294 -249
  121. data/doc/TaskJuggler/ReportBase.html +229 -223
  122. data/doc/TaskJuggler/ReportContext.html +52 -46
  123. data/doc/TaskJuggler/ReportServer.html +143 -137
  124. data/doc/TaskJuggler/ReportServerIface.html +51 -43
  125. data/doc/TaskJuggler/ReportServerRecord.html +36 -30
  126. data/doc/TaskJuggler/ReportServlet.html +167 -140
  127. data/doc/TaskJuggler/ReportTable.html +137 -131
  128. data/doc/TaskJuggler/ReportTableCell.html +332 -292
  129. data/doc/TaskJuggler/ReportTableColumn.html +46 -40
  130. data/doc/TaskJuggler/ReportTableLegend.html +43 -38
  131. data/doc/TaskJuggler/ReportTableLine.html +66 -60
  132. data/doc/TaskJuggler/Resource.html +166 -160
  133. data/doc/TaskJuggler/ResourceListAttribute.html +54 -32
  134. data/doc/TaskJuggler/ResourceListRE.html +47 -41
  135. data/doc/TaskJuggler/ResourceScenario.html +671 -644
  136. data/doc/TaskJuggler/RichText.html +51 -45
  137. data/doc/TaskJuggler/RichTextAttribute.html +28 -22
  138. data/doc/TaskJuggler/RichTextDocument.html +96 -90
  139. data/doc/TaskJuggler/RichTextElement.html +503 -497
  140. data/doc/TaskJuggler/RichTextFunctionExample.html +41 -35
  141. data/doc/TaskJuggler/RichTextFunctionHandler.html +19 -13
  142. data/doc/TaskJuggler/RichTextImage.html +14 -8
  143. data/doc/TaskJuggler/RichTextIntermediate.html +86 -80
  144. data/doc/TaskJuggler/RichTextParser.html +59 -53
  145. data/doc/TaskJuggler/RichTextScanner.html +184 -178
  146. data/doc/TaskJuggler/RichTextSnip.html +69 -63
  147. data/doc/TaskJuggler/RichTextSyntaxRules.html +416 -410
  148. data/doc/TaskJuggler/Scenario.html +13 -7
  149. data/doc/TaskJuggler/ScenarioData.html +40 -34
  150. data/doc/TaskJuggler/ScenarioListAttribute.html +21 -15
  151. data/doc/TaskJuggler/Scoreboard.html +129 -107
  152. data/doc/TaskJuggler/SheetHandlerBase.html +245 -239
  153. data/doc/TaskJuggler/SheetReceiver.html +333 -327
  154. data/doc/TaskJuggler/SheetSender.html +227 -221
  155. data/doc/TaskJuggler/Shift.html +26 -20
  156. data/doc/TaskJuggler/ShiftAssignment.html +45 -39
  157. data/doc/TaskJuggler/ShiftAssignments.html +178 -172
  158. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +21 -15
  159. data/doc/TaskJuggler/ShiftScenario.html +29 -23
  160. data/doc/TaskJuggler/SimpleQueryExpander.html +36 -30
  161. data/doc/TaskJuggler/SortListAttribute.html +17 -13
  162. data/doc/TaskJuggler/SourceFileInfo.html +19 -13
  163. data/doc/TaskJuggler/StatusSheetReceiver.html +31 -25
  164. data/doc/TaskJuggler/StatusSheetReport.html +166 -159
  165. data/doc/TaskJuggler/StatusSheetSender.html +80 -74
  166. data/doc/TaskJuggler/StringAttribute.html +20 -14
  167. data/doc/TaskJuggler/SymbolAttribute.html +16 -10
  168. data/doc/TaskJuggler/SyntaxReference.html +231 -225
  169. data/doc/TaskJuggler/TOCEntry.html +46 -40
  170. data/doc/TaskJuggler/TSResourceRecord.html +15 -9
  171. data/doc/TaskJuggler/TSTaskRecord.html +16 -10
  172. data/doc/TaskJuggler/TableColumnDefinition.html +84 -39
  173. data/doc/TaskJuggler/TableOfContents.html +28 -22
  174. data/doc/TaskJuggler/TableReport.html +906 -866
  175. data/doc/TaskJuggler/Task.html +99 -93
  176. data/doc/TaskJuggler/TaskDependency.html +24 -18
  177. data/doc/TaskJuggler/TaskListAttribute.html +29 -25
  178. data/doc/TaskJuggler/TaskListRE.html +46 -39
  179. data/doc/TaskJuggler/TaskScenario.html +2218 -1965
  180. data/doc/TaskJuggler/TextFormatter.html +154 -148
  181. data/doc/TaskJuggler/TextParser.html +362 -348
  182. data/doc/TaskJuggler/TextParser/Pattern.html +313 -307
  183. data/doc/TaskJuggler/TextParser/Rule.html +147 -141
  184. data/doc/TaskJuggler/TextParser/StackElement.html +58 -52
  185. data/doc/TaskJuggler/TextParser/State.html +88 -82
  186. data/doc/TaskJuggler/TextParser/StateTransition.html +42 -36
  187. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +20 -14
  188. data/doc/TaskJuggler/TextParser/TokenDoc.html +19 -13
  189. data/doc/TaskJuggler/TextReport.html +80 -74
  190. data/doc/TaskJuggler/TextScanner.html +284 -272
  191. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +14 -8
  192. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +21 -15
  193. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +15 -9
  194. data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
  195. data/doc/TaskJuggler/TimeSheet.html +123 -117
  196. data/doc/TaskJuggler/TimeSheetReceiver.html +28 -22
  197. data/doc/TaskJuggler/TimeSheetRecord.html +212 -206
  198. data/doc/TaskJuggler/TimeSheetReport.html +206 -199
  199. data/doc/TaskJuggler/TimeSheetSender.html +27 -21
  200. data/doc/TaskJuggler/TimeSheetSummary.html +140 -134
  201. data/doc/TaskJuggler/TimeSheets.html +20 -14
  202. data/doc/TaskJuggler/Tj3AppBase.html +100 -94
  203. data/doc/TaskJuggler/Tj3Client.html +407 -483
  204. data/doc/TaskJuggler/Tj3Daemon.html +116 -107
  205. data/doc/TaskJuggler/Tj3SheetAppBase.html +45 -39
  206. data/doc/TaskJuggler/Tj3SsReceiver.html +31 -25
  207. data/doc/TaskJuggler/Tj3SsSender.html +64 -58
  208. data/doc/TaskJuggler/Tj3TsReceiver.html +31 -25
  209. data/doc/TaskJuggler/Tj3TsSender.html +51 -45
  210. data/doc/TaskJuggler/Tj3TsSummary.html +59 -53
  211. data/doc/TaskJuggler/TjException.html +13 -7
  212. data/doc/TaskJuggler/TjTime.html +444 -438
  213. data/doc/TaskJuggler/TjpExample.html +84 -78
  214. data/doc/TaskJuggler/TjpExportRE.html +356 -349
  215. data/doc/TaskJuggler/TjpSyntaxRules.html +4279 -4151
  216. data/doc/TaskJuggler/URLParameter.html +16 -10
  217. data/doc/TaskJuggler/UserManual.html +185 -179
  218. data/doc/TaskJuggler/VimSyntax.html +144 -138
  219. data/doc/TaskJuggler/WebServer.html +46 -39
  220. data/doc/TaskJuggler/WelcomePage.html +769 -0
  221. data/doc/TaskJuggler/WorkingHours.html +185 -179
  222. data/doc/TaskJuggler/WorkingHoursAttribute.html +42 -36
  223. data/doc/TaskJuggler/XMLBlob.html +21 -15
  224. data/doc/TaskJuggler/XMLComment.html +17 -11
  225. data/doc/TaskJuggler/XMLDocument.html +33 -27
  226. data/doc/TaskJuggler/XMLElement.html +97 -91
  227. data/doc/TaskJuggler/XMLNamedText.html +13 -7
  228. data/doc/TaskJuggler/XMLText.html +32 -26
  229. data/doc/index.html +601 -563
  230. data/doc/lib/AccountScenario_rb.html +5 -3
  231. data/doc/lib/Account_rb.html +5 -3
  232. data/doc/lib/Allocation_rb.html +5 -3
  233. data/doc/lib/AppConfig_rb.html +5 -3
  234. data/doc/lib/AttributeBase_rb.html +5 -3
  235. data/doc/lib/AttributeDefinition_rb.html +5 -3
  236. data/doc/lib/Attributes_rb.html +5 -3
  237. data/doc/lib/BatchProcessor_rb.html +5 -3
  238. data/doc/lib/Booking_rb.html +5 -3
  239. data/doc/lib/ChargeSet_rb.html +5 -3
  240. data/doc/lib/Charge_rb.html +5 -3
  241. data/doc/lib/DataCache_rb.html +5 -3
  242. data/doc/lib/FileList_rb.html +5 -3
  243. data/doc/lib/HTMLDocument_rb.html +5 -3
  244. data/doc/lib/IntervalList_rb.html +69 -0
  245. data/doc/lib/Interval_rb.html +5 -3
  246. data/doc/lib/Journal_rb.html +5 -3
  247. data/doc/lib/KeywordArray_rb.html +5 -3
  248. data/doc/lib/KeywordDocumentation_rb.html +5 -3
  249. data/doc/lib/Limits_rb.html +5 -3
  250. data/doc/lib/LogFile_rb.html +5 -3
  251. data/doc/lib/Log_rb.html +5 -3
  252. data/doc/lib/LogicalExpression_rb.html +5 -3
  253. data/doc/lib/LogicalFunction_rb.html +5 -3
  254. data/doc/lib/LogicalOperation_rb.html +5 -3
  255. data/doc/lib/MacroTable_rb.html +5 -3
  256. data/doc/lib/MessageHandler_rb.html +5 -3
  257. data/doc/lib/ProjectFileParser_rb.html +5 -3
  258. data/doc/lib/ProjectFileScanner_rb.html +5 -3
  259. data/doc/lib/Project_rb.html +5 -3
  260. data/doc/lib/PropertyList_rb.html +5 -3
  261. data/doc/lib/PropertySet_rb.html +5 -3
  262. data/doc/lib/PropertyTreeNode_rb.html +5 -3
  263. data/doc/lib/Query_rb.html +5 -3
  264. data/doc/lib/RTFHandlers_rb.html +5 -3
  265. data/doc/lib/RTFNavigator_rb.html +5 -3
  266. data/doc/lib/RTFQuery_rb.html +5 -3
  267. data/doc/lib/RTFReportLink_rb.html +5 -3
  268. data/doc/lib/RTFReport_rb.html +5 -3
  269. data/doc/lib/RTFWithQuerySupport_rb.html +5 -3
  270. data/doc/lib/RealFormat_rb.html +5 -3
  271. data/doc/lib/ResourceScenario_rb.html +5 -3
  272. data/doc/lib/Resource_rb.html +5 -3
  273. data/doc/lib/RichTextDocument_rb.html +5 -3
  274. data/doc/lib/RichTextElement_rb.html +5 -3
  275. data/doc/lib/RichTextFunctionExample_rb.html +5 -3
  276. data/doc/lib/RichTextFunctionHandler_rb.html +5 -3
  277. data/doc/lib/RichTextParser_rb.html +5 -3
  278. data/doc/lib/RichTextScanner_rb.html +5 -3
  279. data/doc/lib/RichTextSnip_rb.html +5 -3
  280. data/doc/lib/RichTextSyntaxRules_rb.html +5 -3
  281. data/doc/lib/RichText_rb.html +5 -3
  282. data/doc/lib/RuntimeConfig_rb.html +5 -3
  283. data/doc/lib/ScenarioData_rb.html +5 -3
  284. data/doc/lib/Scenario_rb.html +5 -3
  285. data/doc/lib/Scoreboard_rb.html +7 -3
  286. data/doc/lib/SheetHandlerBase_rb.html +5 -3
  287. data/doc/lib/SheetReceiver_rb.html +5 -3
  288. data/doc/lib/SheetSender_rb.html +5 -3
  289. data/doc/lib/ShiftAssignments_rb.html +5 -3
  290. data/doc/lib/ShiftScenario_rb.html +5 -3
  291. data/doc/lib/Shift_rb.html +5 -3
  292. data/doc/lib/SimpleQueryExpander_rb.html +5 -3
  293. data/doc/lib/SourceFileInfo_rb.html +5 -3
  294. data/doc/lib/StatusSheetReceiver_rb.html +5 -3
  295. data/doc/lib/StatusSheetSender_rb.html +5 -3
  296. data/doc/lib/SyntaxReference_rb.html +5 -3
  297. data/doc/lib/TOCEntry_rb.html +5 -3
  298. data/doc/lib/TableColumnDefinition_rb.html +5 -3
  299. data/doc/lib/TableOfContents_rb.html +5 -3
  300. data/doc/lib/TaskDependency_rb.html +5 -3
  301. data/doc/lib/TaskJuggler_rb.html +5 -3
  302. data/doc/lib/TaskScenario_rb.html +5 -3
  303. data/doc/lib/Task_rb.html +5 -3
  304. data/doc/lib/TextFormatter_rb.html +6 -4
  305. data/doc/lib/TextParser/Pattern_rb.html +5 -3
  306. data/doc/lib/TextParser/Rule_rb.html +5 -3
  307. data/doc/lib/TextParser/StackElement_rb.html +5 -3
  308. data/doc/lib/TextParser/State_rb.html +6 -4
  309. data/doc/lib/TextParser/TokenDoc_rb.html +5 -3
  310. data/doc/lib/TextParser_rb.html +5 -3
  311. data/doc/lib/TextScanner_rb.html +5 -3
  312. data/doc/lib/TimeSheetReceiver_rb.html +5 -3
  313. data/doc/lib/TimeSheetSender_rb.html +5 -3
  314. data/doc/lib/TimeSheetSummary_rb.html +6 -4
  315. data/doc/lib/TimeSheets_rb.html +5 -3
  316. data/doc/lib/Tj3AppBase_rb.html +5 -3
  317. data/doc/lib/Tj3Config_rb.html +5 -3
  318. data/doc/lib/Tj3SheetAppBase_rb.html +5 -3
  319. data/doc/lib/TjException_rb.html +5 -3
  320. data/doc/lib/TjTime_rb.html +5 -3
  321. data/doc/lib/TjpExample_rb.html +5 -3
  322. data/doc/lib/TjpSyntaxRules_rb.html +5 -3
  323. data/doc/lib/URLParameter_rb.html +5 -3
  324. data/doc/lib/UTF8String_rb.html +5 -3
  325. data/doc/lib/UserManual_rb.html +5 -3
  326. data/doc/lib/VimSyntax_rb.html +6 -4
  327. data/doc/lib/WorkingHours_rb.html +5 -3
  328. data/doc/lib/XMLDocument_rb.html +5 -3
  329. data/doc/lib/XMLElement_rb.html +5 -3
  330. data/doc/lib/daemon/Daemon_rb.html +5 -3
  331. data/doc/lib/daemon/ProcessIntercom_rb.html +7 -3
  332. data/doc/lib/daemon/ProjectBroker_rb.html +5 -3
  333. data/doc/lib/daemon/ProjectServer_rb.html +5 -3
  334. data/doc/lib/daemon/ReportServer_rb.html +5 -3
  335. data/doc/lib/daemon/ReportServlet_rb.html +69 -0
  336. data/doc/lib/daemon/WebServer_rb.html +9 -3
  337. data/doc/lib/daemon/WelcomePage_rb.html +71 -0
  338. data/doc/lib/deep_copy_rb.html +5 -3
  339. data/doc/lib/reports/CSVFile_rb.html +5 -3
  340. data/doc/lib/reports/CollisionDetector_rb.html +5 -3
  341. data/doc/lib/reports/ColumnTable_rb.html +5 -3
  342. data/doc/lib/reports/GanttChart_rb.html +5 -3
  343. data/doc/lib/reports/GanttContainer_rb.html +5 -3
  344. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +5 -3
  345. data/doc/lib/reports/GanttHeader_rb.html +5 -3
  346. data/doc/lib/reports/GanttLine_rb.html +5 -3
  347. data/doc/lib/reports/GanttLoadStack_rb.html +5 -3
  348. data/doc/lib/reports/GanttMilestone_rb.html +5 -3
  349. data/doc/lib/reports/GanttRouter_rb.html +5 -3
  350. data/doc/lib/reports/GanttTaskBar_rb.html +5 -3
  351. data/doc/lib/reports/HTMLGraphics_rb.html +5 -3
  352. data/doc/lib/reports/Navigator_rb.html +5 -3
  353. data/doc/lib/reports/NikuReport_rb.html +5 -3
  354. data/doc/lib/reports/ReportBase_rb.html +5 -3
  355. data/doc/lib/reports/ReportContext_rb.html +5 -3
  356. data/doc/lib/reports/ReportTableCell_rb.html +5 -3
  357. data/doc/lib/reports/ReportTableColumn_rb.html +5 -3
  358. data/doc/lib/reports/ReportTableLegend_rb.html +5 -3
  359. data/doc/lib/reports/ReportTableLine_rb.html +5 -3
  360. data/doc/lib/reports/ReportTable_rb.html +5 -3
  361. data/doc/lib/reports/Report_rb.html +5 -3
  362. data/doc/lib/reports/ResourceListRE_rb.html +5 -3
  363. data/doc/lib/reports/StatusSheetReport_rb.html +5 -3
  364. data/doc/lib/reports/TableReport_rb.html +5 -3
  365. data/doc/lib/reports/TaskListRE_rb.html +5 -3
  366. data/doc/lib/reports/TextReport_rb.html +5 -3
  367. data/doc/lib/reports/TimeSheetReport_rb.html +5 -3
  368. data/doc/lib/reports/TjpExportRE_rb.html +5 -3
  369. data/doc/lib/{taskjuggler3_rb.html → tj3_rb.html} +7 -5
  370. data/doc/lib/tj3client_rb.html +5 -3
  371. data/doc/lib/tj3d_rb.html +6 -4
  372. data/doc/lib/tj3man_rb.html +5 -3
  373. data/doc/lib/tj3ss_receiver_rb.html +5 -3
  374. data/doc/lib/tj3ss_sender_rb.html +5 -3
  375. data/doc/lib/tj3ts_receiver_rb.html +5 -3
  376. data/doc/lib/tj3ts_sender_rb.html +5 -3
  377. data/doc/lib/tj3ts_summary_rb.html +5 -3
  378. data/examples/tutorial.tjp +13 -5
  379. data/gem_spec.rb +3 -0
  380. data/lib/Account.rb +2 -1
  381. data/lib/AccountScenario.rb +2 -1
  382. data/lib/Allocation.rb +2 -1
  383. data/lib/AppConfig.rb +2 -1
  384. data/lib/AttributeBase.rb +19 -5
  385. data/lib/AttributeDefinition.rb +2 -1
  386. data/lib/Attributes.rb +49 -38
  387. data/lib/BatchProcessor.rb +2 -1
  388. data/lib/Booking.rb +2 -1
  389. data/lib/Charge.rb +2 -1
  390. data/lib/ChargeSet.rb +2 -1
  391. data/lib/DataCache.rb +15 -1
  392. data/lib/FileList.rb +2 -1
  393. data/lib/HTMLDocument.rb +2 -1
  394. data/lib/Interval.rb +2 -1
  395. data/lib/IntervalList.rb +100 -0
  396. data/lib/Journal.rb +8 -2
  397. data/lib/KeywordArray.rb +2 -1
  398. data/lib/KeywordDocumentation.rb +10 -6
  399. data/lib/Limits.rb +2 -1
  400. data/lib/Log.rb +3 -2
  401. data/lib/LogFile.rb +2 -1
  402. data/lib/LogicalExpression.rb +2 -1
  403. data/lib/LogicalFunction.rb +2 -1
  404. data/lib/LogicalOperation.rb +2 -1
  405. data/lib/MacroTable.rb +2 -1
  406. data/lib/MessageHandler.rb +2 -1
  407. data/lib/Project.rb +92 -25
  408. data/lib/ProjectFileParser.rb +7 -2
  409. data/lib/ProjectFileScanner.rb +2 -1
  410. data/lib/PropertyList.rb +2 -1
  411. data/lib/PropertySet.rb +2 -6
  412. data/lib/PropertyTreeNode.rb +22 -44
  413. data/lib/Query.rb +32 -13
  414. data/lib/RTFHandlers.rb +2 -1
  415. data/lib/RTFNavigator.rb +2 -1
  416. data/lib/RTFQuery.rb +3 -2
  417. data/lib/RTFReport.rb +2 -1
  418. data/lib/RTFReportLink.rb +2 -1
  419. data/lib/RTFWithQuerySupport.rb +2 -1
  420. data/lib/RealFormat.rb +2 -1
  421. data/lib/Resource.rb +2 -1
  422. data/lib/ResourceScenario.rb +35 -14
  423. data/lib/RichText.rb +2 -1
  424. data/lib/RichTextDocument.rb +2 -1
  425. data/lib/RichTextElement.rb +2 -1
  426. data/lib/RichTextFunctionExample.rb +2 -1
  427. data/lib/RichTextFunctionHandler.rb +2 -1
  428. data/lib/RichTextParser.rb +2 -1
  429. data/lib/RichTextScanner.rb +2 -1
  430. data/lib/RichTextSnip.rb +2 -1
  431. data/lib/RichTextSyntaxRules.rb +2 -1
  432. data/lib/RuntimeConfig.rb +2 -1
  433. data/lib/Scenario.rb +2 -1
  434. data/lib/ScenarioData.rb +2 -1
  435. data/lib/Scoreboard.rb +27 -8
  436. data/lib/SheetHandlerBase.rb +2 -1
  437. data/lib/SheetReceiver.rb +2 -1
  438. data/lib/SheetSender.rb +2 -1
  439. data/lib/Shift.rb +2 -1
  440. data/lib/ShiftAssignments.rb +2 -1
  441. data/lib/ShiftScenario.rb +2 -1
  442. data/lib/SimpleQueryExpander.rb +2 -1
  443. data/lib/SourceFileInfo.rb +2 -1
  444. data/lib/StatusSheetReceiver.rb +2 -1
  445. data/lib/StatusSheetSender.rb +2 -1
  446. data/lib/SyntaxReference.rb +2 -1
  447. data/lib/TOCEntry.rb +2 -1
  448. data/lib/TableColumnDefinition.rb +9 -2
  449. data/lib/TableOfContents.rb +2 -1
  450. data/lib/Task.rb +2 -1
  451. data/lib/TaskDependency.rb +2 -1
  452. data/lib/TaskJuggler.rb +8 -6
  453. data/lib/TaskScenario.rb +337 -153
  454. data/lib/TextFormatter.rb +3 -2
  455. data/lib/TextParser.rb +7 -2
  456. data/lib/TextParser/Pattern.rb +2 -1
  457. data/lib/TextParser/Rule.rb +2 -1
  458. data/lib/TextParser/StackElement.rb +2 -1
  459. data/lib/TextParser/State.rb +3 -2
  460. data/lib/TextParser/TokenDoc.rb +2 -1
  461. data/lib/TextScanner.rb +12 -5
  462. data/lib/TimeSheetReceiver.rb +2 -1
  463. data/lib/TimeSheetSender.rb +2 -1
  464. data/lib/TimeSheetSummary.rb +3 -2
  465. data/lib/TimeSheets.rb +2 -1
  466. data/lib/Tj3AppBase.rb +6 -5
  467. data/lib/Tj3Config.rb +5 -4
  468. data/lib/Tj3SheetAppBase.rb +2 -1
  469. data/lib/TjException.rb +2 -1
  470. data/lib/TjTime.rb +2 -1
  471. data/lib/TjpExample.rb +2 -1
  472. data/lib/TjpSyntaxRules.rb +264 -65
  473. data/lib/URLParameter.rb +2 -1
  474. data/lib/UTF8String.rb +2 -1
  475. data/lib/UserManual.rb +2 -1
  476. data/lib/VimSyntax.rb +3 -2
  477. data/lib/WorkingHours.rb +2 -1
  478. data/lib/XMLDocument.rb +2 -1
  479. data/lib/XMLElement.rb +2 -1
  480. data/lib/daemon/Daemon.rb +3 -1
  481. data/lib/daemon/ProcessIntercom.rb +3 -1
  482. data/lib/daemon/ProjectBroker.rb +84 -32
  483. data/lib/daemon/ProjectServer.rb +5 -3
  484. data/lib/daemon/ReportServer.rb +8 -5
  485. data/lib/daemon/ReportServlet.rb +166 -0
  486. data/lib/daemon/WebServer.rb +6 -150
  487. data/lib/daemon/WelcomePage.rb +80 -0
  488. data/lib/deep_copy.rb +2 -1
  489. data/lib/reports/CSVFile.rb +2 -1
  490. data/lib/reports/CollisionDetector.rb +2 -1
  491. data/lib/reports/ColumnTable.rb +2 -1
  492. data/lib/reports/GanttChart.rb +2 -1
  493. data/lib/reports/GanttContainer.rb +3 -4
  494. data/lib/reports/GanttHeader.rb +2 -1
  495. data/lib/reports/GanttHeaderScaleItem.rb +2 -1
  496. data/lib/reports/GanttLine.rb +12 -10
  497. data/lib/reports/GanttLoadStack.rb +2 -1
  498. data/lib/reports/GanttMilestone.rb +3 -3
  499. data/lib/reports/GanttRouter.rb +4 -1
  500. data/lib/reports/GanttTaskBar.rb +9 -7
  501. data/lib/reports/HTMLGraphics.rb +2 -1
  502. data/lib/reports/Navigator.rb +2 -1
  503. data/lib/reports/NikuReport.rb +79 -49
  504. data/lib/reports/Report.rb +42 -10
  505. data/lib/reports/ReportBase.rb +2 -1
  506. data/lib/reports/ReportContext.rb +2 -1
  507. data/lib/reports/ReportTable.rb +2 -1
  508. data/lib/reports/ReportTableCell.rb +63 -28
  509. data/lib/reports/ReportTableColumn.rb +2 -1
  510. data/lib/reports/ReportTableLegend.rb +5 -5
  511. data/lib/reports/ReportTableLine.rb +2 -1
  512. data/lib/reports/ResourceListRE.rb +2 -1
  513. data/lib/reports/StatusSheetReport.rb +4 -2
  514. data/lib/reports/TableReport.rb +42 -38
  515. data/lib/reports/TaskListRE.rb +4 -2
  516. data/lib/reports/TextReport.rb +2 -1
  517. data/lib/reports/TimeSheetReport.rb +4 -2
  518. data/lib/reports/TjpExportRE.rb +4 -2
  519. data/lib/{taskjuggler3.rb → tj3.rb} +6 -5
  520. data/lib/tj3client.rb +19 -36
  521. data/lib/tj3d.rb +6 -2
  522. data/lib/tj3man.rb +4 -3
  523. data/lib/tj3ss_receiver.rb +2 -1
  524. data/lib/tj3ss_sender.rb +2 -1
  525. data/lib/tj3ts_receiver.rb +2 -1
  526. data/lib/tj3ts_sender.rb +2 -1
  527. data/lib/tj3ts_summary.rb +2 -1
  528. data/manual/Day_To_Day_Juggling +36 -0
  529. data/manual/How_To_Contribute +9 -4
  530. data/manual/Installation +10 -3
  531. data/manual/TaskJuggler_Internals +0 -2
  532. data/manual/Tutorial +25 -3
  533. data/prj_cfg.rb +4 -2
  534. data/spec/IntervalList_spec.rb +138 -0
  535. data/spec/ProjectBroker_spec.rb +133 -0
  536. data/tasks/changelog.rake +41 -24
  537. data/tasks/csts.rake +1 -0
  538. data/tasks/gem.rake +1 -0
  539. data/tasks/rcov.rake +1 -1
  540. data/tasks/spec.rake +7 -0
  541. data/tasks/test.rake +1 -0
  542. data/test/MessageChecker.rb +2 -1
  543. data/test/TestSuite/CSV-Reports/niku.tjp +70 -0
  544. data/test/TestSuite/CSV-Reports/{celltext-Reference.csv → refs/celltext.csv} +0 -0
  545. data/test/TestSuite/CSV-Reports/refs/niku.csv +5 -0
  546. data/test/TestSuite/CSV-Reports/{resourcereport-Reference.csv → refs/resourcereport.csv} +0 -0
  547. data/test/TestSuite/CSV-Reports/{resourcereport_with_tasks-Reference.csv → refs/resourcereport_with_tasks.csv} +0 -0
  548. data/test/TestSuite/CSV-Reports/{sortByTree-Reference.csv → refs/sortByTree.csv} +0 -0
  549. data/test/TestSuite/CSV-Reports/{sortBy_duration.down-Reference.csv → refs/sortBy_duration.down.csv} +0 -0
  550. data/test/TestSuite/CSV-Reports/{sortBy_effort.up-Reference.csv → refs/sortBy_effort.up.csv} +0 -0
  551. data/test/TestSuite/CSV-Reports/{sortBy_plan.start.down-Reference.csv → refs/sortBy_plan.start.down.csv} +0 -0
  552. data/test/TestSuite/CSV-Reports/{taskreport-Reference.csv → refs/taskreport.csv} +0 -0
  553. data/test/TestSuite/CSV-Reports/{taskreport_with_resources-Reference.csv → refs/taskreport_with_resources.csv} +0 -0
  554. data/test/TestSuite/CSV-Reports/{weekly-Reference.csv → refs/weekly.csv} +0 -0
  555. data/test/TestSuite/HTML-Reports/Alerts.tjp +12 -0
  556. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -2
  557. data/test/TestSuite/Scheduler/Correct/Container-2.tjp +1 -2
  558. data/test/TestSuite/Scheduler/Correct/InheritedAttributes.tjp +77 -0
  559. data/test/TestSuite/Scheduler/Correct/WeakDeps.tjp +40 -0
  560. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +2 -2
  561. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +3 -4
  562. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +2 -2
  563. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +8 -7
  564. data/test/TestSuite/Scheduler/Errors/onend_wrong_direction.tjp +19 -0
  565. data/test/TestSuite/Scheduler/Errors/onstart_wrong_direction.tjp +18 -0
  566. data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +1 -2
  567. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/boss_2002-03-02.tji +46 -0
  568. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/dev2_2002-03-02.tji +22 -0
  569. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/resources.yml +11 -0
  570. data/test/TestSuite/StatusSheets/StatusSheetTemplates/acceptable_intervals +1 -0
  571. data/test/TestSuite/StatusSheets/sender.log +256 -0
  572. data/test/TestSuite/StatusSheets/statussheets.log +9 -0
  573. data/test/TestSuite/StatusSheets/tj3d.log +395 -0
  574. data/test/TestSuite/Syntax/Correct/Limits-1.tjp +2 -0
  575. data/test/TestSuite/Syntax/Correct/Niku.tjp +6 -1
  576. data/test/TestSuite/Syntax/Correct/Scenario.tjp +4 -1
  577. data/test/TestSuite/Syntax/Correct/Supplement.tjp +12 -5
  578. data/test/TestSuite/Syntax/Correct/TaskPrefix.tji +3 -0
  579. data/test/TestSuite/Syntax/Correct/TaskPrefix.tjp +24 -0
  580. data/test/TestSuite/Syntax/Correct/css/tjreport.css +7 -2
  581. data/test/TestSuite/Syntax/Correct/tutorial.tjp +15 -5
  582. data/test/all.rb +2 -4
  583. data/test/test_BatchProcessor.rb +2 -1
  584. data/test/test_CSV-Reports.rb +34 -23
  585. data/test/test_CSVFile.rb +2 -1
  586. data/test/test_CollisionDetector.rb +3 -2
  587. data/test/test_Journal.rb +2 -1
  588. data/test/test_Limits.rb +2 -1
  589. data/test/test_LogicalExpression.rb +2 -1
  590. data/test/test_MacroTable.rb +2 -1
  591. data/test/test_Project.rb +3 -2
  592. data/test/test_ProjectFileScanner.rb +2 -1
  593. data/test/test_PropertySet.rb +2 -1
  594. data/test/test_Query.rb +2 -1
  595. data/test/test_RealFormat.rb +2 -1
  596. data/test/test_ReportGenerator.rb +2 -1
  597. data/test/test_RichText.rb +2 -1
  598. data/test/test_Scheduler.rb +2 -1
  599. data/test/test_ShiftAssignments.rb +2 -1
  600. data/test/test_SimpleQueryExpander.rb +2 -1
  601. data/test/test_Syntax.rb +2 -1
  602. data/test/test_TextFormatter.rb +3 -2
  603. data/test/test_TjTime.rb +2 -1
  604. data/test/test_TjpExample.rb +2 -1
  605. data/test/test_URLParameter.rb +2 -1
  606. data/test/test_UTF8String.rb +2 -1
  607. data/test/test_WorkingHours.rb +2 -1
  608. data/test/test_deep_copy.rb +2 -1
  609. metadata +74 -20
  610. data/doc/StringIO.html +0 -595
  611. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +0 -46
  612. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +0 -51
  613. data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +0 -11
@@ -133,6 +133,8 @@
133
133
 
134
134
  <li><a href="../TaskJuggler/AttributeDefinition.html">TaskJuggler::AttributeDefinition</a></li>
135
135
 
136
+ <li><a href="../TaskJuggler/AttributeOverwrite.html">TaskJuggler::AttributeOverwrite</a></li>
137
+
136
138
  <li><a href="../TaskJuggler/BatchProcessor.html">TaskJuggler::BatchProcessor</a></li>
137
139
 
138
140
  <li><a href="../TaskJuggler/Booking.html">TaskJuggler::Booking</a></li>
@@ -211,6 +213,8 @@
211
213
 
212
214
  <li><a href="../TaskJuggler/Interval.html">TaskJuggler::Interval</a></li>
213
215
 
216
+ <li><a href="../TaskJuggler/IntervalList.html">TaskJuggler::IntervalList</a></li>
217
+
214
218
  <li><a href="../TaskJuggler/IntervalListAttribute.html">TaskJuggler::IntervalListAttribute</a></li>
215
219
 
216
220
  <li><a href="../TaskJuggler/JobInfo.html">TaskJuggler::JobInfo</a></li>
@@ -243,6 +247,8 @@
243
247
 
244
248
  <li><a href="../TaskJuggler/LogicalExpressionAttribute.html">TaskJuggler::LogicalExpressionAttribute</a></li>
245
249
 
250
+ <li><a href="../TaskJuggler/LogicalExpressionListAttribute.html">TaskJuggler::LogicalExpressionListAttribute</a></li>
251
+
246
252
  <li><a href="../TaskJuggler/LogicalFlag.html">TaskJuggler::LogicalFlag</a></li>
247
253
 
248
254
  <li><a href="../TaskJuggler/LogicalFunction.html">TaskJuggler::LogicalFunction</a></li>
@@ -523,6 +529,8 @@
523
529
 
524
530
  <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
525
531
 
532
+ <li><a href="../TaskJuggler/WelcomePage.html">TaskJuggler::WelcomePage</a></li>
533
+
526
534
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
527
535
 
528
536
  <li><a href="../TaskJuggler/WorkingHoursAttribute.html">TaskJuggler::WorkingHoursAttribute</a></li>
@@ -549,8 +557,6 @@
549
557
 
550
558
  <li><a href="../String.html">String</a></li>
551
559
 
552
- <li><a href="../StringIO.html">StringIO</a></li>
553
-
554
560
  </ul>
555
561
  <div id="no-class-search-results" style="display: none;">No matching classes.</div>
556
562
  </div>
@@ -760,32 +766,32 @@ manage the loaded projects. There is one entry for each project in the
760
766
  <div class="method-source-code"
761
767
  id="new-source">
762
768
  <pre>
763
- <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 521</span>
764
- 521: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">tag</span>)
765
- 522: <span class="ruby-comment cmt"># Before we know the project ID we use this tag to uniquely identify the</span>
766
- 523: <span class="ruby-comment cmt"># project.</span>
767
- 524: <span class="ruby-ivar">@tag</span> = <span class="ruby-identifier">tag</span>
768
- 525: <span class="ruby-comment cmt"># Array of [ workingDir, tjp file, ... tji files ]</span>
769
- 526: <span class="ruby-ivar">@files</span> = <span class="ruby-keyword kw">nil</span>
770
- 527: <span class="ruby-comment cmt"># The authentication key for the ProjectServer process.</span>
771
- 528: <span class="ruby-ivar">@authKey</span> = <span class="ruby-keyword kw">nil</span>
772
- 529: <span class="ruby-comment cmt"># The DRb URI where the ProjectServer process is listening.</span>
773
- 530: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
774
- 531: <span class="ruby-comment cmt"># The ID of the project.</span>
775
- 532: <span class="ruby-ivar">@id</span> = <span class="ruby-keyword kw">nil</span>
776
- 533: <span class="ruby-comment cmt"># The state of the project. :new, :loading, :ready, :failed</span>
777
- 534: <span class="ruby-comment cmt"># and :obsolete are supported.</span>
778
- 535: <span class="ruby-ivar">@state</span> = <span class="ruby-value">:new</span>
779
- 536: <span class="ruby-comment cmt"># A time stamp when the project became ready for service.</span>
780
- 537: <span class="ruby-ivar">@readySince</span> = <span class="ruby-keyword kw">nil</span>
781
- 538: <span class="ruby-comment cmt"># True if any of the input files have been modified after the load.</span>
782
- 539: <span class="ruby-ivar">@modified</span> = <span class="ruby-keyword kw">false</span>
783
- 540: <span class="ruby-comment cmt"># True if the reload has already been triggered.</span>
784
- 541: <span class="ruby-ivar">@reloading</span> = <span class="ruby-keyword kw">false</span>
785
- 542:
786
- 543: <span class="ruby-ivar">@log</span> = <span class="ruby-constant">LogFile</span>.<span class="ruby-identifier">instance</span>
787
- 544: <span class="ruby-ivar">@projectServer</span> = <span class="ruby-keyword kw">nil</span>
788
- 545: <span class="ruby-keyword kw">end</span></pre>
769
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 573</span>
770
+ 573: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">tag</span>)
771
+ 574: <span class="ruby-comment cmt"># Before we know the project ID we use this tag to uniquely identify the</span>
772
+ 575: <span class="ruby-comment cmt"># project.</span>
773
+ 576: <span class="ruby-ivar">@tag</span> = <span class="ruby-identifier">tag</span>
774
+ 577: <span class="ruby-comment cmt"># Array of [ workingDir, tjp file, ... tji files ]</span>
775
+ 578: <span class="ruby-ivar">@files</span> = <span class="ruby-keyword kw">nil</span>
776
+ 579: <span class="ruby-comment cmt"># The authentication key for the ProjectServer process.</span>
777
+ 580: <span class="ruby-ivar">@authKey</span> = <span class="ruby-keyword kw">nil</span>
778
+ 581: <span class="ruby-comment cmt"># The DRb URI where the ProjectServer process is listening.</span>
779
+ 582: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
780
+ 583: <span class="ruby-comment cmt"># The ID of the project.</span>
781
+ 584: <span class="ruby-ivar">@id</span> = <span class="ruby-keyword kw">nil</span>
782
+ 585: <span class="ruby-comment cmt"># The state of the project. :new, :loading, :ready, :failed</span>
783
+ 586: <span class="ruby-comment cmt"># and :obsolete are supported.</span>
784
+ 587: <span class="ruby-ivar">@state</span> = <span class="ruby-value">:new</span>
785
+ 588: <span class="ruby-comment cmt"># A time stamp when the project became ready for service.</span>
786
+ 589: <span class="ruby-ivar">@readySince</span> = <span class="ruby-keyword kw">nil</span>
787
+ 590: <span class="ruby-comment cmt"># True if any of the input files have been modified after the load.</span>
788
+ 591: <span class="ruby-ivar">@modified</span> = <span class="ruby-keyword kw">false</span>
789
+ 592: <span class="ruby-comment cmt"># True if the reload has already been triggered.</span>
790
+ 593: <span class="ruby-ivar">@reloading</span> = <span class="ruby-keyword kw">false</span>
791
+ 594:
792
+ 595: <span class="ruby-ivar">@log</span> = <span class="ruby-constant">LogFile</span>.<span class="ruby-identifier">instance</span>
793
+ 596: <span class="ruby-ivar">@projectServer</span> = <span class="ruby-keyword kw">nil</span>
794
+ 597: <span class="ruby-keyword kw">end</span></pre>
789
795
  </div>
790
796
 
791
797
  </div>
@@ -822,20 +828,20 @@ manage the loaded projects. There is one entry for each project in the
822
828
  <div class="method-source-code"
823
829
  id="ping-source">
824
830
  <pre>
825
- <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 547</span>
826
- 547: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">ping</span>
827
- 548: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@uri</span>
828
- 549:
829
- 550: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Sending ping to ProjectServer #{@uri}&quot;</span>)
830
- 551: <span class="ruby-keyword kw">begin</span>
831
- 552: <span class="ruby-ivar">@projectServer</span> = <span class="ruby-constant">DRbObject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@uri</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@projectServer</span>
832
- 553: <span class="ruby-ivar">@projectServer</span>.<span class="ruby-identifier">ping</span>(<span class="ruby-ivar">@authKey</span>)
833
- 554: <span class="ruby-keyword kw">rescue</span>
834
- 555: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Ping failed: #{$!}&quot;</span>)
835
- 556: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
836
- 557: <span class="ruby-keyword kw">end</span>
837
- 558: <span class="ruby-keyword kw">true</span>
838
- 559: <span class="ruby-keyword kw">end</span></pre>
831
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 599</span>
832
+ 599: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">ping</span>
833
+ 600: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@uri</span>
834
+ 601:
835
+ 602: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Sending ping to ProjectServer #{@uri}&quot;</span>)
836
+ 603: <span class="ruby-keyword kw">begin</span>
837
+ 604: <span class="ruby-ivar">@projectServer</span> = <span class="ruby-constant">DRbObject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@uri</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@projectServer</span>
838
+ 605: <span class="ruby-ivar">@projectServer</span>.<span class="ruby-identifier">ping</span>(<span class="ruby-ivar">@authKey</span>)
839
+ 606: <span class="ruby-keyword kw">rescue</span>
840
+ 607: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Ping failed: #{$!}&quot;</span>)
841
+ 608: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
842
+ 609: <span class="ruby-keyword kw">end</span>
843
+ 610: <span class="ruby-keyword kw">true</span>
844
+ 611: <span class="ruby-keyword kw">end</span></pre>
839
845
  </div>
840
846
 
841
847
  </div>
@@ -869,19 +875,19 @@ href="ProjectServer.html">ProjectServer</a>.
869
875
  <div class="method-source-code"
870
876
  id="terminate-erver-source">
871
877
  <pre>
872
- <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 562</span>
873
- 562: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">terminateServer</span>
874
- 563: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@uri</span>
875
- 564:
876
- 565: <span class="ruby-keyword kw">begin</span>
877
- 566: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Sending termination request to ProjectServer #{@uri}&quot;</span>)
878
- 567: <span class="ruby-ivar">@projectServer</span> = <span class="ruby-constant">DRbObject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@uri</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@projectServer</span>
879
- 568: <span class="ruby-ivar">@projectServer</span>.<span class="ruby-identifier">terminate</span>(<span class="ruby-ivar">@authKey</span>)
880
- 569: <span class="ruby-keyword kw">rescue</span>
881
- 570: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Termination of ProjectServer failed: #{$!}&quot;</span>)
882
- 571: <span class="ruby-keyword kw">end</span>
883
- 572: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
884
- 573: <span class="ruby-keyword kw">end</span></pre>
878
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 614</span>
879
+ 614: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">terminateServer</span>
880
+ 615: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@uri</span>
881
+ 616:
882
+ 617: <span class="ruby-keyword kw">begin</span>
883
+ 618: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Sending termination request to ProjectServer #{@uri}&quot;</span>)
884
+ 619: <span class="ruby-ivar">@projectServer</span> = <span class="ruby-constant">DRbObject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@uri</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@projectServer</span>
885
+ 620: <span class="ruby-ivar">@projectServer</span>.<span class="ruby-identifier">terminate</span>(<span class="ruby-ivar">@authKey</span>)
886
+ 621: <span class="ruby-keyword kw">rescue</span>
887
+ 622: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Termination of ProjectServer failed: #{$!}&quot;</span>)
888
+ 623: <span class="ruby-keyword kw">end</span>
889
+ 624: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
890
+ 625: <span class="ruby-keyword kw">end</span></pre>
885
891
  </div>
886
892
 
887
893
  </div>
@@ -914,11 +920,11 @@ This is used to generate the status table.
914
920
  <div class="method-source-code"
915
921
  id="to-s-source">
916
922
  <pre>
917
- <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 576</span>
918
- 576: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">format</span>, <span class="ruby-identifier">index</span>)
919
- 577: <span class="ruby-identifier">sprintf</span>(<span class="ruby-identifier">format</span>, <span class="ruby-identifier">index</span>, <span class="ruby-ivar">@id</span>, <span class="ruby-ivar">@state</span>, <span class="ruby-ivar">@modified</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'*'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">' '</span>,
920
- 578: <span class="ruby-ivar">@readySince</span> <span class="ruby-operator">?</span> <span class="ruby-ivar">@readySince</span>.<span class="ruby-identifier">to_s</span>(<span class="ruby-value str">'%Y-%m-%d %H:%M:%S'</span>) <span class="ruby-operator">:</span> <span class="ruby-value str">''</span>)
921
- 579: <span class="ruby-keyword kw">end</span></pre>
923
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectBroker.rb, line 628</span>
924
+ 628: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">format</span>, <span class="ruby-identifier">index</span>)
925
+ 629: <span class="ruby-identifier">sprintf</span>(<span class="ruby-identifier">format</span>, <span class="ruby-identifier">index</span>, <span class="ruby-ivar">@id</span>, <span class="ruby-ivar">@state</span>, <span class="ruby-ivar">@modified</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'*'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">' '</span>,
926
+ 630: <span class="ruby-ivar">@readySince</span> <span class="ruby-operator">?</span> <span class="ruby-ivar">@readySince</span>.<span class="ruby-identifier">to_s</span>(<span class="ruby-value str">'%Y-%m-%d %H:%M:%S'</span>) <span class="ruby-operator">:</span> <span class="ruby-value str">''</span>)
927
+ 631: <span class="ruby-keyword kw">end</span></pre>
922
928
  </div>
923
929
 
924
930
  </div>
@@ -152,6 +152,8 @@
152
152
 
153
153
  <li><a href="../TaskJuggler/AttributeDefinition.html">TaskJuggler::AttributeDefinition</a></li>
154
154
 
155
+ <li><a href="../TaskJuggler/AttributeOverwrite.html">TaskJuggler::AttributeOverwrite</a></li>
156
+
155
157
  <li><a href="../TaskJuggler/BatchProcessor.html">TaskJuggler::BatchProcessor</a></li>
156
158
 
157
159
  <li><a href="../TaskJuggler/Booking.html">TaskJuggler::Booking</a></li>
@@ -230,6 +232,8 @@
230
232
 
231
233
  <li><a href="../TaskJuggler/Interval.html">TaskJuggler::Interval</a></li>
232
234
 
235
+ <li><a href="../TaskJuggler/IntervalList.html">TaskJuggler::IntervalList</a></li>
236
+
233
237
  <li><a href="../TaskJuggler/IntervalListAttribute.html">TaskJuggler::IntervalListAttribute</a></li>
234
238
 
235
239
  <li><a href="../TaskJuggler/JobInfo.html">TaskJuggler::JobInfo</a></li>
@@ -262,6 +266,8 @@
262
266
 
263
267
  <li><a href="../TaskJuggler/LogicalExpressionAttribute.html">TaskJuggler::LogicalExpressionAttribute</a></li>
264
268
 
269
+ <li><a href="../TaskJuggler/LogicalExpressionListAttribute.html">TaskJuggler::LogicalExpressionListAttribute</a></li>
270
+
265
271
  <li><a href="../TaskJuggler/LogicalFlag.html">TaskJuggler::LogicalFlag</a></li>
266
272
 
267
273
  <li><a href="../TaskJuggler/LogicalFunction.html">TaskJuggler::LogicalFunction</a></li>
@@ -542,6 +548,8 @@
542
548
 
543
549
  <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
544
550
 
551
+ <li><a href="../TaskJuggler/WelcomePage.html">TaskJuggler::WelcomePage</a></li>
552
+
545
553
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
546
554
 
547
555
  <li><a href="../TaskJuggler/WorkingHoursAttribute.html">TaskJuggler::WorkingHoursAttribute</a></li>
@@ -568,8 +576,6 @@
568
576
 
569
577
  <li><a href="../String.html">String</a></li>
570
578
 
571
- <li><a href="../StringIO.html">StringIO</a></li>
572
-
573
579
  </ul>
574
580
  <div id="no-class-search-results" style="display: none;">No matching classes.</div>
575
581
  </div>
@@ -654,7 +660,7 @@ permit direct access to the <a href="ProjectServer.html">ProjectServer</a>.
654
660
  <div class="method-heading">
655
661
 
656
662
  <span class="method-name">new</span><span
657
- class="method-args">(projectData = nil, logConsole = false)</span>
663
+ class="method-args">(daemonAuthKey, projectData = nil, logConsole = false)</span>
658
664
  <span class="method-click-advice">click to toggle source</span>
659
665
 
660
666
  </div>
@@ -668,97 +674,98 @@ permit direct access to the <a href="ProjectServer.html">ProjectServer</a>.
668
674
  <div class="method-source-code"
669
675
  id="new-source">
670
676
  <pre>
671
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 40</span>
672
- 40: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">projectData</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">logConsole</span> = <span class="ruby-keyword kw">false</span>)
673
- 41: <span class="ruby-ivar">@projectData</span> = <span class="ruby-identifier">projectData</span>
674
- 42: <span class="ruby-comment cmt"># Since we are still in the ProjectBroker process, the current DRb</span>
675
- 43: <span class="ruby-comment cmt"># server is still the ProjectBroker DRb server.</span>
676
- 44: <span class="ruby-ivar">@daemonURI</span> = <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">current_server</span>.<span class="ruby-identifier">uri</span>
677
- 45: <span class="ruby-comment cmt"># Used later to store the DRbObject of the ProjectBroker.</span>
678
- 46: <span class="ruby-ivar">@daemon</span> = <span class="ruby-keyword kw">nil</span>
679
- 47: <span class="ruby-identifier">initIntercom</span>
680
- 48:
681
- 49: <span class="ruby-ivar">@logConsole</span> = <span class="ruby-identifier">logConsole</span>
682
- 50: <span class="ruby-ivar">@pid</span> = <span class="ruby-keyword kw">nil</span>
683
- 51: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
684
- 52:
685
- 53: <span class="ruby-comment cmt"># A reference to the TaskJuggler object that holds the project data.</span>
686
- 54: <span class="ruby-ivar">@tj</span> = <span class="ruby-keyword kw">nil</span>
687
- 55: <span class="ruby-comment cmt"># The current state of the project.</span>
688
- 56: <span class="ruby-ivar">@state</span> = <span class="ruby-value">:new</span>
689
- 57: <span class="ruby-comment cmt"># A time stamp when the last @state update happened.</span>
690
- 58: <span class="ruby-ivar">@stateUpdated</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
691
- 59: <span class="ruby-comment cmt"># A lock to protect access to @state</span>
692
- 60: <span class="ruby-ivar">@stateLock</span> = <span class="ruby-constant">Monitor</span>.<span class="ruby-identifier">new</span>
693
- 61:
694
- 62: <span class="ruby-comment cmt"># A Queue to asynchronously generate new ReportServer objects.</span>
695
- 63: <span class="ruby-ivar">@reportServerRequests</span> = <span class="ruby-constant">Queue</span>.<span class="ruby-identifier">new</span>
696
- 64:
697
- 65: <span class="ruby-comment cmt"># A list of active ReportServer objects</span>
698
- 66: <span class="ruby-ivar">@reportServers</span> = []
699
- 67: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">extend</span>(<span class="ruby-constant">MonitorMixin</span>)
700
- 68:
701
- 69: <span class="ruby-ivar">@lastPing</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
677
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 41</span>
678
+ 41: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">daemonAuthKey</span>, <span class="ruby-identifier">projectData</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">logConsole</span> = <span class="ruby-keyword kw">false</span>)
679
+ 42: <span class="ruby-ivar">@daemonAuthKey</span> = <span class="ruby-identifier">daemonAuthKey</span>
680
+ 43: <span class="ruby-ivar">@projectData</span> = <span class="ruby-identifier">projectData</span>
681
+ 44: <span class="ruby-comment cmt"># Since we are still in the ProjectBroker process, the current DRb</span>
682
+ 45: <span class="ruby-comment cmt"># server is still the ProjectBroker DRb server.</span>
683
+ 46: <span class="ruby-ivar">@daemonURI</span> = <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">current_server</span>.<span class="ruby-identifier">uri</span>
684
+ 47: <span class="ruby-comment cmt"># Used later to store the DRbObject of the ProjectBroker.</span>
685
+ 48: <span class="ruby-ivar">@daemon</span> = <span class="ruby-keyword kw">nil</span>
686
+ 49: <span class="ruby-identifier">initIntercom</span>
687
+ 50:
688
+ 51: <span class="ruby-ivar">@logConsole</span> = <span class="ruby-identifier">logConsole</span>
689
+ 52: <span class="ruby-ivar">@pid</span> = <span class="ruby-keyword kw">nil</span>
690
+ 53: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
691
+ 54:
692
+ 55: <span class="ruby-comment cmt"># A reference to the TaskJuggler object that holds the project data.</span>
693
+ 56: <span class="ruby-ivar">@tj</span> = <span class="ruby-keyword kw">nil</span>
694
+ 57: <span class="ruby-comment cmt"># The current state of the project.</span>
695
+ 58: <span class="ruby-ivar">@state</span> = <span class="ruby-value">:new</span>
696
+ 59: <span class="ruby-comment cmt"># A time stamp when the last @state update happened.</span>
697
+ 60: <span class="ruby-ivar">@stateUpdated</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
698
+ 61: <span class="ruby-comment cmt"># A lock to protect access to @state</span>
699
+ 62: <span class="ruby-ivar">@stateLock</span> = <span class="ruby-constant">Monitor</span>.<span class="ruby-identifier">new</span>
700
+ 63:
701
+ 64: <span class="ruby-comment cmt"># A Queue to asynchronously generate new ReportServer objects.</span>
702
+ 65: <span class="ruby-ivar">@reportServerRequests</span> = <span class="ruby-constant">Queue</span>.<span class="ruby-identifier">new</span>
703
+ 66:
704
+ 67: <span class="ruby-comment cmt"># A list of active ReportServer objects</span>
705
+ 68: <span class="ruby-ivar">@reportServers</span> = []
706
+ 69: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">extend</span>(<span class="ruby-constant">MonitorMixin</span>)
702
707
  70:
703
- 71: <span class="ruby-comment cmt"># We've started a DRb server before. This will continue to live somewhat</span>
704
- 72: <span class="ruby-comment cmt"># in the child. All attempts to create a DRb connection from the child</span>
705
- 73: <span class="ruby-comment cmt"># to the parent will end up in the child again. So we use a Pipe to</span>
706
- 74: <span class="ruby-comment cmt"># communicate the URI of the child DRb server to the parent. The</span>
707
- 75: <span class="ruby-comment cmt"># communication from the parent to the child is not affected by the</span>
708
- 76: <span class="ruby-comment cmt"># zombie DRb server in the child process.</span>
709
- 77: <span class="ruby-identifier">rd</span>, <span class="ruby-identifier">wr</span> = <span class="ruby-constant">IO</span>.<span class="ruby-identifier">pipe</span>
710
- 78:
711
- 79: <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@pid</span> = <span class="ruby-identifier">fork</span>) <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
712
- 80: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-value str">'ProjectServer fork failed'</span>)
713
- 81: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@pid</span>.<span class="ruby-identifier">nil?</span>
714
- 82: <span class="ruby-comment cmt"># This is the child</span>
715
- 83: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@logConsole</span>
716
- 84: <span class="ruby-comment cmt"># If the Broker wasn't daemonized, log stdout and stderr to PID</span>
717
- 85: <span class="ruby-comment cmt"># specific files.</span>
718
- 86: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">reopen</span>(<span class="ruby-node">&quot;tj3d.ps.#{$$}.stderr&quot;</span>, <span class="ruby-value str">'w'</span>)
719
- 87: <span class="ruby-identifier">$stdout</span>.<span class="ruby-identifier">reopen</span>(<span class="ruby-node">&quot;tj3d.ps.#{$$}.stdout&quot;</span>, <span class="ruby-value str">'w'</span>)
720
- 88: <span class="ruby-keyword kw">end</span>
721
- 89: <span class="ruby-keyword kw">begin</span>
722
- 90: <span class="ruby-identifier">$SAFE</span> = <span class="ruby-value">1</span>
723
- 91: <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">install_acl</span>(<span class="ruby-constant">ACL</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">] deny all allow 127.0.0.1 ]</span>))
724
- 92: <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">start_service</span>
725
- 93: <span class="ruby-identifier">iFace</span> = <span class="ruby-constant">ProjectServerIface</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>)
726
- 94: <span class="ruby-keyword kw">begin</span>
727
- 95: <span class="ruby-ivar">@uri</span> = <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">start_service</span>(<span class="ruby-value str">'druby://127.0.0.1:0'</span>, <span class="ruby-identifier">iFace</span>).<span class="ruby-identifier">uri</span>
728
- 96: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Project server is listening on #{@uri}&quot;</span>)
729
- 97: <span class="ruby-keyword kw">rescue</span>
730
- 98: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;ProjectServer can't start DRb: #{$!}&quot;</span>)
731
- 99: <span class="ruby-keyword kw">end</span>
732
- 100:
733
- 101: <span class="ruby-comment cmt"># Send the URI of the newly started DRb server to the parent process.</span>
734
- 102: <span class="ruby-identifier">rd</span>.<span class="ruby-identifier">close</span>
735
- 103: <span class="ruby-identifier">wr</span>.<span class="ruby-identifier">write</span> <span class="ruby-ivar">@uri</span>
736
- 104: <span class="ruby-identifier">wr</span>.<span class="ruby-identifier">close</span>
737
- 105:
738
- 106: <span class="ruby-comment cmt"># Start a Thread that waits for the @terminate flag to be set and does</span>
739
- 107: <span class="ruby-comment cmt"># other background tasks.</span>
740
- 108: <span class="ruby-identifier">startTerminator</span>
741
- 109: <span class="ruby-comment cmt"># Start another Thread that will be used to fork-off ReportServer</span>
742
- 110: <span class="ruby-comment cmt"># processes.</span>
743
- 111: <span class="ruby-identifier">startHousekeeping</span>
744
- 112:
745
- 113: <span class="ruby-comment cmt"># Cleanup the DRb threads</span>
746
- 114: <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">thread</span>.<span class="ruby-identifier">join</span>
747
- 115: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">'Project server terminated'</span>)
748
- 116: <span class="ruby-identifier">exit</span> <span class="ruby-value">0</span>
749
- 117: <span class="ruby-keyword kw">rescue</span>
750
- 118: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">to_s</span>
751
- 119: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
752
- 120: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;ProjectServer can't start DRb: #{$!}&quot;</span>)
753
- 121: <span class="ruby-keyword kw">end</span>
754
- 122: <span class="ruby-keyword kw">else</span>
755
- 123: <span class="ruby-comment cmt"># This is the parent</span>
756
- 124: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">detach</span>(<span class="ruby-ivar">@pid</span>)
757
- 125: <span class="ruby-identifier">wr</span>.<span class="ruby-identifier">close</span>
758
- 126: <span class="ruby-ivar">@uri</span> = <span class="ruby-identifier">rd</span>.<span class="ruby-identifier">read</span>
759
- 127: <span class="ruby-identifier">rd</span>.<span class="ruby-identifier">close</span>
760
- 128: <span class="ruby-keyword kw">end</span>
761
- 129: <span class="ruby-keyword kw">end</span></pre>
708
+ 71: <span class="ruby-ivar">@lastPing</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
709
+ 72:
710
+ 73: <span class="ruby-comment cmt"># We've started a DRb server before. This will continue to live somewhat</span>
711
+ 74: <span class="ruby-comment cmt"># in the child. All attempts to create a DRb connection from the child</span>
712
+ 75: <span class="ruby-comment cmt"># to the parent will end up in the child again. So we use a Pipe to</span>
713
+ 76: <span class="ruby-comment cmt"># communicate the URI of the child DRb server to the parent. The</span>
714
+ 77: <span class="ruby-comment cmt"># communication from the parent to the child is not affected by the</span>
715
+ 78: <span class="ruby-comment cmt"># zombie DRb server in the child process.</span>
716
+ 79: <span class="ruby-identifier">rd</span>, <span class="ruby-identifier">wr</span> = <span class="ruby-constant">IO</span>.<span class="ruby-identifier">pipe</span>
717
+ 80:
718
+ 81: <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@pid</span> = <span class="ruby-identifier">fork</span>) <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
719
+ 82: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-value str">'ProjectServer fork failed'</span>)
720
+ 83: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@pid</span>.<span class="ruby-identifier">nil?</span>
721
+ 84: <span class="ruby-comment cmt"># This is the child</span>
722
+ 85: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@logConsole</span>
723
+ 86: <span class="ruby-comment cmt"># If the Broker wasn't daemonized, log stdout and stderr to PID</span>
724
+ 87: <span class="ruby-comment cmt"># specific files.</span>
725
+ 88: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">reopen</span>(<span class="ruby-node">&quot;tj3d.ps.#{$$}.stderr&quot;</span>, <span class="ruby-value str">'w'</span>)
726
+ 89: <span class="ruby-identifier">$stdout</span>.<span class="ruby-identifier">reopen</span>(<span class="ruby-node">&quot;tj3d.ps.#{$$}.stdout&quot;</span>, <span class="ruby-value str">'w'</span>)
727
+ 90: <span class="ruby-keyword kw">end</span>
728
+ 91: <span class="ruby-keyword kw">begin</span>
729
+ 92: <span class="ruby-identifier">$SAFE</span> = <span class="ruby-value">1</span>
730
+ 93: <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">install_acl</span>(<span class="ruby-constant">ACL</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">] deny all allow 127.0.0.1 ]</span>))
731
+ 94: <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">start_service</span>
732
+ 95: <span class="ruby-identifier">iFace</span> = <span class="ruby-constant">ProjectServerIface</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>)
733
+ 96: <span class="ruby-keyword kw">begin</span>
734
+ 97: <span class="ruby-ivar">@uri</span> = <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">start_service</span>(<span class="ruby-value str">'druby://127.0.0.1:0'</span>, <span class="ruby-identifier">iFace</span>).<span class="ruby-identifier">uri</span>
735
+ 98: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Project server is listening on #{@uri}&quot;</span>)
736
+ 99: <span class="ruby-keyword kw">rescue</span>
737
+ 100: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;ProjectServer can't start DRb: #{$!}&quot;</span>)
738
+ 101: <span class="ruby-keyword kw">end</span>
739
+ 102:
740
+ 103: <span class="ruby-comment cmt"># Send the URI of the newly started DRb server to the parent process.</span>
741
+ 104: <span class="ruby-identifier">rd</span>.<span class="ruby-identifier">close</span>
742
+ 105: <span class="ruby-identifier">wr</span>.<span class="ruby-identifier">write</span> <span class="ruby-ivar">@uri</span>
743
+ 106: <span class="ruby-identifier">wr</span>.<span class="ruby-identifier">close</span>
744
+ 107:
745
+ 108: <span class="ruby-comment cmt"># Start a Thread that waits for the @terminate flag to be set and does</span>
746
+ 109: <span class="ruby-comment cmt"># other background tasks.</span>
747
+ 110: <span class="ruby-identifier">startTerminator</span>
748
+ 111: <span class="ruby-comment cmt"># Start another Thread that will be used to fork-off ReportServer</span>
749
+ 112: <span class="ruby-comment cmt"># processes.</span>
750
+ 113: <span class="ruby-identifier">startHousekeeping</span>
751
+ 114:
752
+ 115: <span class="ruby-comment cmt"># Cleanup the DRb threads</span>
753
+ 116: <span class="ruby-constant">DRb</span>.<span class="ruby-identifier">thread</span>.<span class="ruby-identifier">join</span>
754
+ 117: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">'Project server terminated'</span>)
755
+ 118: <span class="ruby-identifier">exit</span> <span class="ruby-value">0</span>
756
+ 119: <span class="ruby-keyword kw">rescue</span>
757
+ 120: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">to_s</span>
758
+ 121: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
759
+ 122: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;ProjectServer can't start DRb: #{$!}&quot;</span>)
760
+ 123: <span class="ruby-keyword kw">end</span>
761
+ 124: <span class="ruby-keyword kw">else</span>
762
+ 125: <span class="ruby-comment cmt"># This is the parent</span>
763
+ 126: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">detach</span>(<span class="ruby-ivar">@pid</span>)
764
+ 127: <span class="ruby-identifier">wr</span>.<span class="ruby-identifier">close</span>
765
+ 128: <span class="ruby-ivar">@uri</span> = <span class="ruby-identifier">rd</span>.<span class="ruby-identifier">read</span>
766
+ 129: <span class="ruby-identifier">rd</span>.<span class="ruby-identifier">close</span>
767
+ 130: <span class="ruby-keyword kw">end</span>
768
+ 131: <span class="ruby-keyword kw">end</span></pre>
762
769
  </div>
763
770
 
764
771
  </div>
@@ -797,12 +804,12 @@ Return the name of the loaded project or nil.
797
804
  <div class="method-source-code"
798
805
  id="get-roject-ame-source">
799
806
  <pre>
800
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 172</span>
801
- 172: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getProjectName</span>
802
- 173: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span>
803
- 174: <span class="ruby-identifier">restartTimer</span>
804
- 175: <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectName</span>
805
- 176: <span class="ruby-keyword kw">end</span></pre>
807
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 174</span>
808
+ 174: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getProjectName</span>
809
+ 175: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span>
810
+ 176: <span class="ruby-identifier">restartTimer</span>
811
+ 177: <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectName</span>
812
+ 178: <span class="ruby-keyword kw">end</span></pre>
806
813
  </div>
807
814
 
808
815
  </div>
@@ -835,18 +842,18 @@ Return a list of the HTML reports defined for the project.
835
842
  <div class="method-source-code"
836
843
  id="get-eport-ist-source">
837
844
  <pre>
838
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 179</span>
839
- 179: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getReportList</span>
840
- 180: <span class="ruby-keyword kw">return</span> [] <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span> <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">project</span> = <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">project</span>)
841
- 181: <span class="ruby-identifier">list</span> = []
842
- 182: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">reports</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">report</span><span class="ruby-operator">|</span>
843
- 183: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'formats'</span>).<span class="ruby-identifier">empty?</span>
844
- 184: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> [ <span class="ruby-identifier">report</span>.<span class="ruby-identifier">fullId</span>, <span class="ruby-identifier">report</span>.<span class="ruby-identifier">name</span> ]
845
- 185: <span class="ruby-keyword kw">end</span>
846
- 186: <span class="ruby-keyword kw">end</span>
847
- 187: <span class="ruby-identifier">restartTimer</span>
848
- 188: <span class="ruby-identifier">list</span>
849
- 189: <span class="ruby-keyword kw">end</span></pre>
845
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 181</span>
846
+ 181: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getReportList</span>
847
+ 182: <span class="ruby-keyword kw">return</span> [] <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span> <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">project</span> = <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">project</span>)
848
+ 183: <span class="ruby-identifier">list</span> = []
849
+ 184: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">reports</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">report</span><span class="ruby-operator">|</span>
850
+ 185: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'formats'</span>).<span class="ruby-identifier">empty?</span>
851
+ 186: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> [ <span class="ruby-identifier">report</span>.<span class="ruby-identifier">fullId</span>, <span class="ruby-identifier">report</span>.<span class="ruby-identifier">name</span> ]
852
+ 187: <span class="ruby-keyword kw">end</span>
853
+ 188: <span class="ruby-keyword kw">end</span>
854
+ 189: <span class="ruby-identifier">restartTimer</span>
855
+ 190: <span class="ruby-identifier">list</span>
856
+ 191: <span class="ruby-keyword kw">end</span></pre>
850
857
  </div>
851
858
 
852
859
  </div>
@@ -881,36 +888,36 @@ and the authentication key of this new server.
881
888
  <div class="method-source-code"
882
889
  id="get-eport-erver-source">
883
890
  <pre>
884
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 193</span>
885
- 193: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getReportServer</span>
886
- 194: <span class="ruby-comment cmt"># ReportServer objects only make sense for successfully scheduled</span>
887
- 195: <span class="ruby-comment cmt"># projects.</span>
888
- 196: <span class="ruby-keyword kw">return</span> [ <span class="ruby-keyword kw">nil</span>, <span class="ruby-keyword kw">nil</span> ] <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@state</span> <span class="ruby-operator">==</span> <span class="ruby-value">:ready</span>
889
- 197:
890
- 198: <span class="ruby-comment cmt"># The ReportServer will be created asynchronously in another Thread. To</span>
891
- 199: <span class="ruby-comment cmt"># find it in the @reportServers list, we create a unique tag to identify</span>
892
- 200: <span class="ruby-comment cmt"># it.</span>
893
- 201: <span class="ruby-identifier">tag</span> = <span class="ruby-identifier">rand</span>(<span class="ruby-value">99999999999999</span>)
894
- 202: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Pushing #{tag} onto report server request queue&quot;</span>)
895
- 203: <span class="ruby-ivar">@reportServerRequests</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">tag</span>)
896
- 204:
897
- 205: <span class="ruby-comment cmt"># Now wait until the new ReportServer shows up in the list.</span>
898
- 206: <span class="ruby-identifier">reportServer</span> = <span class="ruby-keyword kw">nil</span>
899
- 207: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">nil?</span>
900
- 208: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
901
- 209: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">rs</span><span class="ruby-operator">|</span>
902
- 210: <span class="ruby-identifier">reportServer</span> = <span class="ruby-identifier">rs</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">tag</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">tag</span>
903
- 211: <span class="ruby-keyword kw">end</span>
904
- 212: <span class="ruby-keyword kw">end</span>
905
- 213: <span class="ruby-comment cmt"># It should not take that long, so we use a short idle time here.</span>
906
- 214: <span class="ruby-identifier">sleep</span> <span class="ruby-value">0.1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">nil?</span>
907
- 215: <span class="ruby-keyword kw">end</span>
908
- 216:
909
- 217: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Got report server with URI #{reportServer.uri} for &quot;</span> <span class="ruby-operator">+</span>
910
- 218: <span class="ruby-node">&quot;tag #{tag}&quot;</span>)
911
- 219: <span class="ruby-identifier">restartTimer</span>
912
- 220: [ <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">uri</span>, <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">authKey</span> ]
913
- 221: <span class="ruby-keyword kw">end</span></pre>
891
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 195</span>
892
+ 195: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getReportServer</span>
893
+ 196: <span class="ruby-comment cmt"># ReportServer objects only make sense for successfully scheduled</span>
894
+ 197: <span class="ruby-comment cmt"># projects.</span>
895
+ 198: <span class="ruby-keyword kw">return</span> [ <span class="ruby-keyword kw">nil</span>, <span class="ruby-keyword kw">nil</span> ] <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@state</span> <span class="ruby-operator">==</span> <span class="ruby-value">:ready</span>
896
+ 199:
897
+ 200: <span class="ruby-comment cmt"># The ReportServer will be created asynchronously in another Thread. To</span>
898
+ 201: <span class="ruby-comment cmt"># find it in the @reportServers list, we create a unique tag to identify</span>
899
+ 202: <span class="ruby-comment cmt"># it.</span>
900
+ 203: <span class="ruby-identifier">tag</span> = <span class="ruby-identifier">rand</span>(<span class="ruby-value">99999999999999</span>)
901
+ 204: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Pushing #{tag} onto report server request queue&quot;</span>)
902
+ 205: <span class="ruby-ivar">@reportServerRequests</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">tag</span>)
903
+ 206:
904
+ 207: <span class="ruby-comment cmt"># Now wait until the new ReportServer shows up in the list.</span>
905
+ 208: <span class="ruby-identifier">reportServer</span> = <span class="ruby-keyword kw">nil</span>
906
+ 209: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">nil?</span>
907
+ 210: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
908
+ 211: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">rs</span><span class="ruby-operator">|</span>
909
+ 212: <span class="ruby-identifier">reportServer</span> = <span class="ruby-identifier">rs</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">tag</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">tag</span>
910
+ 213: <span class="ruby-keyword kw">end</span>
911
+ 214: <span class="ruby-keyword kw">end</span>
912
+ 215: <span class="ruby-comment cmt"># It should not take that long, so we use a short idle time here.</span>
913
+ 216: <span class="ruby-identifier">sleep</span> <span class="ruby-value">0.1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">nil?</span>
914
+ 217: <span class="ruby-keyword kw">end</span>
915
+ 218:
916
+ 219: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Got report server with URI #{reportServer.uri} for &quot;</span> <span class="ruby-operator">+</span>
917
+ 220: <span class="ruby-node">&quot;tag #{tag}&quot;</span>)
918
+ 221: <span class="ruby-identifier">restartTimer</span>
919
+ 222: [ <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">uri</span>, <span class="ruby-identifier">reportServer</span>.<span class="ruby-identifier">authKey</span> ]
920
+ 223: <span class="ruby-keyword kw">end</span></pre>
914
921
  </div>
915
922
 
916
923
  </div>
@@ -947,41 +954,41 @@ Additionally a list of optional .tji files can be provided.
947
954
  <div class="method-source-code"
948
955
  id="load-roject-source">
949
956
  <pre>
950
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 136</span>
951
- 136: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">loadProject</span>(<span class="ruby-identifier">args</span>)
952
- 137: <span class="ruby-identifier">dirAndFiles</span> = <span class="ruby-identifier">args</span>.<span class="ruby-identifier">dup</span>.<span class="ruby-identifier">untaint</span>
953
- 138: <span class="ruby-comment cmt"># The first argument is the working directory</span>
954
- 139: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">chdir</span>(<span class="ruby-identifier">args</span>.<span class="ruby-identifier">shift</span>.<span class="ruby-identifier">untaint</span>)
955
- 140:
956
- 141: <span class="ruby-comment cmt"># Save a time stamp of when the project file loading started.</span>
957
- 142: <span class="ruby-ivar">@modifiedCheck</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
958
- 143:
959
- 144: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:loading</span>, <span class="ruby-identifier">dirAndFiles</span>, <span class="ruby-keyword kw">false</span>)
960
- 145: <span class="ruby-ivar">@tj</span> = <span class="ruby-constant">TaskJuggler</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">true</span>)
961
- 146:
962
- 147: <span class="ruby-comment cmt"># Parse all project files</span>
963
- 148: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">args</span>, <span class="ruby-keyword kw">true</span>)
964
- 149: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Parsing of #{args.join(' ')} failed&quot;</span>)
965
- 150: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:failed</span>, <span class="ruby-keyword kw">nil</span>, <span class="ruby-keyword kw">false</span>)
966
- 151: <span class="ruby-ivar">@terminate</span> = <span class="ruby-keyword kw">true</span>
967
- 152: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
968
- 153: <span class="ruby-keyword kw">end</span>
969
- 154:
970
- 155: <span class="ruby-comment cmt"># Then schedule the project</span>
971
- 156: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">schedule</span>
972
- 157: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Scheduling of project #{@tj.projectId} failed&quot;</span>)
973
- 158: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:failed</span>, <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">false</span>)
974
- 159: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">exit</span>(<span class="ruby-value str">'scheduler'</span>)
975
- 160: <span class="ruby-ivar">@terminate</span> = <span class="ruby-keyword kw">true</span>
976
- 161: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
977
- 162: <span class="ruby-keyword kw">end</span>
978
- 163:
979
- 164: <span class="ruby-comment cmt"># Great, everything went fine. We've got a project to work with.</span>
980
- 165: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:ready</span>, <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">false</span>)
981
- 166: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Project #{@tj.projectId} loaded&quot;</span>)
982
- 167: <span class="ruby-identifier">restartTimer</span>
983
- 168: <span class="ruby-keyword kw">true</span>
984
- 169: <span class="ruby-keyword kw">end</span></pre>
957
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 138</span>
958
+ 138: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">loadProject</span>(<span class="ruby-identifier">args</span>)
959
+ 139: <span class="ruby-identifier">dirAndFiles</span> = <span class="ruby-identifier">args</span>.<span class="ruby-identifier">dup</span>.<span class="ruby-identifier">untaint</span>
960
+ 140: <span class="ruby-comment cmt"># The first argument is the working directory</span>
961
+ 141: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">chdir</span>(<span class="ruby-identifier">args</span>.<span class="ruby-identifier">shift</span>.<span class="ruby-identifier">untaint</span>)
962
+ 142:
963
+ 143: <span class="ruby-comment cmt"># Save a time stamp of when the project file loading started.</span>
964
+ 144: <span class="ruby-ivar">@modifiedCheck</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
965
+ 145:
966
+ 146: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:loading</span>, <span class="ruby-identifier">dirAndFiles</span>, <span class="ruby-keyword kw">false</span>)
967
+ 147: <span class="ruby-ivar">@tj</span> = <span class="ruby-constant">TaskJuggler</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">true</span>)
968
+ 148:
969
+ 149: <span class="ruby-comment cmt"># Parse all project files</span>
970
+ 150: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">args</span>, <span class="ruby-keyword kw">true</span>)
971
+ 151: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Parsing of #{args.join(' ')} failed&quot;</span>)
972
+ 152: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:failed</span>, <span class="ruby-keyword kw">nil</span>, <span class="ruby-keyword kw">false</span>)
973
+ 153: <span class="ruby-ivar">@terminate</span> = <span class="ruby-keyword kw">true</span>
974
+ 154: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
975
+ 155: <span class="ruby-keyword kw">end</span>
976
+ 156:
977
+ 157: <span class="ruby-comment cmt"># Then schedule the project</span>
978
+ 158: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">schedule</span>
979
+ 159: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Scheduling of project #{@tj.projectId} failed&quot;</span>)
980
+ 160: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:failed</span>, <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">false</span>)
981
+ 161: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">exit</span>(<span class="ruby-value str">'scheduler'</span>)
982
+ 162: <span class="ruby-ivar">@terminate</span> = <span class="ruby-keyword kw">true</span>
983
+ 163: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
984
+ 164: <span class="ruby-keyword kw">end</span>
985
+ 165:
986
+ 166: <span class="ruby-comment cmt"># Great, everything went fine. We've got a project to work with.</span>
987
+ 167: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:ready</span>, <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">false</span>)
988
+ 168: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Project #{@tj.projectId} loaded&quot;</span>)
989
+ 169: <span class="ruby-identifier">restartTimer</span>
990
+ 170: <span class="ruby-keyword kw">true</span>
991
+ 171: <span class="ruby-keyword kw">end</span></pre>
985
992
  </div>
986
993
 
987
994
  </div>
@@ -1016,24 +1023,24 @@ href="ProjectServer.html">ProjectServer</a> is still operating properly.
1016
1023
  <div class="method-source-code"
1017
1024
  id="ping-source">
1018
1025
  <pre>
1019
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 225</span>
1020
- 225: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">ping</span>
1021
- 226: <span class="ruby-comment cmt"># Store the time stamp. If we don't get the ping for some time, we</span>
1022
- 227: <span class="ruby-comment cmt"># assume the ProjectBroker has died.</span>
1023
- 228: <span class="ruby-ivar">@lastPing</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
1024
- 229:
1025
- 230: <span class="ruby-comment cmt"># Now also check our ReportServers if they are still there. If not, we</span>
1026
- 231: <span class="ruby-comment cmt"># can remove them from the @reportServers list.</span>
1027
- 232: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
1028
- 233: <span class="ruby-identifier">deadServers</span> = []
1029
- 234: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">rs</span><span class="ruby-operator">|</span>
1030
- 235: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">ping</span>
1031
- 236: <span class="ruby-identifier">deadServers</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">rs</span>
1032
- 237: <span class="ruby-keyword kw">end</span>
1033
- 238: <span class="ruby-keyword kw">end</span>
1034
- 239: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">rs</span><span class="ruby-operator">|</span> <span class="ruby-identifier">deadServers</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">rs</span>) }
1035
- 240: <span class="ruby-keyword kw">end</span>
1036
- 241: <span class="ruby-keyword kw">end</span></pre>
1026
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 227</span>
1027
+ 227: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">ping</span>
1028
+ 228: <span class="ruby-comment cmt"># Store the time stamp. If we don't get the ping for some time, we</span>
1029
+ 229: <span class="ruby-comment cmt"># assume the ProjectBroker has died.</span>
1030
+ 230: <span class="ruby-ivar">@lastPing</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
1031
+ 231:
1032
+ 232: <span class="ruby-comment cmt"># Now also check our ReportServers if they are still there. If not, we</span>
1033
+ 233: <span class="ruby-comment cmt"># can remove them from the @reportServers list.</span>
1034
+ 234: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
1035
+ 235: <span class="ruby-identifier">deadServers</span> = []
1036
+ 236: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">rs</span><span class="ruby-operator">|</span>
1037
+ 237: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">ping</span>
1038
+ 238: <span class="ruby-identifier">deadServers</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">rs</span>
1039
+ 239: <span class="ruby-keyword kw">end</span>
1040
+ 240: <span class="ruby-keyword kw">end</span>
1041
+ 241: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">rs</span><span class="ruby-operator">|</span> <span class="ruby-identifier">deadServers</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">rs</span>) }
1042
+ 242: <span class="ruby-keyword kw">end</span>
1043
+ 243: <span class="ruby-keyword kw">end</span></pre>
1037
1044
  </div>
1038
1045
 
1039
1046
  </div>
@@ -1070,77 +1077,77 @@ href="ProjectServer.html">ProjectServer</a> is still operating properly.
1070
1077
  <div class="method-source-code"
1071
1078
  id="start-ousekeeping-source">
1072
1079
  <pre>
1073
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 262</span>
1074
- 262: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">startHousekeeping</span>
1075
- 263: <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
1076
- 264: <span class="ruby-keyword kw">begin</span>
1077
- 265: <span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
1078
- 266: <span class="ruby-comment cmt"># Was the project data provided during object creation?</span>
1079
- 267: <span class="ruby-comment cmt"># Then we load the data here.</span>
1080
- 268: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@projectData</span>
1081
- 269: <span class="ruby-identifier">loadProject</span>(<span class="ruby-ivar">@projectData</span>)
1082
- 270: <span class="ruby-ivar">@projectData</span> = <span class="ruby-keyword kw">nil</span>
1083
- 271: <span class="ruby-keyword kw">end</span>
1084
- 272:
1085
- 273: <span class="ruby-comment cmt"># Check every 60 seconds if the input files have been modified.</span>
1086
- 274: <span class="ruby-comment cmt"># Don't check if we already know it has been modified.</span>
1087
- 275: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@stateLock</span>.<span class="ruby-identifier">synchronize</span> { <span class="ruby-ivar">@state</span> <span class="ruby-operator">==</span> <span class="ruby-value">:ready</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@modified</span> <span class="ruby-operator">&amp;&amp;</span>
1088
- 276: <span class="ruby-ivar">@modifiedCheck</span> <span class="ruby-operator">+</span> <span class="ruby-value">60</span> <span class="ruby-operator">&lt;</span> <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> }
1089
- 277: <span class="ruby-comment cmt"># Reset the timer</span>
1090
- 278: <span class="ruby-ivar">@stateLock</span>.<span class="ruby-identifier">synchronize</span> { <span class="ruby-ivar">@modifiedCheck</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> }
1091
- 279:
1092
- 280: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">project</span>.<span class="ruby-identifier">inputFiles</span>.<span class="ruby-identifier">modified?</span>
1093
- 281: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Project #{@tj.projectId} has been modified&quot;</span>)
1094
- 282: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:ready</span>, <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">true</span>)
1095
- 283: <span class="ruby-keyword kw">end</span>
1096
- 284: <span class="ruby-keyword kw">end</span>
1097
- 285:
1098
- 286: <span class="ruby-comment cmt"># Check for pending requests for new ReportServers.</span>
1099
- 287: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@reportServerRequests</span>.<span class="ruby-identifier">empty?</span>
1100
- 288: <span class="ruby-identifier">tag</span> = <span class="ruby-ivar">@reportServerRequests</span>.<span class="ruby-identifier">pop</span>
1101
- 289: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Popped #{tag}&quot;</span>)
1102
- 290: <span class="ruby-comment cmt"># Create an new entry for the @reportServers list.</span>
1103
- 291: <span class="ruby-identifier">rsr</span> = <span class="ruby-constant">ReportServerRecord</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">tag</span>)
1104
- 292: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">&quot;RSR created&quot;</span>)
1105
- 293: <span class="ruby-comment cmt"># Create a new ReportServer object that runs as a separate</span>
1106
- 294: <span class="ruby-comment cmt"># process. The constructor will tell us the URI and authentication</span>
1107
- 295: <span class="ruby-comment cmt"># key of the new ReportServer.</span>
1108
- 296: <span class="ruby-identifier">rs</span> = <span class="ruby-constant">ReportServer</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@tj</span>, <span class="ruby-ivar">@logConsole</span>)
1109
- 297: <span class="ruby-identifier">rsr</span>.<span class="ruby-identifier">uri</span> = <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">uri</span>
1110
- 298: <span class="ruby-identifier">rsr</span>.<span class="ruby-identifier">authKey</span> = <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">authKey</span>
1111
- 299: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Adding ReportServer with URI #{rsr.uri} to list&quot;</span>)
1112
- 300: <span class="ruby-comment cmt"># Add the new ReportServer to our list.</span>
1113
- 301: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
1114
- 302: <span class="ruby-ivar">@reportServers</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">rsr</span>
1115
- 303: <span class="ruby-keyword kw">end</span>
1116
- 304: <span class="ruby-keyword kw">end</span>
1117
- 305:
1118
- 306: <span class="ruby-comment cmt"># Some state changing operations are not atomic. Since the client</span>
1119
- 307: <span class="ruby-comment cmt"># can die during the transaction, the server might hang in some</span>
1120
- 308: <span class="ruby-comment cmt"># states. Here we define timeout for each state. If the timeout is</span>
1121
- 309: <span class="ruby-comment cmt"># not 0 and exceeded, we immediately terminate the process.</span>
1122
- 310: <span class="ruby-identifier">timeouts</span> = { <span class="ruby-value">:new</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">10</span>, <span class="ruby-value">:loading</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">15</span> * <span class="ruby-value">60</span>, <span class="ruby-value">:failed</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">60</span>,
1123
- 311: <span class="ruby-value">:ready</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> }
1124
- 312: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">timeouts</span>[<span class="ruby-ivar">@state</span>] <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span>
1125
- 313: <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@stateUpdated</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">timeouts</span>[<span class="ruby-ivar">@state</span>]
1126
- 314: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;Reached timeout for state #{@state}. Terminating.&quot;</span>)
1127
- 315: <span class="ruby-keyword kw">end</span>
1128
- 316:
1129
- 317: <span class="ruby-comment cmt"># If we have not received a ping from the ProjectBroker for 2</span>
1130
- 318: <span class="ruby-comment cmt"># minutes, we assume it has died and terminate as well.</span>
1131
- 319: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@lastPing</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">180</span>
1132
- 320: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-value str">'Heartbeat from daemon lost. Terminating.'</span>)
1133
- 321: <span class="ruby-keyword kw">end</span>
1134
- 322: <span class="ruby-identifier">sleep</span> <span class="ruby-value">1</span>
1135
- 323: <span class="ruby-keyword kw">end</span>
1136
- 324: <span class="ruby-keyword kw">rescue</span>
1137
- 325: <span class="ruby-comment cmt"># Make sure we get a backtrace for this thread.</span>
1138
- 326: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">to_s</span>
1139
- 327: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
1140
- 328: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;ProjectServer housekeeping error: #{$!}&quot;</span>)
1141
- 329: <span class="ruby-keyword kw">end</span>
1142
- 330: <span class="ruby-keyword kw">end</span>
1143
- 331: <span class="ruby-keyword kw">end</span></pre>
1080
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 264</span>
1081
+ 264: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">startHousekeeping</span>
1082
+ 265: <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
1083
+ 266: <span class="ruby-keyword kw">begin</span>
1084
+ 267: <span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
1085
+ 268: <span class="ruby-comment cmt"># Was the project data provided during object creation?</span>
1086
+ 269: <span class="ruby-comment cmt"># Then we load the data here.</span>
1087
+ 270: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@projectData</span>
1088
+ 271: <span class="ruby-identifier">loadProject</span>(<span class="ruby-ivar">@projectData</span>)
1089
+ 272: <span class="ruby-ivar">@projectData</span> = <span class="ruby-keyword kw">nil</span>
1090
+ 273: <span class="ruby-keyword kw">end</span>
1091
+ 274:
1092
+ 275: <span class="ruby-comment cmt"># Check every 60 seconds if the input files have been modified.</span>
1093
+ 276: <span class="ruby-comment cmt"># Don't check if we already know it has been modified.</span>
1094
+ 277: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@stateLock</span>.<span class="ruby-identifier">synchronize</span> { <span class="ruby-ivar">@state</span> <span class="ruby-operator">==</span> <span class="ruby-value">:ready</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@modified</span> <span class="ruby-operator">&amp;&amp;</span>
1095
+ 278: <span class="ruby-ivar">@modifiedCheck</span> <span class="ruby-operator">+</span> <span class="ruby-value">60</span> <span class="ruby-operator">&lt;</span> <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> }
1096
+ 279: <span class="ruby-comment cmt"># Reset the timer</span>
1097
+ 280: <span class="ruby-ivar">@stateLock</span>.<span class="ruby-identifier">synchronize</span> { <span class="ruby-ivar">@modifiedCheck</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> }
1098
+ 281:
1099
+ 282: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">project</span>.<span class="ruby-identifier">inputFiles</span>.<span class="ruby-identifier">modified?</span>
1100
+ 283: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Project #{@tj.projectId} has been modified&quot;</span>)
1101
+ 284: <span class="ruby-identifier">updateState</span>(<span class="ruby-value">:ready</span>, <span class="ruby-ivar">@tj</span>.<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">true</span>)
1102
+ 285: <span class="ruby-keyword kw">end</span>
1103
+ 286: <span class="ruby-keyword kw">end</span>
1104
+ 287:
1105
+ 288: <span class="ruby-comment cmt"># Check for pending requests for new ReportServers.</span>
1106
+ 289: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@reportServerRequests</span>.<span class="ruby-identifier">empty?</span>
1107
+ 290: <span class="ruby-identifier">tag</span> = <span class="ruby-ivar">@reportServerRequests</span>.<span class="ruby-identifier">pop</span>
1108
+ 291: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Popped #{tag}&quot;</span>)
1109
+ 292: <span class="ruby-comment cmt"># Create an new entry for the @reportServers list.</span>
1110
+ 293: <span class="ruby-identifier">rsr</span> = <span class="ruby-constant">ReportServerRecord</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">tag</span>)
1111
+ 294: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">&quot;RSR created&quot;</span>)
1112
+ 295: <span class="ruby-comment cmt"># Create a new ReportServer object that runs as a separate</span>
1113
+ 296: <span class="ruby-comment cmt"># process. The constructor will tell us the URI and authentication</span>
1114
+ 297: <span class="ruby-comment cmt"># key of the new ReportServer.</span>
1115
+ 298: <span class="ruby-identifier">rs</span> = <span class="ruby-constant">ReportServer</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@tj</span>, <span class="ruby-ivar">@logConsole</span>)
1116
+ 299: <span class="ruby-identifier">rsr</span>.<span class="ruby-identifier">uri</span> = <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">uri</span>
1117
+ 300: <span class="ruby-identifier">rsr</span>.<span class="ruby-identifier">authKey</span> = <span class="ruby-identifier">rs</span>.<span class="ruby-identifier">authKey</span>
1118
+ 301: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Adding ReportServer with URI #{rsr.uri} to list&quot;</span>)
1119
+ 302: <span class="ruby-comment cmt"># Add the new ReportServer to our list.</span>
1120
+ 303: <span class="ruby-ivar">@reportServers</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
1121
+ 304: <span class="ruby-ivar">@reportServers</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">rsr</span>
1122
+ 305: <span class="ruby-keyword kw">end</span>
1123
+ 306: <span class="ruby-keyword kw">end</span>
1124
+ 307:
1125
+ 308: <span class="ruby-comment cmt"># Some state changing operations are not atomic. Since the client</span>
1126
+ 309: <span class="ruby-comment cmt"># can die during the transaction, the server might hang in some</span>
1127
+ 310: <span class="ruby-comment cmt"># states. Here we define timeout for each state. If the timeout is</span>
1128
+ 311: <span class="ruby-comment cmt"># not 0 and exceeded, we immediately terminate the process.</span>
1129
+ 312: <span class="ruby-identifier">timeouts</span> = { <span class="ruby-value">:new</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">10</span>, <span class="ruby-value">:loading</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">15</span> * <span class="ruby-value">60</span>, <span class="ruby-value">:failed</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">60</span>,
1130
+ 313: <span class="ruby-value">:ready</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> }
1131
+ 314: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">timeouts</span>[<span class="ruby-ivar">@state</span>] <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span>
1132
+ 315: <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@stateUpdated</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">timeouts</span>[<span class="ruby-ivar">@state</span>]
1133
+ 316: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;Reached timeout for state #{@state}. Terminating.&quot;</span>)
1134
+ 317: <span class="ruby-keyword kw">end</span>
1135
+ 318:
1136
+ 319: <span class="ruby-comment cmt"># If we have not received a ping from the ProjectBroker for 2</span>
1137
+ 320: <span class="ruby-comment cmt"># minutes, we assume it has died and terminate as well.</span>
1138
+ 321: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@lastPing</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">180</span>
1139
+ 322: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-value str">'Heartbeat from daemon lost. Terminating.'</span>)
1140
+ 323: <span class="ruby-keyword kw">end</span>
1141
+ 324: <span class="ruby-identifier">sleep</span> <span class="ruby-value">1</span>
1142
+ 325: <span class="ruby-keyword kw">end</span>
1143
+ 326: <span class="ruby-keyword kw">rescue</span>
1144
+ 327: <span class="ruby-comment cmt"># Make sure we get a backtrace for this thread.</span>
1145
+ 328: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">to_s</span>
1146
+ 329: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
1147
+ 330: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;ProjectServer housekeeping error: #{$!}&quot;</span>)
1148
+ 331: <span class="ruby-keyword kw">end</span>
1149
+ 332: <span class="ruby-keyword kw">end</span>
1150
+ 333: <span class="ruby-keyword kw">end</span></pre>
1144
1151
  </div>
1145
1152
 
1146
1153
  </div>
@@ -1174,21 +1181,21 @@ project locally and remotely.
1174
1181
  <div class="method-source-code"
1175
1182
  id="update-tate-source">
1176
1183
  <pre>
1177
- <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 247</span>
1178
- 247: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">updateState</span>(<span class="ruby-identifier">state</span>, <span class="ruby-identifier">filesOrId</span>, <span class="ruby-identifier">modified</span>)
1179
- 248: <span class="ruby-keyword kw">begin</span>
1180
- 249: <span class="ruby-ivar">@daemon</span> = <span class="ruby-constant">DRbObject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@daemonURI</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@daemon</span>
1181
- 250: <span class="ruby-ivar">@daemon</span>.<span class="ruby-identifier">updateState</span>(<span class="ruby-ivar">@authKey</span>, <span class="ruby-identifier">filesOrId</span>, <span class="ruby-identifier">state</span>, <span class="ruby-identifier">modified</span>)
1182
- 251: <span class="ruby-keyword kw">rescue</span>
1183
- 252: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;Can't update state with daemon: #{$!}&quot;</span>)
1184
- 253: <span class="ruby-keyword kw">end</span>
1185
- 254: <span class="ruby-ivar">@stateLock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
1186
- 255: <span class="ruby-ivar">@state</span> = <span class="ruby-identifier">state</span>
1187
- 256: <span class="ruby-ivar">@stateUpdated</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
1188
- 257: <span class="ruby-ivar">@modified</span> = <span class="ruby-identifier">modified</span>
1189
- 258: <span class="ruby-ivar">@modifiedCheck</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
1190
- 259: <span class="ruby-keyword kw">end</span>
1191
- 260: <span class="ruby-keyword kw">end</span></pre>
1184
+ <span class="ruby-comment cmt"># File lib/daemon/ProjectServer.rb, line 249</span>
1185
+ 249: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">updateState</span>(<span class="ruby-identifier">state</span>, <span class="ruby-identifier">filesOrId</span>, <span class="ruby-identifier">modified</span>)
1186
+ 250: <span class="ruby-keyword kw">begin</span>
1187
+ 251: <span class="ruby-ivar">@daemon</span> = <span class="ruby-constant">DRbObject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@daemonURI</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@daemon</span>
1188
+ 252: <span class="ruby-ivar">@daemon</span>.<span class="ruby-identifier">updateState</span>(<span class="ruby-ivar">@daemonAuthKey</span>, <span class="ruby-ivar">@authKey</span>, <span class="ruby-identifier">filesOrId</span>, <span class="ruby-identifier">state</span>, <span class="ruby-identifier">modified</span>)
1189
+ 253: <span class="ruby-keyword kw">rescue</span>
1190
+ 254: <span class="ruby-ivar">@log</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-node">&quot;Can't update state with daemon: #{$!}&quot;</span>)
1191
+ 255: <span class="ruby-keyword kw">end</span>
1192
+ 256: <span class="ruby-ivar">@stateLock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
1193
+ 257: <span class="ruby-ivar">@state</span> = <span class="ruby-identifier">state</span>
1194
+ 258: <span class="ruby-ivar">@stateUpdated</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
1195
+ 259: <span class="ruby-ivar">@modified</span> = <span class="ruby-identifier">modified</span>
1196
+ 260: <span class="ruby-ivar">@modifiedCheck</span> = <span class="ruby-constant">TjTime</span>.<span class="ruby-identifier">now</span>
1197
+ 261: <span class="ruby-keyword kw">end</span>
1198
+ 262: <span class="ruby-keyword kw">end</span></pre>
1192
1199
  </div>
1193
1200
 
1194
1201
  </div>