taskjuggler 0.0.5 → 0.0.6
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.
- data/CHANGELOG +2086 -0
- data/benchmarks/666tasks.tjp +3183 -0
- data/benchmarks/booking.tjp +14 -10
- data/doc/AppConfig.html +95 -73
- data/doc/Arguments.html +22 -2
- data/doc/CHANGELOG.html +2587 -0
- data/doc/COPYING.html +21 -1
- data/doc/Object.html +161 -122
- data/doc/README.html +21 -1
- data/doc/RuntimeConfig.html +26 -6
- data/doc/String.html +38 -18
- data/doc/StringIO.html +579 -0
- data/doc/TaskJuggler.html +251 -143
- data/doc/TaskJuggler/Account.html +26 -6
- data/doc/TaskJuggler/AccountAttribute.html +28 -8
- data/doc/TaskJuggler/AccountScenario.html +24 -4
- data/doc/TaskJuggler/Allocation.html +30 -10
- data/doc/TaskJuggler/AllocationAttribute.html +28 -8
- data/doc/TaskJuggler/AttributeBase.html +46 -26
- data/doc/TaskJuggler/AttributeDefinition.html +22 -2
- data/doc/TaskJuggler/BatchProcessor.html +40 -20
- data/doc/TaskJuggler/Booking.html +26 -6
- data/doc/TaskJuggler/BookingListAttribute.html +28 -8
- data/doc/TaskJuggler/BooleanAttribute.html +28 -8
- data/doc/TaskJuggler/CSVFile.html +308 -146
- data/doc/TaskJuggler/CellSettingPattern.html +22 -2
- data/doc/TaskJuggler/CellSettingPatternList.html +26 -6
- data/doc/TaskJuggler/Charge.html +26 -6
- data/doc/TaskJuggler/ChargeListAttribute.html +26 -6
- data/doc/TaskJuggler/ChargeSet.html +33 -13
- data/doc/TaskJuggler/ChargeSetListAttribute.html +28 -8
- data/doc/TaskJuggler/ColumnListAttribute.html +26 -6
- data/doc/TaskJuggler/ColumnTable.html +24 -4
- data/doc/TaskJuggler/Daemon.html +26 -6
- data/doc/TaskJuggler/DateAttribute.html +26 -6
- data/doc/TaskJuggler/DefinitionListAttribute.html +22 -2
- data/doc/TaskJuggler/DependencyListAttribute.html +28 -8
- data/doc/TaskJuggler/DurationAttribute.html +28 -8
- data/doc/TaskJuggler/FixnumAttribute.html +24 -4
- data/doc/TaskJuggler/FlagListAttribute.html +28 -8
- data/doc/TaskJuggler/FloatAttribute.html +26 -6
- data/doc/TaskJuggler/FormatListAttribute.html +24 -4
- data/doc/TaskJuggler/GanttChart.html +147 -126
- data/doc/TaskJuggler/GanttContainer.html +34 -14
- data/doc/TaskJuggler/GanttHeader.html +28 -8
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +24 -4
- data/doc/TaskJuggler/GanttLine.html +38 -18
- data/doc/TaskJuggler/GanttLoadStack.html +26 -6
- data/doc/TaskJuggler/GanttMilestone.html +34 -14
- data/doc/TaskJuggler/GanttRouter.html +50 -30
- data/doc/TaskJuggler/GanttTaskBar.html +34 -14
- data/doc/TaskJuggler/HTMLDocument.html +26 -6
- data/doc/TaskJuggler/HTMLGraphics.html +30 -10
- data/doc/TaskJuggler/Interval.html +40 -22
- data/doc/TaskJuggler/IntervalListAttribute.html +28 -8
- data/doc/TaskJuggler/JobInfo.html +24 -4
- data/doc/TaskJuggler/Journal.html +226 -147
- data/doc/TaskJuggler/JournalEntry.html +22 -2
- data/doc/TaskJuggler/JournalEntryList.html +129 -112
- data/doc/TaskJuggler/KeywordArray.html +26 -6
- data/doc/TaskJuggler/KeywordDocumentation.html +46 -26
- data/doc/TaskJuggler/Limits.html +152 -123
- data/doc/TaskJuggler/Limits/Limit.html +149 -70
- data/doc/TaskJuggler/LimitsAttribute.html +36 -51
- data/doc/TaskJuggler/ListAttributeBase.html +24 -4
- data/doc/TaskJuggler/Log.html +50 -32
- data/doc/TaskJuggler/LogFile.html +37 -17
- data/doc/TaskJuggler/LogicalAttribute.html +53 -33
- data/doc/TaskJuggler/LogicalExpression.html +26 -6
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +32 -12
- data/doc/TaskJuggler/LogicalFlag.html +42 -22
- data/doc/TaskJuggler/LogicalFunction.html +204 -140
- data/doc/TaskJuggler/LogicalOperation.html +135 -111
- data/doc/TaskJuggler/Macro.html +22 -2
- data/doc/TaskJuggler/MacroParser.html +32 -12
- data/doc/TaskJuggler/MacroTable.html +32 -12
- data/doc/TaskJuggler/ManagerResponsibilities.html +24 -4
- data/doc/TaskJuggler/ManagerStatusRecord.html +24 -4
- data/doc/TaskJuggler/Message.html +24 -4
- data/doc/TaskJuggler/MessageHandler.html +24 -4
- data/doc/TaskJuggler/Navigator.html +104 -71
- data/doc/TaskJuggler/NavigatorElement.html +32 -12
- data/doc/TaskJuggler/NikuProject.html +22 -2
- data/doc/TaskJuggler/NikuReport.html +310 -228
- data/doc/TaskJuggler/NikuResource.html +22 -2
- data/doc/TaskJuggler/NodeListAttribute.html +615 -0
- data/doc/TaskJuggler/OnShiftCache.html +32 -12
- data/doc/TaskJuggler/ProcessIntercom.html +205 -78
- data/doc/TaskJuggler/ProcessIntercomIface.html +26 -6
- data/doc/TaskJuggler/Project.html +708 -660
- data/doc/TaskJuggler/ProjectBroker.html +506 -304
- data/doc/TaskJuggler/ProjectBrokerIface.html +61 -41
- data/doc/TaskJuggler/ProjectFileParser.html +429 -373
- data/doc/TaskJuggler/ProjectFileScanner.html +1790 -0
- data/doc/TaskJuggler/ProjectRecord.html +80 -60
- data/doc/TaskJuggler/ProjectServer.html +312 -237
- data/doc/TaskJuggler/ProjectServerIface.html +101 -43
- data/doc/TaskJuggler/PropertyAttribute.html +32 -12
- data/doc/TaskJuggler/PropertyList.html +166 -145
- data/doc/TaskJuggler/PropertySet.html +254 -224
- data/doc/TaskJuggler/PropertyTreeNode.html +670 -536
- data/doc/TaskJuggler/Query.html +169 -148
- data/doc/TaskJuggler/RTFHandlers.html +622 -0
- data/doc/TaskJuggler/RTFNavigator.html +28 -8
- data/doc/TaskJuggler/RTFQuery.html +40 -20
- data/doc/TaskJuggler/RTFReport.html +62 -25
- data/doc/TaskJuggler/RTFReportLink.html +765 -0
- data/doc/TaskJuggler/RealFormat.html +26 -6
- data/doc/TaskJuggler/RealFormatAttribute.html +26 -6
- data/doc/TaskJuggler/ReferenceAttribute.html +59 -39
- data/doc/TaskJuggler/Report.html +402 -251
- data/doc/TaskJuggler/ReportBase.html +162 -137
- data/doc/TaskJuggler/ReportContext.html +112 -29
- data/doc/TaskJuggler/ReportServer.html +89 -64
- data/doc/TaskJuggler/ReportServerIface.html +75 -55
- data/doc/TaskJuggler/ReportServerRecord.html +54 -31
- data/doc/TaskJuggler/ReportServlet.html +980 -0
- data/doc/TaskJuggler/ReportTable.html +41 -21
- data/doc/TaskJuggler/ReportTableCell.html +214 -170
- data/doc/TaskJuggler/ReportTableColumn.html +30 -10
- data/doc/TaskJuggler/ReportTableLegend.html +36 -16
- data/doc/TaskJuggler/ReportTableLine.html +32 -12
- data/doc/TaskJuggler/Resource.html +99 -87
- data/doc/TaskJuggler/ResourceListAttribute.html +59 -39
- data/doc/TaskJuggler/ResourceListRE.html +47 -26
- data/doc/TaskJuggler/ResourceScenario.html +403 -437
- data/doc/TaskJuggler/RichText.html +26 -6
- data/doc/TaskJuggler/RichTextAttribute.html +50 -30
- data/doc/TaskJuggler/RichTextDocument.html +37 -17
- data/doc/TaskJuggler/RichTextElement.html +475 -413
- data/doc/TaskJuggler/RichTextException.html +22 -2
- data/doc/TaskJuggler/RichTextFunctionExample.html +28 -8
- data/doc/TaskJuggler/RichTextFunctionHandler.html +24 -4
- data/doc/TaskJuggler/RichTextImage.html +22 -2
- data/doc/TaskJuggler/RichTextIntermediate.html +38 -18
- data/doc/TaskJuggler/RichTextParser.html +56 -34
- data/doc/TaskJuggler/RichTextScanner.html +82 -61
- data/doc/TaskJuggler/RichTextSnip.html +34 -14
- data/doc/TaskJuggler/RichTextSyntaxRules.html +507 -353
- data/doc/TaskJuggler/Scenario.html +22 -2
- data/doc/TaskJuggler/ScenarioData.html +30 -46
- data/doc/TaskJuggler/ScenarioListAttribute.html +38 -18
- data/doc/TaskJuggler/Scoreboard.html +42 -22
- data/doc/TaskJuggler/SheetHandlerBase.html +40 -20
- data/doc/TaskJuggler/SheetReceiver.html +333 -295
- data/doc/TaskJuggler/SheetSender.html +253 -230
- data/doc/TaskJuggler/Shift.html +26 -6
- data/doc/TaskJuggler/ShiftAssignment.html +89 -73
- data/doc/TaskJuggler/ShiftAssignments.html +226 -234
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +39 -54
- data/doc/TaskJuggler/ShiftScenario.html +28 -8
- data/doc/TaskJuggler/SortListAttribute.html +34 -14
- data/doc/TaskJuggler/SourceFileInfo.html +24 -4
- data/doc/TaskJuggler/StatusSheetReceiver.html +24 -3
- data/doc/TaskJuggler/StatusSheetReport.html +168 -153
- data/doc/TaskJuggler/StatusSheetSender.html +24 -3
- data/doc/TaskJuggler/StringAttribute.html +38 -18
- data/doc/TaskJuggler/SymbolAttribute.html +32 -12
- data/doc/TaskJuggler/SyntaxReference.html +40 -20
- data/doc/TaskJuggler/TOCEntry.html +26 -6
- data/doc/TaskJuggler/TSResourceRecord.html +22 -2
- data/doc/TaskJuggler/TSTaskRecord.html +22 -2
- data/doc/TaskJuggler/TableColumnDefinition.html +59 -22
- data/doc/TaskJuggler/TableOfContents.html +26 -6
- data/doc/TaskJuggler/TableReport.html +937 -904
- data/doc/TaskJuggler/Task.html +55 -36
- data/doc/TaskJuggler/TaskDependency.html +24 -4
- data/doc/TaskJuggler/TaskListAttribute.html +50 -30
- data/doc/TaskJuggler/TaskListRE.html +27 -7
- data/doc/TaskJuggler/TaskScenario.html +1273 -1153
- data/doc/TaskJuggler/TextFormatter.html +28 -8
- data/doc/TaskJuggler/TextParser.html +585 -338
- data/doc/TaskJuggler/TextParser/Pattern.html +54 -34
- data/doc/TaskJuggler/TextParser/Rule.html +95 -73
- data/doc/TaskJuggler/TextParser/StackElement.html +39 -17
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +24 -4
- data/doc/TaskJuggler/TextParser/TokenDoc.html +22 -2
- data/doc/TaskJuggler/TextReport.html +28 -8
- data/doc/TaskJuggler/TextScanner.html +400 -1404
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +28 -240
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +37 -184
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +682 -0
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +342 -67
- data/doc/TaskJuggler/TimeSheet.html +48 -28
- data/doc/TaskJuggler/TimeSheetReceiver.html +24 -3
- data/doc/TaskJuggler/TimeSheetRecord.html +47 -27
- data/doc/TaskJuggler/TimeSheetReport.html +154 -133
- data/doc/TaskJuggler/TimeSheetSender.html +24 -3
- data/doc/TaskJuggler/TimeSheetSummary.html +137 -91
- data/doc/TaskJuggler/TimeSheets.html +26 -6
- data/doc/TaskJuggler/Tj3AppBase.html +85 -58
- data/doc/TaskJuggler/Tj3Client.html +292 -238
- data/doc/TaskJuggler/Tj3Daemon.html +159 -74
- data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -6
- data/doc/TaskJuggler/Tj3SsReceiver.html +26 -6
- data/doc/TaskJuggler/Tj3SsSender.html +53 -26
- data/doc/TaskJuggler/Tj3TsReceiver.html +28 -7
- data/doc/TaskJuggler/Tj3TsSender.html +26 -6
- data/doc/TaskJuggler/Tj3TsSummary.html +26 -6
- data/doc/TaskJuggler/TjException.html +22 -2
- data/doc/TaskJuggler/TjTime.html +216 -160
- data/doc/TaskJuggler/TjpExample.html +34 -14
- data/doc/TaskJuggler/TjpExportRE.html +403 -407
- data/doc/TaskJuggler/TjpSyntaxRules.html +4805 -4408
- data/doc/TaskJuggler/URLParameter.html +649 -0
- data/doc/TaskJuggler/UserManual.html +42 -22
- data/doc/TaskJuggler/WebServer.html +702 -0
- data/doc/TaskJuggler/WorkingHours.html +38 -18
- data/doc/TaskJuggler/WorkingHoursAttribute.html +61 -41
- data/doc/TaskJuggler/XMLBlob.html +24 -4
- data/doc/TaskJuggler/XMLComment.html +24 -4
- data/doc/TaskJuggler/XMLDocument.html +30 -10
- data/doc/TaskJuggler/XMLElement.html +34 -14
- data/doc/TaskJuggler/XMLNamedText.html +22 -2
- data/doc/TaskJuggler/XMLText.html +24 -4
- data/doc/index.html +1841 -1666
- data/doc/lib/AccountScenario_rb.html +1 -1
- data/doc/lib/Account_rb.html +1 -1
- data/doc/lib/Allocation_rb.html +1 -1
- data/doc/lib/AppConfig_rb.html +2 -2
- data/doc/lib/AttributeBase_rb.html +1 -1
- data/doc/lib/AttributeDefinition_rb.html +1 -1
- data/doc/lib/Attributes_rb.html +2 -2
- data/doc/lib/BatchProcessor_rb.html +1 -1
- data/doc/lib/Booking_rb.html +1 -1
- data/doc/lib/ChargeSet_rb.html +1 -1
- data/doc/lib/Charge_rb.html +1 -1
- data/doc/lib/HTMLDocument_rb.html +1 -1
- data/doc/lib/Interval_rb.html +1 -1
- data/doc/lib/Journal_rb.html +2 -2
- data/doc/lib/KeywordArray_rb.html +1 -1
- data/doc/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/Limits_rb.html +2 -2
- data/doc/lib/LogFile_rb.html +2 -2
- data/doc/lib/Log_rb.html +1 -1
- data/doc/lib/LogicalExpression_rb.html +1 -1
- data/doc/lib/LogicalFunction_rb.html +2 -2
- data/doc/lib/LogicalOperation_rb.html +2 -2
- data/doc/lib/MacroParser_rb.html +1 -1
- data/doc/lib/MacroTable_rb.html +1 -1
- data/doc/lib/MessageHandler_rb.html +1 -1
- data/doc/lib/Message_rb.html +1 -1
- data/doc/lib/ProjectFileParser_rb.html +4 -8
- data/doc/lib/ProjectFileScanner_rb.html +67 -0
- data/doc/lib/Project_rb.html +2 -2
- data/doc/lib/PropertyList_rb.html +2 -2
- data/doc/lib/PropertySet_rb.html +2 -2
- data/doc/lib/PropertyTreeNode_rb.html +2 -2
- data/doc/lib/Query_rb.html +2 -2
- data/doc/lib/RTFHandlers_rb.html +73 -0
- data/doc/lib/RTFNavigator_rb.html +1 -1
- data/doc/lib/RTFQuery_rb.html +1 -1
- data/doc/lib/RTFReportLink_rb.html +71 -0
- data/doc/lib/RTFReport_rb.html +2 -2
- data/doc/lib/RealFormat_rb.html +1 -1
- data/doc/lib/ResourceScenario_rb.html +2 -2
- data/doc/lib/Resource_rb.html +2 -2
- data/doc/lib/RichTextDocument_rb.html +1 -1
- data/doc/lib/RichTextElement_rb.html +2 -2
- data/doc/lib/RichTextFunctionExample_rb.html +1 -1
- data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
- data/doc/lib/RichTextParser_rb.html +2 -2
- data/doc/lib/RichTextScanner_rb.html +2 -2
- data/doc/lib/RichTextSnip_rb.html +1 -1
- data/doc/lib/RichTextSyntaxRules_rb.html +2 -2
- data/doc/lib/RichText_rb.html +1 -1
- data/doc/lib/RuntimeConfig_rb.html +1 -1
- data/doc/lib/ScenarioData_rb.html +2 -2
- data/doc/lib/Scenario_rb.html +1 -1
- data/doc/lib/Scoreboard_rb.html +1 -1
- data/doc/lib/SheetHandlerBase_rb.html +1 -1
- data/doc/lib/SheetReceiver_rb.html +2 -2
- data/doc/lib/SheetSender_rb.html +4 -2
- data/doc/lib/ShiftAssignments_rb.html +4 -2
- data/doc/lib/ShiftScenario_rb.html +1 -1
- data/doc/lib/Shift_rb.html +1 -1
- data/doc/lib/SourceFileInfo_rb.html +1 -1
- data/doc/lib/StatusSheetReceiver_rb.html +2 -2
- data/doc/lib/StatusSheetSender_rb.html +2 -2
- data/doc/lib/SyntaxReference_rb.html +1 -1
- data/doc/lib/TOCEntry_rb.html +1 -1
- data/doc/lib/TableColumnDefinition_rb.html +2 -2
- data/doc/lib/TableOfContents_rb.html +1 -1
- data/doc/lib/TaskDependency_rb.html +1 -1
- data/doc/lib/TaskJuggler_rb.html +2 -2
- data/doc/lib/TaskScenario_rb.html +2 -2
- data/doc/lib/Task_rb.html +2 -2
- data/doc/lib/TextFormatter_rb.html +1 -1
- data/doc/lib/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/TextParser/Rule_rb.html +2 -2
- data/doc/lib/TextParser/StackElement_rb.html +2 -2
- data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/TextParser_rb.html +2 -2
- data/doc/lib/TextScanner_rb.html +6 -2
- data/doc/lib/TimeSheetReceiver_rb.html +2 -2
- data/doc/lib/TimeSheetSender_rb.html +2 -2
- data/doc/lib/TimeSheetSummary_rb.html +2 -2
- data/doc/lib/TimeSheets_rb.html +2 -2
- data/doc/lib/Tj3AppBase_rb.html +2 -2
- data/doc/lib/Tj3Config_rb.html +2 -2
- data/doc/lib/Tj3SheetAppBase_rb.html +2 -2
- data/doc/lib/TjException_rb.html +1 -1
- data/doc/lib/TjTime_rb.html +2 -2
- data/doc/lib/TjpExample_rb.html +1 -1
- data/doc/lib/TjpSyntaxRules_rb.html +2 -2
- data/doc/lib/URLParameter_rb.html +67 -0
- data/doc/lib/UTF8String_rb.html +1 -1
- data/doc/lib/UserManual_rb.html +1 -1
- data/doc/lib/WorkingHours_rb.html +1 -1
- data/doc/lib/XMLDocument_rb.html +2 -2
- data/doc/lib/XMLElement_rb.html +1 -1
- data/doc/lib/daemon/Daemon_rb.html +1 -1
- data/doc/lib/daemon/ProcessIntercom_rb.html +2 -2
- data/doc/lib/daemon/ProjectBroker_rb.html +4 -2
- data/doc/lib/daemon/ProjectServer_rb.html +2 -2
- data/doc/lib/daemon/ReportServer_rb.html +2 -2
- data/doc/lib/daemon/WebServer_rb.html +75 -0
- data/doc/lib/deep_copy_rb.html +2 -2
- data/doc/lib/reports/CSVFile_rb.html +2 -2
- data/doc/lib/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/reports/GanttChart_rb.html +2 -2
- data/doc/lib/reports/GanttContainer_rb.html +1 -1
- data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/lib/reports/GanttHeader_rb.html +1 -1
- data/doc/lib/reports/GanttLine_rb.html +1 -1
- data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
- data/doc/lib/reports/GanttMilestone_rb.html +1 -1
- data/doc/lib/reports/GanttRouter_rb.html +1 -1
- data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
- data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
- data/doc/lib/reports/Navigator_rb.html +2 -2
- data/doc/lib/reports/NikuReport_rb.html +2 -2
- data/doc/lib/reports/ReportBase_rb.html +2 -2
- data/doc/lib/reports/ReportContext_rb.html +2 -2
- data/doc/lib/reports/ReportTableCell_rb.html +2 -2
- data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
- data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
- data/doc/lib/reports/ReportTableLine_rb.html +1 -1
- data/doc/lib/reports/ReportTable_rb.html +2 -2
- data/doc/lib/reports/Report_rb.html +2 -2
- data/doc/lib/reports/ResourceListRE_rb.html +2 -2
- data/doc/lib/reports/StatusSheetReport_rb.html +2 -2
- data/doc/lib/reports/TableReport_rb.html +2 -2
- data/doc/lib/reports/TaskListRE_rb.html +2 -2
- data/doc/lib/reports/TextReport_rb.html +1 -1
- data/doc/lib/reports/TimeSheetReport_rb.html +2 -2
- data/doc/lib/reports/TjpExportRE_rb.html +2 -2
- data/doc/lib/ruby-signal-bug_rb.html +1 -1
- data/doc/lib/taskjuggler3_rb.html +2 -2
- data/doc/lib/tj3client_rb.html +2 -2
- data/doc/lib/tj3d_rb.html +2 -2
- data/doc/lib/tj3man_rb.html +1 -1
- data/doc/lib/tj3ss_receiver_rb.html +1 -1
- data/doc/lib/tj3ss_sender_rb.html +2 -2
- data/doc/lib/tj3ts_receiver_rb.html +2 -2
- data/doc/lib/tj3ts_sender_rb.html +1 -1
- data/doc/lib/tj3ts_summary_rb.html +1 -1
- data/doc/rdoc.css +9 -4
- data/examples/tutorial.tjp +17 -15
- data/gem_spec.rb +3 -0
- data/lib/AppConfig.rb +3 -1
- data/lib/Attributes.rb +10 -8
- data/lib/Journal.rb +55 -20
- data/lib/Limits.rb +72 -46
- data/lib/LogFile.rb +3 -3
- data/lib/LogicalFunction.rb +19 -6
- data/lib/LogicalOperation.rb +5 -1
- data/lib/Project.rb +37 -9
- data/lib/ProjectFileParser.rb +25 -22
- data/lib/ProjectFileScanner.rb +365 -0
- data/lib/PropertyList.rb +2 -1
- data/lib/PropertySet.rb +14 -4
- data/lib/PropertyTreeNode.rb +42 -29
- data/lib/Query.rb +3 -1
- data/lib/RTFHandlers.rb +35 -0
- data/lib/RTFReport.rb +23 -6
- data/lib/RTFReportLink.rb +72 -0
- data/lib/Resource.rb +8 -16
- data/lib/ResourceScenario.rb +1 -22
- data/lib/RichTextElement.rb +42 -0
- data/lib/RichTextParser.rb +6 -4
- data/lib/RichTextScanner.rb +5 -5
- data/lib/RichTextSyntaxRules.rb +48 -10
- data/lib/ScenarioData.rb +5 -3
- data/lib/SheetReceiver.rb +24 -6
- data/lib/SheetSender.rb +17 -13
- data/lib/ShiftAssignments.rb +56 -52
- data/lib/StatusSheetReceiver.rb +1 -0
- data/lib/StatusSheetSender.rb +1 -0
- data/lib/TableColumnDefinition.rb +4 -2
- data/lib/Task.rb +8 -9
- data/lib/TaskJuggler.rb +21 -11
- data/lib/TaskScenario.rb +61 -26
- data/lib/TextParser.rb +268 -106
- data/lib/TextParser/Rule.rb +4 -2
- data/lib/TextParser/StackElement.rb +6 -4
- data/lib/TextScanner.rb +283 -700
- data/lib/TimeSheetReceiver.rb +1 -0
- data/lib/TimeSheetSender.rb +1 -0
- data/lib/TimeSheetSummary.rb +51 -26
- data/lib/TimeSheets.rb +1 -1
- data/lib/Tj3AppBase.rb +8 -1
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +5 -0
- data/lib/TjpSyntaxRules.rb +360 -144
- data/lib/URLParameter.rb +30 -0
- data/lib/XMLDocument.rb +2 -2
- data/lib/daemon/ProcessIntercom.rb +50 -9
- data/lib/daemon/ProjectBroker.rb +63 -10
- data/lib/daemon/ProjectServer.rb +47 -16
- data/lib/daemon/ReportServer.rb +9 -4
- data/lib/daemon/WebServer.rb +204 -0
- data/lib/deep_copy.rb +4 -1
- data/lib/reports/CSVFile.rb +150 -66
- data/lib/reports/GanttChart.rb +2 -1
- data/lib/reports/Navigator.rb +18 -5
- data/lib/reports/NikuReport.rb +32 -2
- data/lib/reports/Report.rb +65 -37
- data/lib/reports/ReportBase.rb +14 -9
- data/lib/reports/ReportContext.rb +19 -4
- data/lib/reports/ReportTable.rb +2 -2
- data/lib/reports/ReportTableCell.rb +54 -30
- data/lib/reports/ResourceListRE.rb +4 -3
- data/lib/reports/StatusSheetReport.rb +8 -13
- data/lib/reports/TableReport.rb +47 -32
- data/lib/reports/TaskListRE.rb +3 -3
- data/lib/reports/TimeSheetReport.rb +14 -5
- data/lib/reports/TjpExportRE.rb +14 -19
- data/lib/taskjuggler3.rb +15 -0
- data/lib/tj3client.rb +9 -7
- data/lib/tj3d.rb +38 -10
- data/lib/tj3ss_sender.rb +7 -0
- data/lib/tj3ts_receiver.rb +1 -0
- data/manual/Day_To_Day_Juggling +1 -1
- data/manual/Rich_Text_Attributes +8 -0
- data/manual/TaskJuggler_2x_Migration +7 -0
- data/manual/The_TaskJuggler_Syntax +20 -6
- data/prj_cfg.rb +3 -2
- data/tasks/changelog.rake +36 -0
- data/tasks/csts.rake +2 -3
- data/tasks/gem.rake +10 -0
- data/tasks/missing.rake +0 -17
- data/test/TestSuite/ReportGenerator/Correct/Journal.html +63 -0
- data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +14 -0
- data/test/TestSuite/{HTML-Reports/LogicalFunctions.tjp → ReportGenerator/Correct/LogicalFunctions1.tjp} +2 -2
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +3 -0
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.tjp +19 -0
- data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +66 -0
- data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +407 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +26 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +6 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions1-1.csv +7 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions2-1.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +20 -0
- data/test/TestSuite/Scheduler/Correct/Container.html +349 -0
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -4
- data/test/TestSuite/Scheduler/Correct/Shift2.html +464 -150
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +108 -0
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +7 -0
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +14 -0
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +233 -21
- data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/StatusSheetTemplates/project.tji +35 -0
- data/test/TestSuite/StatusSheetTemplates/project.tjp +56 -0
- data/test/TestSuite/StatusSheets/run +3 -2
- data/test/TestSuite/Syntax/Correct/Include.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Macro-1.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Macro-2.tjp +6 -0
- data/test/TestSuite/Syntax/Correct/Macro-3.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +32 -0
- data/test/TestSuite/Syntax/Correct/css/tjmanual.css +66 -0
- data/test/TestSuite/Syntax/Correct/css/tjreport.css +407 -0
- data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +3 -0
- data/test/TestSuite/Syntax/Correct/include/dir1/file5.tji +2 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/all.tji +3 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/file1.tji +2 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/file2.tji +1 -0
- data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +13 -13
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/include_recursion.tjp +1 -0
- data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +2 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring1.tjp → no_token_match1.tjp} +2 -2
- data/test/TestSuite/Syntax/Errors/{eof_in_istring2.tjp → no_token_match2.tjp} +2 -2
- data/test/TestSuite/Syntax/Errors/{eof_in_istring3.tjp → no_token_match3.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring4.tjp → no_token_match4.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring5.tjp → no_token_match5.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/not_scheduled.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
- data/test/TestSuite/TimeSheets/run +5 -5
- data/test/test_CSVFile.rb +75 -0
- data/test/test_Limits.rb +63 -5
- data/test/test_ProjectFileScanner.rb +163 -0
- data/test/test_ReportGenerator.rb +81 -0
- data/test/test_RichText.rb +21 -3
- data/test/test_Scheduler.rb +1 -1
- data/test/test_ShiftAssignments.rb +4 -4
- data/test/test_Syntax.rb +1 -1
- data/test/test_URLParameter.rb +30 -0
- metadata +126 -32
- data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +0 -8
- data/test/TestSuite/Syntax/Errors/bad_comment.tjp +0 -7
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +0 -36
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +0 -48
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +0 -67
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +0 -67
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +0 -48
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +0 -31
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +0 -36
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +0 -1
- data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +0 -1
- data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +0 -54
- data/test/TestSuite/TimeSheets/TimeSheets/all.tji +0 -2
- data/test/TestSuite/TimeSheets/receiver.log +0 -102
- data/test/TestSuite/TimeSheets/sender.log +0 -794
- data/test/TestSuite/TimeSheets/summary.log +0 -884
- data/test/TestSuite/TimeSheets/timesheets.log +0 -45
- data/test/TestSuite/TimeSheets/tj3d.log +0 -292
- data/test/test_TextScanner.rb +0 -95
data/lib/URLParameter.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = URLParameter.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'zlib'
|
|
14
|
+
|
|
15
|
+
class TaskJuggler
|
|
16
|
+
|
|
17
|
+
class URLParameter
|
|
18
|
+
|
|
19
|
+
def URLParameter.encode(data)
|
|
20
|
+
[Zlib::Deflate.deflate(data)].pack('m')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def URLParameter.decode(data)
|
|
24
|
+
Zlib::Inflate.inflate(data.unpack('m')[0])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
data/lib/XMLDocument.rb
CHANGED
|
@@ -42,11 +42,11 @@ class TaskJuggler
|
|
|
42
42
|
|
|
43
43
|
# Write the XMLDocument to the specified file.
|
|
44
44
|
def write(filename)
|
|
45
|
-
f = File.new(filename.untaint, 'w')
|
|
45
|
+
f = filename == '.' ? $stdout : File.new(filename.untaint, 'w')
|
|
46
46
|
@elements.each do |element|
|
|
47
47
|
f.puts element.to_s(0)
|
|
48
48
|
end
|
|
49
|
-
f.close
|
|
49
|
+
f.close unless f == $stdout
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
end
|
|
@@ -47,6 +47,13 @@ class TaskJuggler
|
|
|
47
47
|
# This flag will be set to true by DRb method calls to terminate the
|
|
48
48
|
# process.
|
|
49
49
|
@terminate = false
|
|
50
|
+
|
|
51
|
+
# This mutex is locked while a client is connected.
|
|
52
|
+
@clientConnection = Mutex.new
|
|
53
|
+
# This lock protects the @timerStart
|
|
54
|
+
@timeLock = Monitor.new
|
|
55
|
+
# The time stamp of the last client interaction.
|
|
56
|
+
@timerStart = nil
|
|
50
57
|
end
|
|
51
58
|
|
|
52
59
|
def terminate
|
|
@@ -55,6 +62,8 @@ class TaskJuggler
|
|
|
55
62
|
end
|
|
56
63
|
|
|
57
64
|
def connect(stdout, stderr, stdin, silent)
|
|
65
|
+
# Set the client lock.
|
|
66
|
+
@clientConnection.lock
|
|
58
67
|
@log.debug('Rerouting ProjectServer standard IO to client')
|
|
59
68
|
# Make sure that all output to STDOUT and STDERR is sent to the client.
|
|
60
69
|
# Input is read from the client STDIN. We save a copy of the old file
|
|
@@ -62,9 +71,9 @@ class TaskJuggler
|
|
|
62
71
|
@stdout = $stdout
|
|
63
72
|
@stderr = $stderr
|
|
64
73
|
@stdin = $stdin
|
|
65
|
-
$stdout = stdout
|
|
66
|
-
$stderr = stderr
|
|
67
|
-
$stdin = stdin
|
|
74
|
+
$stdout = stdout if stdout
|
|
75
|
+
$stderr = stderr if stdout
|
|
76
|
+
$stdin = stdin if stdin
|
|
68
77
|
@log.debug('IO is now routed to the client')
|
|
69
78
|
Log.silent = silent
|
|
70
79
|
true
|
|
@@ -73,10 +82,12 @@ class TaskJuggler
|
|
|
73
82
|
def disconnect
|
|
74
83
|
@log.debug('Restoring IO')
|
|
75
84
|
Log.silent = true
|
|
76
|
-
$stdout = @stdout
|
|
77
|
-
$stderr = @stderr
|
|
78
|
-
$stdin = @stdin
|
|
85
|
+
$stdout = @stdout if @stdout
|
|
86
|
+
$stderr = @stderr if @stderr
|
|
87
|
+
$stdin = @stdin if @stdin
|
|
79
88
|
@log.debug('Standard IO has been restored')
|
|
89
|
+
# Release the client lock
|
|
90
|
+
@clientConnection.unlock
|
|
80
91
|
true
|
|
81
92
|
end
|
|
82
93
|
|
|
@@ -95,13 +106,43 @@ class TaskJuggler
|
|
|
95
106
|
true
|
|
96
107
|
end
|
|
97
108
|
|
|
109
|
+
# This function must be called after each client interaction to restart the
|
|
110
|
+
# client connection timer.
|
|
111
|
+
def restartTimer
|
|
112
|
+
@timeLock.synchronize do
|
|
113
|
+
@log.debug('Reseting client connection timer')
|
|
114
|
+
@timerStart = Time.new
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Check if the client interaction timer has already expired.
|
|
119
|
+
def timerExpired?
|
|
120
|
+
res = nil
|
|
121
|
+
@timeLock.synchronize do
|
|
122
|
+
res = (Time.new > @timerStart + 2 * 60 * 60)
|
|
123
|
+
end
|
|
124
|
+
res
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# This method starts a new thread and waits for the @terminate variable to
|
|
128
|
+
# be true. If that happens, it waits for the @clientConnection lock or
|
|
129
|
+
# forces an exit after the timeout has been reached. It shuts down the DRb
|
|
130
|
+
# server.
|
|
98
131
|
def startTerminator
|
|
99
132
|
Thread.new do
|
|
100
133
|
loop do
|
|
101
134
|
if @terminate
|
|
102
|
-
#
|
|
103
|
-
|
|
104
|
-
|
|
135
|
+
# We wait for the client to propery disconnect. In case this does
|
|
136
|
+
# not happen, we'll wait for the timeout and exit anyway.
|
|
137
|
+
restartTimer
|
|
138
|
+
while @clientConnection.locked? && !timerExpired? do
|
|
139
|
+
sleep 1
|
|
140
|
+
end
|
|
141
|
+
if timerExpired?
|
|
142
|
+
@log.warning('Shutting down DRb server due to timeout')
|
|
143
|
+
else
|
|
144
|
+
@log.debug('Shutting down DRb server')
|
|
145
|
+
end
|
|
105
146
|
DRb.stop_service
|
|
106
147
|
break
|
|
107
148
|
else
|
data/lib/daemon/ProjectBroker.rb
CHANGED
|
@@ -16,6 +16,7 @@ require 'drb'
|
|
|
16
16
|
require 'drb/acl'
|
|
17
17
|
require 'daemon/Daemon'
|
|
18
18
|
require 'daemon/ProjectServer'
|
|
19
|
+
require 'daemon/WebServer'
|
|
19
20
|
require 'TjTime'
|
|
20
21
|
|
|
21
22
|
class TaskJuggler
|
|
@@ -35,14 +36,15 @@ class TaskJuggler
|
|
|
35
36
|
# daemon.
|
|
36
37
|
class ProjectBroker < Daemon
|
|
37
38
|
|
|
38
|
-
attr_accessor :port
|
|
39
|
+
attr_accessor :port, :enableWebServer, :webServerPort, :projectFiles
|
|
40
|
+
attr_reader :authKey
|
|
39
41
|
|
|
40
42
|
def initialize
|
|
41
43
|
super
|
|
42
44
|
# We don't have a default key. The user must provice a key in the config
|
|
43
45
|
# file. Otherwise the daemon will not start.
|
|
44
46
|
@authKey = nil
|
|
45
|
-
# The default TCP/IP port. ASCII
|
|
47
|
+
# The default TCP/IP port. ASCII code decimals for 'T' and 'J'.
|
|
46
48
|
@port = 8474
|
|
47
49
|
# A list of loaded projects as Array of ProjectRecord objects.
|
|
48
50
|
@projects = []
|
|
@@ -50,15 +52,27 @@ class TaskJuggler
|
|
|
50
52
|
# the access to the list.
|
|
51
53
|
@projects.extend(MonitorMixin)
|
|
52
54
|
|
|
55
|
+
# A list of the initial projects. Array with Array of files names.
|
|
56
|
+
@projectFiles = []
|
|
57
|
+
|
|
53
58
|
# This Queue is used to load new projects. The DRb thread pushes load
|
|
54
59
|
# requests that the housekeeping thread will then perform.
|
|
55
60
|
@projectsToLoad = Queue.new
|
|
56
61
|
|
|
62
|
+
# Referece to WEBrick object.
|
|
63
|
+
@webServer = nil
|
|
64
|
+
|
|
65
|
+
# Port used by the web server
|
|
66
|
+
@webServerPort = 8080
|
|
67
|
+
|
|
68
|
+
# True if web server should be activated
|
|
69
|
+
@enableWebServer = false
|
|
70
|
+
|
|
57
71
|
# This flag will be set to true to terminate the daemon.
|
|
58
72
|
@terminate = false
|
|
59
73
|
end
|
|
60
74
|
|
|
61
|
-
def start
|
|
75
|
+
def start
|
|
62
76
|
# To ensure a certain level of security, the user must provide an
|
|
63
77
|
# authentication key to authenticate the client to this server.
|
|
64
78
|
unless @authKey
|
|
@@ -73,9 +87,19 @@ EOT
|
|
|
73
87
|
)
|
|
74
88
|
end
|
|
75
89
|
|
|
90
|
+
# In daemon mode, we fork twice and only the 2nd child continues here.
|
|
76
91
|
super()
|
|
77
92
|
@log.debug("Starting project broker")
|
|
78
93
|
|
|
94
|
+
begin
|
|
95
|
+
# The web server must be started before we turn SAFE mode on.
|
|
96
|
+
@webServer = WebServer.new(self, @webServerPort) if @enableWebServer
|
|
97
|
+
@log.info("TaskJuggler web server is listening on port " +
|
|
98
|
+
"#{@webServerPort}")
|
|
99
|
+
rescue
|
|
100
|
+
@log.fatal("Cannot start web server: #{$!}")
|
|
101
|
+
end
|
|
102
|
+
|
|
79
103
|
# Setup a DRb server to handle the incomming requests from the clients.
|
|
80
104
|
brokerIface = ProjectBrokerIface.new(self)
|
|
81
105
|
begin
|
|
@@ -90,8 +114,8 @@ EOT
|
|
|
90
114
|
|
|
91
115
|
# If project files were specified on the command line, we add them here.
|
|
92
116
|
i = 0
|
|
93
|
-
|
|
94
|
-
@projectsToLoad.push(
|
|
117
|
+
@projectFiles.each do |project|
|
|
118
|
+
@projectsToLoad.push(project)
|
|
95
119
|
end
|
|
96
120
|
|
|
97
121
|
# Start a Thread that waits for the @terminate flag to be set and does
|
|
@@ -121,6 +145,11 @@ EOT
|
|
|
121
145
|
def stop
|
|
122
146
|
@log.debug('Terminating on client request')
|
|
123
147
|
|
|
148
|
+
# Shut down the web server if we've started one.
|
|
149
|
+
if @webServer
|
|
150
|
+
@webServer.stop
|
|
151
|
+
end
|
|
152
|
+
|
|
124
153
|
# Send termination signal to all ProjectServer instances
|
|
125
154
|
@projects.synchronize do
|
|
126
155
|
@projects.each { |p| p.terminateServer }
|
|
@@ -223,6 +252,21 @@ EOT
|
|
|
223
252
|
[ project.uri, project.authKey ]
|
|
224
253
|
end
|
|
225
254
|
|
|
255
|
+
# Return a list of IDs of projects that are in state :ready.
|
|
256
|
+
def getProjectList
|
|
257
|
+
list = []
|
|
258
|
+
@projects.synchronize do
|
|
259
|
+
@projects.each do |project|
|
|
260
|
+
list << project.id if project.state == :ready
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
list
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
def report(projectId, reportId)
|
|
267
|
+
uri, key = getProject(projectId)
|
|
268
|
+
end
|
|
269
|
+
|
|
226
270
|
# This is a callback from the ProjectServer process. It's used to update
|
|
227
271
|
# the current state of the ProjectServer in the ProjectRecord list.
|
|
228
272
|
def updateState(authKey, id, state)
|
|
@@ -296,9 +340,9 @@ EOT
|
|
|
296
340
|
# And then send them a termination command.
|
|
297
341
|
termList.each { |p| p.terminateServer }
|
|
298
342
|
|
|
299
|
-
# Check every
|
|
343
|
+
# Check every 30 seconds that the ProjectServer processes are
|
|
300
344
|
# still alive. If not, remove them from the list.
|
|
301
|
-
if (cntr += 1) >
|
|
345
|
+
if (cntr += 1) > 30
|
|
302
346
|
@projects.synchronize do
|
|
303
347
|
@projects.each do |p|
|
|
304
348
|
unless p.ping
|
|
@@ -322,10 +366,19 @@ EOT
|
|
|
322
366
|
end
|
|
323
367
|
end
|
|
324
368
|
|
|
325
|
-
def loadProject(
|
|
326
|
-
|
|
369
|
+
def loadProject(tagOrProject)
|
|
370
|
+
if tagOrProject.is_a?(Array)
|
|
371
|
+
tag = rand(9999999999999)
|
|
372
|
+
project = tagOrProject
|
|
373
|
+
# The 2nd element of the Array is the *.tjp file name.
|
|
374
|
+
@log.debug("Loading project #{tagOrProject[1]} with tag #{tag}")
|
|
375
|
+
else
|
|
376
|
+
tag = tagOrProject
|
|
377
|
+
project = nil
|
|
378
|
+
@log.debug("Loading project for tag #{tag}")
|
|
379
|
+
end
|
|
327
380
|
pr = ProjectRecord.new(tag)
|
|
328
|
-
ps = ProjectServer.new
|
|
381
|
+
ps = ProjectServer.new(project)
|
|
329
382
|
# The ProjectServer can be reached via this DRb URI
|
|
330
383
|
pr.uri = ps.uri
|
|
331
384
|
# Method calls must be authenticated with this key
|
data/lib/daemon/ProjectServer.rb
CHANGED
|
@@ -37,7 +37,8 @@ class TaskJuggler
|
|
|
37
37
|
|
|
38
38
|
attr_reader :authKey, :uri
|
|
39
39
|
|
|
40
|
-
def initialize
|
|
40
|
+
def initialize(projectData = nil)
|
|
41
|
+
@projectData = projectData
|
|
41
42
|
# Since we are still in the ProjectBroker process, the current DRb
|
|
42
43
|
# server is still the ProjectBroker DRb server.
|
|
43
44
|
@daemonURI = DRb.current_server.uri
|
|
@@ -147,9 +148,30 @@ class TaskJuggler
|
|
|
147
148
|
# Great, everything went fine. We've got a project to work with.
|
|
148
149
|
updateState(:ready, @tj.projectId)
|
|
149
150
|
@log.info("Project #{@tj.projectId} loaded")
|
|
151
|
+
restartTimer
|
|
150
152
|
true
|
|
151
153
|
end
|
|
152
154
|
|
|
155
|
+
# Return the name of the loaded project or nil.
|
|
156
|
+
def getProjectName
|
|
157
|
+
return nil unless @tj
|
|
158
|
+
restartTimer
|
|
159
|
+
@tj.projectName
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Return a list of the HTML reports defined for the project.
|
|
163
|
+
def getReportList
|
|
164
|
+
return [] unless @tj && (project = @tj.project)
|
|
165
|
+
list = []
|
|
166
|
+
project.reports.each do |report|
|
|
167
|
+
if report.get('formats').include?(:html)
|
|
168
|
+
list << [ report.fullId, report.name ]
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
restartTimer
|
|
172
|
+
list
|
|
173
|
+
end
|
|
174
|
+
|
|
153
175
|
# This function triggers the creation of a new ReportServer process. It
|
|
154
176
|
# will return the URI and the authentication key of this new server.
|
|
155
177
|
def getReportServer
|
|
@@ -177,22 +199,15 @@ class TaskJuggler
|
|
|
177
199
|
end
|
|
178
200
|
|
|
179
201
|
@log.debug("Got report server with URI #{reportServer.uri} for tag #{tag}")
|
|
202
|
+
restartTimer
|
|
180
203
|
[ reportServer.uri, reportServer.authKey ]
|
|
181
204
|
end
|
|
182
205
|
|
|
183
|
-
# Remove a ReportServer that's no longer needed. The client is responsible
|
|
184
|
-
# for terminating it.
|
|
185
|
-
def dropReportServer(uri)
|
|
186
|
-
@reportServers.synchronize do
|
|
187
|
-
@reportServers.delete_if { |rs| rs.uri == uri }
|
|
188
|
-
end
|
|
189
|
-
end
|
|
190
|
-
|
|
191
206
|
# This function is called regularly by the ProjectBroker process to check
|
|
192
207
|
# that the ProjectServer is still operating properly.
|
|
193
208
|
def ping
|
|
194
209
|
# Store the time stamp. If we don't get the ping for some time, we
|
|
195
|
-
# assume the
|
|
210
|
+
# assume the ProjectBroker has died.
|
|
196
211
|
@lastPing = TjTime.now
|
|
197
212
|
|
|
198
213
|
# Now also check our ReportServers if they are still there. If not, we
|
|
@@ -227,6 +242,13 @@ class TaskJuggler
|
|
|
227
242
|
def startHousekeeping
|
|
228
243
|
Thread.new do
|
|
229
244
|
loop do
|
|
245
|
+
# Was the project data provided during object creation?
|
|
246
|
+
# Then we load the data here.
|
|
247
|
+
if @projectData
|
|
248
|
+
loadProject(@projectData)
|
|
249
|
+
@projectData = nil
|
|
250
|
+
end
|
|
251
|
+
|
|
230
252
|
# Check for pending requests for new ReportServers.
|
|
231
253
|
unless @reportServerRequests.empty?
|
|
232
254
|
tag = @reportServerRequests.pop
|
|
@@ -286,16 +308,22 @@ class TaskJuggler
|
|
|
286
308
|
@server.loadProject(args)
|
|
287
309
|
end
|
|
288
310
|
|
|
289
|
-
def
|
|
311
|
+
def getProjectName(authKey)
|
|
290
312
|
return false unless @server.checkKey(authKey, 'getReportServer')
|
|
291
313
|
|
|
292
|
-
@server.
|
|
314
|
+
@server.getProjectName
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def getReportList(authKey)
|
|
318
|
+
return false unless @server.checkKey(authKey, 'getReportServer')
|
|
319
|
+
|
|
320
|
+
@server.getReportList
|
|
293
321
|
end
|
|
294
322
|
|
|
295
|
-
def
|
|
323
|
+
def getReportServer(authKey)
|
|
296
324
|
return false unless @server.checkKey(authKey, 'getReportServer')
|
|
297
325
|
|
|
298
|
-
@server.
|
|
326
|
+
@server.getReportServer
|
|
299
327
|
end
|
|
300
328
|
|
|
301
329
|
def ping(authKey)
|
|
@@ -327,7 +355,8 @@ class TaskJuggler
|
|
|
327
355
|
end
|
|
328
356
|
|
|
329
357
|
# Send a ping to the ReportServer process to check that it is still
|
|
330
|
-
# functioning properly.
|
|
358
|
+
# functioning properly. If not, it has probably terminated and we can
|
|
359
|
+
# remove it from the list of active ReportServers.
|
|
331
360
|
def ping
|
|
332
361
|
return true unless @uri
|
|
333
362
|
|
|
@@ -336,7 +365,9 @@ class TaskJuggler
|
|
|
336
365
|
@reportServer = DRbObject.new(nil, @uri) unless @reportServer
|
|
337
366
|
@reportServer.ping(@authKey)
|
|
338
367
|
rescue
|
|
339
|
-
|
|
368
|
+
# ReportServer processes terminate on request of their clients. Not
|
|
369
|
+
# responding to a ping is a normal event.
|
|
370
|
+
@log.debug("ReportServer (#{@uri}) has terminated")
|
|
340
371
|
return false
|
|
341
372
|
end
|
|
342
373
|
true
|
data/lib/daemon/ReportServer.rb
CHANGED
|
@@ -91,16 +91,18 @@ class TaskJuggler
|
|
|
91
91
|
rescue TjException
|
|
92
92
|
return false
|
|
93
93
|
end
|
|
94
|
+
restartTimer
|
|
94
95
|
true
|
|
95
96
|
end
|
|
96
97
|
|
|
97
|
-
def generateReport(id, regExpMode)
|
|
98
|
+
def generateReport(id, regExpMode, dynamicAttributes)
|
|
98
99
|
@log.info("Generating report #{id}")
|
|
99
|
-
if (ok = @tj.generateReport(id, regExpMode))
|
|
100
|
+
if (ok = @tj.generateReport(id, regExpMode, dynamicAttributes))
|
|
100
101
|
@log.debug("Report #{id} generated")
|
|
101
102
|
else
|
|
102
103
|
@log.error("Report generation of #{id} failed")
|
|
103
104
|
end
|
|
105
|
+
restartTimer
|
|
104
106
|
ok
|
|
105
107
|
end
|
|
106
108
|
|
|
@@ -111,6 +113,7 @@ class TaskJuggler
|
|
|
111
113
|
else
|
|
112
114
|
@log.error("Report list compilation of #{id} failed")
|
|
113
115
|
end
|
|
116
|
+
restartTimer
|
|
114
117
|
ok
|
|
115
118
|
end
|
|
116
119
|
|
|
@@ -118,6 +121,7 @@ class TaskJuggler
|
|
|
118
121
|
@log.info("Checking time sheet #{sheet}")
|
|
119
122
|
ok = @tj.checkTimeSheet(sheet)
|
|
120
123
|
@log.debug("Time sheet #{sheet} is #{ok ? '' : 'not '}ok")
|
|
124
|
+
restartTimer
|
|
121
125
|
ok
|
|
122
126
|
end
|
|
123
127
|
|
|
@@ -125,6 +129,7 @@ class TaskJuggler
|
|
|
125
129
|
@log.info("Checking status sheet #{sheet}")
|
|
126
130
|
ok = @tj.checkStatusSheet(sheet)
|
|
127
131
|
@log.debug("Status sheet #{sheet} is #{ok ? '' : 'not '}ok")
|
|
132
|
+
restartTimer
|
|
128
133
|
ok
|
|
129
134
|
end
|
|
130
135
|
|
|
@@ -163,10 +168,10 @@ class TaskJuggler
|
|
|
163
168
|
@server.addFile(file)
|
|
164
169
|
end
|
|
165
170
|
|
|
166
|
-
def generateReport(authKey, reportId, regExpMode)
|
|
171
|
+
def generateReport(authKey, reportId, regExpMode, dynamicAttributes)
|
|
167
172
|
return false unless @server.checkKey(authKey, 'generateReport')
|
|
168
173
|
|
|
169
|
-
@server.generateReport(reportId, regExpMode)
|
|
174
|
+
@server.generateReport(reportId, regExpMode, dynamicAttributes)
|
|
170
175
|
end
|
|
171
176
|
|
|
172
177
|
|