taskjuggler 0.0.6 → 0.0.7
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 +160 -0
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/data/css/tjreport.css +7 -2
- data/doc/AppConfig.html +10 -4
- data/doc/Arguments.html +10 -4
- data/doc/CHANGELOG.html +171 -5
- data/doc/COPYING.html +10 -4
- data/doc/Object.html +11 -107
- data/doc/README.html +10 -4
- data/doc/RuntimeConfig.html +10 -4
- data/doc/String.html +16 -11
- data/doc/StringIO.html +10 -4
- data/doc/TaskJuggler.html +506 -435
- data/doc/TaskJuggler/Account.html +10 -4
- data/doc/TaskJuggler/AccountAttribute.html +10 -4
- data/doc/TaskJuggler/AccountScenario.html +10 -4
- data/doc/TaskJuggler/Allocation.html +69 -60
- data/doc/TaskJuggler/AllocationAttribute.html +10 -4
- data/doc/TaskJuggler/AttributeBase.html +10 -4
- data/doc/TaskJuggler/AttributeDefinition.html +10 -4
- data/doc/TaskJuggler/BatchProcessor.html +202 -192
- data/doc/TaskJuggler/Booking.html +10 -4
- data/doc/TaskJuggler/BookingListAttribute.html +10 -4
- data/doc/TaskJuggler/BooleanAttribute.html +10 -4
- data/doc/TaskJuggler/CSVFile.html +10 -4
- data/doc/TaskJuggler/CellSettingPattern.html +10 -4
- data/doc/TaskJuggler/CellSettingPatternList.html +10 -4
- data/doc/TaskJuggler/Charge.html +10 -4
- data/doc/TaskJuggler/ChargeListAttribute.html +10 -4
- data/doc/TaskJuggler/ChargeSet.html +10 -4
- data/doc/TaskJuggler/ChargeSetListAttribute.html +10 -4
- data/doc/TaskJuggler/ColumnListAttribute.html +10 -4
- data/doc/TaskJuggler/ColumnTable.html +10 -4
- data/doc/TaskJuggler/Daemon.html +71 -52
- data/doc/TaskJuggler/DateAttribute.html +10 -4
- data/doc/TaskJuggler/DefinitionListAttribute.html +10 -4
- data/doc/TaskJuggler/DependencyListAttribute.html +10 -4
- data/doc/TaskJuggler/DurationAttribute.html +10 -4
- data/doc/TaskJuggler/{MacroParser.html → FileList.html} +58 -173
- data/doc/TaskJuggler/{RichTextException.html → FileRecord.html} +59 -80
- data/doc/TaskJuggler/FixnumAttribute.html +10 -4
- data/doc/TaskJuggler/FlagListAttribute.html +10 -4
- data/doc/TaskJuggler/FloatAttribute.html +10 -4
- data/doc/TaskJuggler/FormatListAttribute.html +10 -4
- data/doc/TaskJuggler/GanttChart.html +10 -4
- data/doc/TaskJuggler/GanttContainer.html +14 -8
- data/doc/TaskJuggler/GanttHeader.html +10 -4
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +10 -4
- data/doc/TaskJuggler/GanttLine.html +29 -24
- data/doc/TaskJuggler/GanttLoadStack.html +10 -4
- data/doc/TaskJuggler/GanttMilestone.html +10 -4
- data/doc/TaskJuggler/GanttRouter.html +10 -4
- data/doc/TaskJuggler/GanttTaskBar.html +20 -10
- data/doc/TaskJuggler/HTMLDocument.html +10 -4
- data/doc/TaskJuggler/HTMLGraphics.html +10 -4
- data/doc/TaskJuggler/Interval.html +10 -4
- data/doc/TaskJuggler/IntervalListAttribute.html +10 -4
- data/doc/TaskJuggler/JobInfo.html +10 -4
- data/doc/TaskJuggler/Journal.html +227 -160
- data/doc/TaskJuggler/JournalEntry.html +10 -4
- data/doc/TaskJuggler/JournalEntryList.html +158 -72
- data/doc/TaskJuggler/KeywordArray.html +21 -9
- data/doc/TaskJuggler/KeywordDocumentation.html +612 -475
- data/doc/TaskJuggler/Limits.html +13 -8
- data/doc/TaskJuggler/Limits/Limit.html +10 -4
- data/doc/TaskJuggler/LimitsAttribute.html +10 -4
- data/doc/TaskJuggler/ListAttributeBase.html +10 -4
- data/doc/TaskJuggler/Log.html +10 -4
- data/doc/TaskJuggler/LogFile.html +10 -4
- data/doc/TaskJuggler/LogicalAttribute.html +10 -4
- data/doc/TaskJuggler/LogicalExpression.html +11 -5
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +10 -4
- data/doc/TaskJuggler/LogicalFlag.html +10 -4
- data/doc/TaskJuggler/LogicalFunction.html +132 -124
- data/doc/TaskJuggler/LogicalOperation.html +10 -4
- data/doc/TaskJuggler/Macro.html +16 -10
- data/doc/TaskJuggler/MacroTable.html +44 -38
- data/doc/TaskJuggler/ManagerResponsibilities.html +10 -4
- data/doc/TaskJuggler/ManagerStatusRecord.html +10 -4
- data/doc/TaskJuggler/Message.html +92 -68
- data/doc/TaskJuggler/MessageHandler.html +349 -28
- data/doc/TaskJuggler/Navigator.html +10 -4
- data/doc/TaskJuggler/NavigatorElement.html +10 -4
- data/doc/TaskJuggler/NikuProject.html +10 -4
- data/doc/TaskJuggler/NikuReport.html +10 -4
- data/doc/TaskJuggler/NikuResource.html +10 -4
- data/doc/TaskJuggler/NodeListAttribute.html +10 -4
- data/doc/TaskJuggler/OnShiftCache.html +10 -4
- data/doc/TaskJuggler/ProcessIntercom.html +118 -111
- data/doc/TaskJuggler/ProcessIntercomIface.html +75 -22
- data/doc/TaskJuggler/Project.html +886 -913
- data/doc/TaskJuggler/ProjectBroker.html +442 -331
- data/doc/TaskJuggler/ProjectBrokerIface.html +95 -38
- data/doc/TaskJuggler/ProjectFileParser.html +320 -317
- data/doc/TaskJuggler/ProjectFileScanner.html +336 -339
- data/doc/TaskJuggler/ProjectRecord.html +119 -56
- data/doc/TaskJuggler/ProjectServer.html +282 -237
- data/doc/TaskJuggler/ProjectServerIface.html +45 -39
- data/doc/TaskJuggler/PropertyAttribute.html +10 -4
- data/doc/TaskJuggler/PropertyList.html +177 -173
- data/doc/TaskJuggler/PropertySet.html +11 -5
- data/doc/TaskJuggler/PropertyTreeNode.html +194 -191
- data/doc/TaskJuggler/Query.html +280 -256
- data/doc/TaskJuggler/RTFHandlers.html +10 -4
- data/doc/TaskJuggler/RTFNavigator.html +33 -26
- data/doc/TaskJuggler/RTFQuery.html +135 -169
- data/doc/TaskJuggler/RTFReport.html +63 -56
- data/doc/TaskJuggler/RTFReportLink.html +58 -47
- data/doc/TaskJuggler/RTFWithQuerySupport.html +666 -0
- data/doc/TaskJuggler/RealFormat.html +10 -4
- data/doc/TaskJuggler/RealFormatAttribute.html +10 -4
- data/doc/TaskJuggler/ReferenceAttribute.html +10 -4
- data/doc/TaskJuggler/Report.html +333 -290
- data/doc/TaskJuggler/ReportBase.html +182 -174
- data/doc/TaskJuggler/ReportContext.html +10 -4
- data/doc/TaskJuggler/ReportServer.html +144 -126
- data/doc/TaskJuggler/ReportServerIface.html +50 -44
- data/doc/TaskJuggler/ReportServerRecord.html +38 -32
- data/doc/TaskJuggler/ReportServlet.html +144 -137
- data/doc/TaskJuggler/ReportTable.html +10 -4
- data/doc/TaskJuggler/ReportTableCell.html +169 -164
- data/doc/TaskJuggler/ReportTableColumn.html +10 -4
- data/doc/TaskJuggler/ReportTableLegend.html +10 -4
- data/doc/TaskJuggler/ReportTableLine.html +10 -4
- data/doc/TaskJuggler/Resource.html +121 -115
- data/doc/TaskJuggler/ResourceListAttribute.html +10 -4
- data/doc/TaskJuggler/ResourceListRE.html +10 -4
- data/doc/TaskJuggler/ResourceScenario.html +13 -7
- data/doc/TaskJuggler/RichText.html +61 -37
- data/doc/TaskJuggler/RichTextAttribute.html +10 -4
- data/doc/TaskJuggler/RichTextDocument.html +91 -81
- data/doc/TaskJuggler/RichTextElement.html +378 -317
- data/doc/TaskJuggler/RichTextFunctionExample.html +10 -4
- data/doc/TaskJuggler/RichTextFunctionHandler.html +16 -11
- data/doc/TaskJuggler/RichTextImage.html +10 -4
- data/doc/TaskJuggler/RichTextIntermediate.html +138 -70
- data/doc/TaskJuggler/RichTextParser.html +48 -40
- data/doc/TaskJuggler/RichTextScanner.html +328 -906
- data/doc/TaskJuggler/RichTextSnip.html +59 -57
- data/doc/TaskJuggler/RichTextSyntaxRules.html +458 -369
- data/doc/TaskJuggler/Scenario.html +10 -4
- data/doc/TaskJuggler/ScenarioData.html +33 -30
- data/doc/TaskJuggler/ScenarioListAttribute.html +10 -4
- data/doc/TaskJuggler/Scoreboard.html +10 -4
- data/doc/TaskJuggler/SheetHandlerBase.html +315 -191
- data/doc/TaskJuggler/SheetReceiver.html +334 -313
- data/doc/TaskJuggler/SheetSender.html +10 -4
- data/doc/TaskJuggler/Shift.html +10 -4
- data/doc/TaskJuggler/ShiftAssignment.html +10 -4
- data/doc/TaskJuggler/ShiftAssignments.html +10 -4
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +10 -4
- data/doc/TaskJuggler/ShiftScenario.html +10 -4
- data/doc/TaskJuggler/SimpleQueryExpander.html +697 -0
- data/doc/TaskJuggler/SortListAttribute.html +10 -4
- data/doc/TaskJuggler/SourceFileInfo.html +10 -4
- data/doc/TaskJuggler/StatusSheetReceiver.html +10 -4
- data/doc/TaskJuggler/StatusSheetReport.html +10 -4
- data/doc/TaskJuggler/StatusSheetSender.html +10 -4
- data/doc/TaskJuggler/StringAttribute.html +10 -4
- data/doc/TaskJuggler/SymbolAttribute.html +10 -4
- data/doc/TaskJuggler/SyntaxReference.html +260 -230
- data/doc/TaskJuggler/TOCEntry.html +99 -42
- data/doc/TaskJuggler/TSResourceRecord.html +10 -4
- data/doc/TaskJuggler/TSTaskRecord.html +10 -4
- data/doc/TaskJuggler/TableColumnDefinition.html +10 -4
- data/doc/TaskJuggler/TableOfContents.html +54 -12
- data/doc/TaskJuggler/TableReport.html +877 -872
- data/doc/TaskJuggler/Task.html +117 -68
- data/doc/TaskJuggler/TaskDependency.html +10 -4
- data/doc/TaskJuggler/TaskListAttribute.html +10 -4
- data/doc/TaskJuggler/TaskListRE.html +10 -4
- data/doc/TaskJuggler/TaskScenario.html +1681 -1563
- data/doc/TaskJuggler/TextFormatter.html +10 -4
- data/doc/TaskJuggler/TextParser.html +567 -534
- data/doc/TaskJuggler/TextParser/Pattern.html +128 -118
- data/doc/TaskJuggler/TextParser/Rule.html +26 -15
- data/doc/TaskJuggler/TextParser/StackElement.html +10 -4
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +22 -16
- data/doc/TaskJuggler/TextParser/TokenDoc.html +10 -4
- data/doc/TaskJuggler/TextReport.html +15 -6
- data/doc/TaskJuggler/TextScanner.html +319 -287
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +16 -10
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +23 -17
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +17 -11
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
- data/doc/TaskJuggler/TimeSheet.html +138 -175
- data/doc/TaskJuggler/TimeSheetReceiver.html +10 -4
- data/doc/TaskJuggler/TimeSheetRecord.html +65 -58
- data/doc/TaskJuggler/TimeSheetReport.html +47 -42
- data/doc/TaskJuggler/TimeSheetSender.html +10 -4
- data/doc/TaskJuggler/TimeSheetSummary.html +91 -83
- data/doc/TaskJuggler/TimeSheets.html +22 -16
- data/doc/TaskJuggler/Tj3AppBase.html +10 -4
- data/doc/TaskJuggler/Tj3Client.html +399 -365
- data/doc/TaskJuggler/Tj3Daemon.html +107 -94
- data/doc/TaskJuggler/Tj3SheetAppBase.html +10 -4
- data/doc/TaskJuggler/Tj3SsReceiver.html +10 -4
- data/doc/TaskJuggler/Tj3SsSender.html +10 -4
- data/doc/TaskJuggler/Tj3TsReceiver.html +10 -4
- data/doc/TaskJuggler/Tj3TsSender.html +10 -4
- data/doc/TaskJuggler/Tj3TsSummary.html +10 -4
- data/doc/TaskJuggler/TjException.html +10 -4
- data/doc/TaskJuggler/TjTime.html +145 -140
- data/doc/TaskJuggler/TjpExample.html +10 -4
- data/doc/TaskJuggler/TjpExportRE.html +122 -118
- data/doc/TaskJuggler/TjpSyntaxRules.html +4065 -4052
- data/doc/TaskJuggler/URLParameter.html +10 -4
- data/doc/TaskJuggler/UserManual.html +162 -155
- data/doc/TaskJuggler/VimSyntax.html +1028 -0
- data/doc/TaskJuggler/WebServer.html +45 -27
- data/doc/TaskJuggler/WorkingHours.html +10 -4
- data/doc/TaskJuggler/WorkingHoursAttribute.html +10 -4
- data/doc/TaskJuggler/XMLBlob.html +10 -4
- data/doc/TaskJuggler/XMLComment.html +10 -4
- data/doc/TaskJuggler/XMLDocument.html +10 -4
- data/doc/TaskJuggler/XMLElement.html +10 -4
- data/doc/TaskJuggler/XMLNamedText.html +10 -4
- data/doc/TaskJuggler/XMLText.html +10 -4
- data/doc/index.html +735 -677
- 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 +1 -1
- data/doc/lib/AttributeBase_rb.html +1 -1
- data/doc/lib/AttributeDefinition_rb.html +1 -1
- data/doc/lib/Attributes_rb.html +1 -1
- 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/{Message_rb.html → FileList_rb.html} +3 -5
- data/doc/lib/HTMLDocument_rb.html +1 -1
- data/doc/lib/Interval_rb.html +1 -1
- data/doc/lib/Journal_rb.html +1 -1
- data/doc/lib/KeywordArray_rb.html +1 -1
- data/doc/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/Limits_rb.html +1 -1
- data/doc/lib/LogFile_rb.html +1 -1
- data/doc/lib/Log_rb.html +1 -1
- data/doc/lib/LogicalExpression_rb.html +1 -1
- data/doc/lib/LogicalFunction_rb.html +1 -1
- data/doc/lib/LogicalOperation_rb.html +1 -1
- data/doc/lib/MacroTable_rb.html +1 -3
- data/doc/lib/MessageHandler_rb.html +1 -1
- data/doc/lib/ProjectFileParser_rb.html +1 -1
- data/doc/lib/ProjectFileScanner_rb.html +1 -1
- data/doc/lib/Project_rb.html +4 -2
- data/doc/lib/PropertyList_rb.html +1 -1
- data/doc/lib/PropertySet_rb.html +1 -1
- data/doc/lib/PropertyTreeNode_rb.html +1 -1
- data/doc/lib/Query_rb.html +1 -1
- data/doc/lib/RTFHandlers_rb.html +1 -1
- data/doc/lib/RTFNavigator_rb.html +1 -1
- data/doc/lib/RTFQuery_rb.html +2 -2
- data/doc/lib/RTFReportLink_rb.html +4 -2
- data/doc/lib/RTFReport_rb.html +1 -1
- data/doc/lib/{MacroParser_rb.html → RTFWithQuerySupport_rb.html} +4 -6
- data/doc/lib/RealFormat_rb.html +1 -1
- data/doc/lib/ResourceScenario_rb.html +1 -1
- data/doc/lib/Resource_rb.html +1 -1
- data/doc/lib/RichTextDocument_rb.html +1 -1
- data/doc/lib/RichTextElement_rb.html +1 -1
- data/doc/lib/RichTextFunctionExample_rb.html +1 -1
- data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
- data/doc/lib/RichTextParser_rb.html +1 -1
- data/doc/lib/RichTextScanner_rb.html +3 -1
- data/doc/lib/RichTextSnip_rb.html +1 -1
- data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
- data/doc/lib/RichText_rb.html +3 -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 +5 -1
- data/doc/lib/SheetReceiver_rb.html +3 -1
- data/doc/lib/SheetSender_rb.html +1 -1
- data/doc/lib/ShiftAssignments_rb.html +1 -1
- data/doc/lib/ShiftScenario_rb.html +1 -1
- data/doc/lib/Shift_rb.html +1 -1
- data/doc/lib/SimpleQueryExpander_rb.html +67 -0
- data/doc/lib/SourceFileInfo_rb.html +1 -1
- data/doc/lib/StatusSheetReceiver_rb.html +1 -1
- data/doc/lib/StatusSheetSender_rb.html +1 -1
- data/doc/lib/SyntaxReference_rb.html +1 -1
- data/doc/lib/TOCEntry_rb.html +1 -1
- data/doc/lib/TableColumnDefinition_rb.html +1 -1
- data/doc/lib/TableOfContents_rb.html +1 -1
- data/doc/lib/TaskDependency_rb.html +1 -1
- data/doc/lib/TaskJuggler_rb.html +1 -1
- data/doc/lib/TaskScenario_rb.html +1 -1
- data/doc/lib/Task_rb.html +1 -1
- data/doc/lib/TextFormatter_rb.html +1 -1
- data/doc/lib/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/TextParser/Rule_rb.html +1 -1
- data/doc/lib/TextParser/StackElement_rb.html +1 -1
- data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/TextParser_rb.html +3 -1
- data/doc/lib/TextScanner_rb.html +1 -3
- data/doc/lib/TimeSheetReceiver_rb.html +1 -1
- data/doc/lib/TimeSheetSender_rb.html +1 -1
- data/doc/lib/TimeSheetSummary_rb.html +1 -1
- data/doc/lib/TimeSheets_rb.html +1 -1
- data/doc/lib/Tj3AppBase_rb.html +1 -1
- data/doc/lib/Tj3Config_rb.html +1 -1
- data/doc/lib/Tj3SheetAppBase_rb.html +1 -1
- data/doc/lib/TjException_rb.html +1 -1
- data/doc/lib/TjTime_rb.html +1 -1
- data/doc/lib/TjpExample_rb.html +1 -1
- data/doc/lib/TjpSyntaxRules_rb.html +1 -1
- data/doc/lib/URLParameter_rb.html +1 -1
- data/doc/lib/UTF8String_rb.html +1 -1
- data/doc/lib/UserManual_rb.html +1 -1
- data/doc/lib/{ruby-signal-bug_rb.html → VimSyntax_rb.html} +17 -4
- data/doc/lib/WorkingHours_rb.html +1 -1
- data/doc/lib/XMLDocument_rb.html +1 -1
- data/doc/lib/XMLElement_rb.html +1 -1
- data/doc/lib/daemon/Daemon_rb.html +1 -1
- data/doc/lib/daemon/ProcessIntercom_rb.html +1 -1
- data/doc/lib/daemon/ProjectBroker_rb.html +1 -1
- data/doc/lib/daemon/ProjectServer_rb.html +1 -1
- data/doc/lib/daemon/ReportServer_rb.html +1 -3
- data/doc/lib/daemon/WebServer_rb.html +1 -1
- data/doc/lib/deep_copy_rb.html +1 -1
- data/doc/lib/reports/CSVFile_rb.html +1 -1
- data/doc/lib/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/reports/GanttChart_rb.html +1 -1
- 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 +1 -1
- data/doc/lib/reports/NikuReport_rb.html +1 -1
- data/doc/lib/reports/ReportBase_rb.html +1 -1
- data/doc/lib/reports/ReportContext_rb.html +1 -1
- data/doc/lib/reports/ReportTableCell_rb.html +1 -1
- 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 +1 -1
- data/doc/lib/reports/Report_rb.html +1 -1
- data/doc/lib/reports/ResourceListRE_rb.html +1 -1
- data/doc/lib/reports/StatusSheetReport_rb.html +1 -1
- data/doc/lib/reports/TableReport_rb.html +1 -1
- data/doc/lib/reports/TaskListRE_rb.html +1 -1
- data/doc/lib/reports/TextReport_rb.html +1 -1
- data/doc/lib/reports/TimeSheetReport_rb.html +1 -1
- data/doc/lib/reports/TjpExportRE_rb.html +1 -1
- data/doc/lib/taskjuggler3_rb.html +1 -1
- data/doc/lib/tj3client_rb.html +1 -1
- data/doc/lib/tj3d_rb.html +1 -1
- data/doc/lib/tj3man_rb.html +1 -1
- data/doc/lib/tj3ss_receiver_rb.html +1 -1
- data/doc/lib/tj3ss_sender_rb.html +1 -1
- data/doc/lib/tj3ts_receiver_rb.html +1 -1
- data/doc/lib/tj3ts_sender_rb.html +1 -1
- data/doc/lib/tj3ts_summary_rb.html +1 -1
- data/lib/Allocation.rb +8 -5
- data/lib/BatchProcessor.rb +7 -3
- data/lib/FileList.rb +58 -0
- data/lib/Journal.rb +73 -33
- data/lib/KeywordArray.rb +4 -0
- data/lib/KeywordDocumentation.rb +45 -11
- data/lib/Limits.rb +0 -1
- data/lib/LogicalExpression.rb +1 -1
- data/lib/LogicalFunction.rb +14 -12
- data/lib/MacroTable.rb +3 -4
- data/lib/MessageHandler.rb +136 -7
- data/lib/Project.rb +72 -86
- data/lib/ProjectFileParser.rb +30 -33
- data/lib/ProjectFileScanner.rb +7 -16
- data/lib/PropertyList.rb +25 -27
- data/lib/PropertySet.rb +1 -1
- data/lib/PropertyTreeNode.rb +9 -12
- data/lib/Query.rb +5 -4
- data/lib/RTFNavigator.rb +2 -1
- data/lib/RTFQuery.rb +4 -11
- data/lib/RTFReport.rb +2 -1
- data/lib/RTFReportLink.rb +10 -4
- data/lib/RTFWithQuerySupport.rb +45 -0
- data/lib/Resource.rb +20 -20
- data/lib/ResourceScenario.rb +3 -3
- data/lib/RichText.rb +15 -7
- data/lib/RichTextDocument.rb +8 -4
- data/lib/RichTextElement.rb +35 -12
- data/lib/RichTextFunctionHandler.rb +11 -12
- data/lib/RichTextParser.rb +5 -3
- data/lib/RichTextScanner.rb +144 -565
- data/lib/RichTextSnip.rb +3 -7
- data/lib/RichTextSyntaxRules.rb +51 -32
- data/lib/ScenarioData.rb +16 -25
- data/lib/SheetHandlerBase.rb +59 -2
- data/lib/SheetReceiver.rb +36 -18
- data/lib/SimpleQueryExpander.rb +58 -0
- data/lib/SyntaxReference.rb +9 -5
- data/lib/TOCEntry.rb +2 -0
- data/lib/TableOfContents.rb +4 -0
- data/lib/Task.rb +23 -12
- data/lib/TaskJuggler.rb +72 -33
- data/lib/TaskScenario.rb +131 -53
- data/lib/TextParser.rb +43 -30
- data/lib/TextParser/Pattern.rb +17 -13
- data/lib/TextParser/Rule.rb +5 -0
- data/lib/TextScanner.rb +46 -25
- data/lib/TimeSheetSummary.rb +9 -7
- data/lib/TimeSheets.rb +14 -23
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +1 -2
- data/lib/TjpSyntaxRules.rb +128 -104
- data/lib/UTF8String.rb +0 -1
- data/lib/UserManual.rb +5 -4
- data/lib/VimSyntax.rb +223 -0
- data/lib/daemon/Daemon.rb +9 -0
- data/lib/daemon/ProcessIntercom.rb +19 -4
- data/lib/daemon/ProjectBroker.rb +149 -68
- data/lib/daemon/ProjectServer.rb +119 -79
- data/lib/daemon/ReportServer.rb +42 -31
- data/lib/daemon/WebServer.rb +21 -2
- data/lib/deep_copy.rb +1 -1
- data/lib/reports/GanttContainer.rb +2 -2
- data/lib/reports/GanttLine.rb +2 -3
- data/lib/reports/GanttTaskBar.rb +7 -3
- data/lib/reports/Report.rb +62 -57
- data/lib/reports/ReportBase.rb +6 -4
- data/lib/reports/ReportTableCell.rb +13 -14
- data/lib/reports/TableReport.rb +2 -1
- data/lib/reports/TextReport.rb +3 -0
- data/lib/reports/TimeSheetReport.rb +2 -3
- data/lib/reports/TjpExportRE.rb +0 -2
- data/lib/tj3client.rb +31 -3
- data/lib/tj3d.rb +8 -1
- data/manual/Day_To_Day_Juggling +2 -95
- data/manual/How_To_Contribute +2 -1
- data/manual/Rich_Text_Attributes +37 -3
- data/manual/Software +203 -0
- data/test/MessageChecker.rb +4 -4
- data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
- data/test/TestSuite/HTML-Reports/CellText.html +758 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
- data/test/TestSuite/HTML-Reports/Query.html +31 -0
- data/test/TestSuite/HTML-Reports/css/tjmanual.css +14 -0
- data/test/TestSuite/HTML-Reports/css/tjreport.css +233 -21
- data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
- data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +48 -0
- data/test/TestSuite/ReportGenerator/Correct/Macros.tjp +57 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +386 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Macros-1.csv +6 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjmanual.css +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjreport.css +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/details.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-green.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-red.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-yellow.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resource.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resourcegroup.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/task.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/taskgroup.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-down.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-flat.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-up.png +0 -0
- data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +26 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/scripts/wz_tooltip.js +0 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.html +3210 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +19 -0
- data/test/TestSuite/Scheduler/Correct/Container.html +22 -22
- data/test/TestSuite/Scheduler/Correct/Limits.html +4964 -0
- data/test/TestSuite/Scheduler/Correct/Shift.html +1707 -417
- data/test/TestSuite/Scheduler/Correct/Shift2.html +9 -9
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +6 -2
- data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +66 -0
- data/test/TestSuite/Scheduler/Errors/css/tjreport.css +407 -0
- data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Scheduler/Errors/task_pred_before.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_pred_before_gd.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_pred_before_gl.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_succ_after.tjp +12 -0
- data/test/TestSuite/Scheduler/Errors/task_succ_after_gd.tjp +12 -0
- data/test/TestSuite/Scheduler/Errors/task_succ_after_gl.tjp +12 -0
- data/test/TestSuite/StatusSheets/dev2.tji +22 -0
- data/test/TestSuite/StatusSheets/resrep.tji +7 -0
- data/test/TestSuite/StatusSheets/run +6 -4
- data/test/TestSuite/StatusSheets/tj3d.log +312 -0
- data/test/TestSuite/Syntax/Correct/Managers.html +263 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +1 -2
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +1 -1
- data/test/TestSuite/TimeSheets/acceptable_intervals +1 -0
- data/test/TestSuite/TimeSheets/resrep.tji +7 -0
- data/test/TestSuite/TimeSheets/run +6 -5
- data/test/TestSuite/TimeSheets/statussheets.log +1 -0
- data/test/TestSuite/TimeSheets/ts.tji +351 -0
- data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
- data/test/test_PropertySet.rb +2 -2
- data/test/test_RichText.rb +178 -387
- data/test/test_SimpleQueryExpander.rb +55 -0
- data/test/test_deep_copy.rb +2 -2
- metadata +854 -834
- data/lib/MacroParser.rb +0 -77
- data/lib/Message.rb +0 -56
- data/lib/ruby-signal-bug.rb +0 -43
- data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
- data/test/TestSuite/HTML-Reports/reference.html +0 -51
- data/test/TestSuite/ReportGenerator/Correct/Journal.html +0 -63
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
- data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
- data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
- data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
- data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
data/lib/daemon/ProjectServer.rb
CHANGED
|
@@ -37,7 +37,7 @@ class TaskJuggler
|
|
|
37
37
|
|
|
38
38
|
attr_reader :authKey, :uri
|
|
39
39
|
|
|
40
|
-
def initialize(projectData = nil)
|
|
40
|
+
def initialize(projectData = nil, logConsole = false)
|
|
41
41
|
@projectData = projectData
|
|
42
42
|
# Since we are still in the ProjectBroker process, the current DRb
|
|
43
43
|
# server is still the ProjectBroker DRb server.
|
|
@@ -46,6 +46,7 @@ class TaskJuggler
|
|
|
46
46
|
@daemon = nil
|
|
47
47
|
initIntercom
|
|
48
48
|
|
|
49
|
+
@logConsole = logConsole
|
|
49
50
|
@pid = nil
|
|
50
51
|
@uri = nil
|
|
51
52
|
|
|
@@ -79,34 +80,45 @@ class TaskJuggler
|
|
|
79
80
|
@log.fatal('ProjectServer fork failed')
|
|
80
81
|
elsif @pid.nil?
|
|
81
82
|
# This is the child
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
if @logConsole
|
|
84
|
+
# If the Broker wasn't daemonized, log stdout and stderr to PID
|
|
85
|
+
# specific files.
|
|
86
|
+
$stderr.reopen("tj3d.ps.#{$$}.stderr", 'w')
|
|
87
|
+
$stdout.reopen("tj3d.ps.#{$$}.stdout", 'w')
|
|
88
|
+
end
|
|
87
89
|
begin
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
$SAFE = 1
|
|
91
|
+
DRb.install_acl(ACL.new(%w[ deny all allow 127.0.0.1 ]))
|
|
92
|
+
DRb.start_service
|
|
93
|
+
iFace = ProjectServerIface.new(self)
|
|
94
|
+
begin
|
|
95
|
+
@uri = DRb.start_service('druby://127.0.0.1:0', iFace).uri
|
|
96
|
+
@log.debug("Project server is listening on #{@uri}")
|
|
97
|
+
rescue
|
|
98
|
+
@log.fatal("ProjectServer can't start DRb: #{$!}")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Send the URI of the newly started DRb server to the parent process.
|
|
102
|
+
rd.close
|
|
103
|
+
wr.write @uri
|
|
104
|
+
wr.close
|
|
105
|
+
|
|
106
|
+
# Start a Thread that waits for the @terminate flag to be set and does
|
|
107
|
+
# other background tasks.
|
|
108
|
+
startTerminator
|
|
109
|
+
# Start another Thread that will be used to fork-off ReportServer
|
|
110
|
+
# processes.
|
|
111
|
+
startHousekeeping
|
|
112
|
+
|
|
113
|
+
# Cleanup the DRb threads
|
|
114
|
+
DRb.thread.join
|
|
115
|
+
@log.debug('Project server terminated')
|
|
116
|
+
exit 0
|
|
90
117
|
rescue
|
|
118
|
+
$stderr.print $!.to_s
|
|
119
|
+
$stderr.print $!.backtrace.join("\n")
|
|
91
120
|
@log.fatal("ProjectServer can't start DRb: #{$!}")
|
|
92
121
|
end
|
|
93
|
-
|
|
94
|
-
# Send the URI of the newly started DRb server to the parent process.
|
|
95
|
-
rd.close
|
|
96
|
-
wr.write @uri
|
|
97
|
-
wr.close
|
|
98
|
-
|
|
99
|
-
# Start a Thread that waits for the @terminate flag to be set and does
|
|
100
|
-
# other background tasks.
|
|
101
|
-
startTerminator
|
|
102
|
-
# Start another Thread that will be used to fork-off ReportServer
|
|
103
|
-
# processes.
|
|
104
|
-
startHousekeeping
|
|
105
|
-
|
|
106
|
-
# Cleanup the DRb threads
|
|
107
|
-
DRb.thread.join
|
|
108
|
-
@log.debug('Project server terminated')
|
|
109
|
-
exit 0
|
|
110
122
|
else
|
|
111
123
|
# This is the parent
|
|
112
124
|
Process.detach(@pid)
|
|
@@ -122,16 +134,20 @@ class TaskJuggler
|
|
|
122
134
|
# directory. The second one is the master project file (.tjp file).
|
|
123
135
|
# Additionally a list of optional .tji files can be provided.
|
|
124
136
|
def loadProject(args)
|
|
137
|
+
dirAndFiles = args.dup.untaint
|
|
125
138
|
# The first argument is the working directory
|
|
126
139
|
Dir.chdir(args.shift.untaint)
|
|
127
140
|
|
|
128
|
-
|
|
141
|
+
# Save a time stamp of when the project file loading started.
|
|
142
|
+
@modifiedCheck = TjTime.now
|
|
143
|
+
|
|
144
|
+
updateState(:loading, dirAndFiles, false)
|
|
129
145
|
@tj = TaskJuggler.new(true)
|
|
130
146
|
|
|
131
147
|
# Parse all project files
|
|
132
148
|
unless @tj.parse(args, true)
|
|
133
149
|
@log.error("Parsing of #{args.join(' ')} failed")
|
|
134
|
-
updateState(:failed,
|
|
150
|
+
updateState(:failed, nil, false)
|
|
135
151
|
@terminate = true
|
|
136
152
|
return false
|
|
137
153
|
end
|
|
@@ -139,14 +155,14 @@ class TaskJuggler
|
|
|
139
155
|
# Then schedule the project
|
|
140
156
|
unless @tj.schedule
|
|
141
157
|
@log.error("Scheduling of project #{@tj.projectId} failed")
|
|
142
|
-
updateState(:failed, @tj.projectId)
|
|
158
|
+
updateState(:failed, @tj.projectId, false)
|
|
143
159
|
Log.exit('scheduler')
|
|
144
160
|
@terminate = true
|
|
145
161
|
return false
|
|
146
162
|
end
|
|
147
163
|
|
|
148
164
|
# Great, everything went fine. We've got a project to work with.
|
|
149
|
-
updateState(:ready, @tj.projectId)
|
|
165
|
+
updateState(:ready, @tj.projectId, false)
|
|
150
166
|
@log.info("Project #{@tj.projectId} loaded")
|
|
151
167
|
restartTimer
|
|
152
168
|
true
|
|
@@ -164,7 +180,7 @@ class TaskJuggler
|
|
|
164
180
|
return [] unless @tj && (project = @tj.project)
|
|
165
181
|
list = []
|
|
166
182
|
project.reports.each do |report|
|
|
167
|
-
|
|
183
|
+
unless report.get('formats').empty?
|
|
168
184
|
list << [ report.fullId, report.name ]
|
|
169
185
|
end
|
|
170
186
|
end
|
|
@@ -198,7 +214,8 @@ class TaskJuggler
|
|
|
198
214
|
sleep 0.1 if reportServer.nil?
|
|
199
215
|
end
|
|
200
216
|
|
|
201
|
-
@log.debug("Got report server with URI #{reportServer.uri} for
|
|
217
|
+
@log.debug("Got report server with URI #{reportServer.uri} for " +
|
|
218
|
+
"tag #{tag}")
|
|
202
219
|
restartTimer
|
|
203
220
|
[ reportServer.uri, reportServer.authKey ]
|
|
204
221
|
end
|
|
@@ -225,67 +242,90 @@ class TaskJuggler
|
|
|
225
242
|
|
|
226
243
|
private
|
|
227
244
|
|
|
228
|
-
# Update the _state_ and
|
|
229
|
-
|
|
245
|
+
# Update the _state_, _id_ and _modified_ state of the project locally and
|
|
246
|
+
# remotely.
|
|
247
|
+
def updateState(state, filesOrId, modified)
|
|
230
248
|
begin
|
|
231
249
|
@daemon = DRbObject.new(nil, @daemonURI) unless @daemon
|
|
232
|
-
@daemon.updateState(@authKey,
|
|
250
|
+
@daemon.updateState(@authKey, filesOrId, state, modified)
|
|
233
251
|
rescue
|
|
234
252
|
@log.fatal("Can't update state with daemon: #{$!}")
|
|
235
253
|
end
|
|
236
254
|
@stateLock.synchronize do
|
|
237
255
|
@state = state
|
|
238
256
|
@stateUpdated = TjTime.now
|
|
257
|
+
@modified = modified
|
|
258
|
+
@modifiedCheck = TjTime.now
|
|
239
259
|
end
|
|
240
260
|
end
|
|
241
261
|
|
|
242
262
|
def startHousekeeping
|
|
243
263
|
Thread.new do
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
264
|
+
begin
|
|
265
|
+
loop do
|
|
266
|
+
# Was the project data provided during object creation?
|
|
267
|
+
# Then we load the data here.
|
|
268
|
+
if @projectData
|
|
269
|
+
loadProject(@projectData)
|
|
270
|
+
@projectData = nil
|
|
271
|
+
end
|
|
251
272
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
rsr.uri = rs.uri
|
|
264
|
-
rsr.authKey = rs.authKey
|
|
265
|
-
@log.debug("Adding ReportServer with URI #{rsr.uri} to list")
|
|
266
|
-
# Add the new ReportServer to our list.
|
|
267
|
-
@reportServers.synchronize do
|
|
268
|
-
@reportServers << rsr
|
|
273
|
+
# Check every 60 seconds if the input files have been modified.
|
|
274
|
+
# Don't check if we already know it has been modified.
|
|
275
|
+
if @stateLock.synchronize { @state == :ready && !@modified &&
|
|
276
|
+
@modifiedCheck + 60 < TjTime.now }
|
|
277
|
+
# Reset the timer
|
|
278
|
+
@stateLock.synchronize { @modifiedCheck = TjTime.now }
|
|
279
|
+
|
|
280
|
+
if @tj.project.inputFiles.modified?
|
|
281
|
+
@log.info("Project #{@tj.projectId} has been modified")
|
|
282
|
+
updateState(:ready, @tj.projectId, true)
|
|
283
|
+
end
|
|
269
284
|
end
|
|
270
|
-
end
|
|
271
285
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
286
|
+
# Check for pending requests for new ReportServers.
|
|
287
|
+
unless @reportServerRequests.empty?
|
|
288
|
+
tag = @reportServerRequests.pop
|
|
289
|
+
@log.debug("Popped #{tag}")
|
|
290
|
+
# Create an new entry for the @reportServers list.
|
|
291
|
+
rsr = ReportServerRecord.new(tag)
|
|
292
|
+
@log.debug("RSR created")
|
|
293
|
+
# Create a new ReportServer object that runs as a separate
|
|
294
|
+
# process. The constructor will tell us the URI and authentication
|
|
295
|
+
# key of the new ReportServer.
|
|
296
|
+
rs = ReportServer.new(@tj, @logConsole)
|
|
297
|
+
rsr.uri = rs.uri
|
|
298
|
+
rsr.authKey = rs.authKey
|
|
299
|
+
@log.debug("Adding ReportServer with URI #{rsr.uri} to list")
|
|
300
|
+
# Add the new ReportServer to our list.
|
|
301
|
+
@reportServers.synchronize do
|
|
302
|
+
@reportServers << rsr
|
|
303
|
+
end
|
|
304
|
+
end
|
|
282
305
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
306
|
+
# Some state changing operations are not atomic. Since the client
|
|
307
|
+
# can die during the transaction, the server might hang in some
|
|
308
|
+
# states. Here we define timeout for each state. If the timeout is
|
|
309
|
+
# not 0 and exceeded, we immediately terminate the process.
|
|
310
|
+
timeouts = { :new => 10, :loading => 15 * 60, :failed => 60,
|
|
311
|
+
:ready => 0 }
|
|
312
|
+
if timeouts[@state] > 0 &&
|
|
313
|
+
TjTime.now - @stateUpdated > timeouts[@state]
|
|
314
|
+
@log.fatal("Reached timeout for state #{@state}. Terminating.")
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
# If we have not received a ping from the ProjectBroker for 2
|
|
318
|
+
# minutes, we assume it has died and terminate as well.
|
|
319
|
+
if TjTime.now - @lastPing > 180
|
|
320
|
+
@log.fatal('Heartbeat from daemon lost. Terminating.')
|
|
321
|
+
end
|
|
322
|
+
sleep 1
|
|
287
323
|
end
|
|
288
|
-
|
|
324
|
+
rescue
|
|
325
|
+
# Make sure we get a backtrace for this thread.
|
|
326
|
+
$stderr.print $!.to_s
|
|
327
|
+
$stderr.print $!.backtrace.join("\n")
|
|
328
|
+
@log.fatal("ProjectServer housekeeping error: #{$!}")
|
|
289
329
|
end
|
|
290
330
|
end
|
|
291
331
|
end
|
|
@@ -305,31 +345,31 @@ class TaskJuggler
|
|
|
305
345
|
def loadProject(authKey, args)
|
|
306
346
|
return false unless @server.checkKey(authKey, 'loadProject')
|
|
307
347
|
|
|
308
|
-
@server.loadProject(args)
|
|
348
|
+
trap { @server.loadProject(args) }
|
|
309
349
|
end
|
|
310
350
|
|
|
311
351
|
def getProjectName(authKey)
|
|
312
352
|
return false unless @server.checkKey(authKey, 'getReportServer')
|
|
313
353
|
|
|
314
|
-
@server.getProjectName
|
|
354
|
+
trap { @server.getProjectName }
|
|
315
355
|
end
|
|
316
356
|
|
|
317
357
|
def getReportList(authKey)
|
|
318
358
|
return false unless @server.checkKey(authKey, 'getReportServer')
|
|
319
359
|
|
|
320
|
-
@server.getReportList
|
|
360
|
+
trap { @server.getReportList }
|
|
321
361
|
end
|
|
322
362
|
|
|
323
363
|
def getReportServer(authKey)
|
|
324
364
|
return false unless @server.checkKey(authKey, 'getReportServer')
|
|
325
365
|
|
|
326
|
-
@server.getReportServer
|
|
366
|
+
trap { @server.getReportServer }
|
|
327
367
|
end
|
|
328
368
|
|
|
329
369
|
def ping(authKey)
|
|
330
370
|
return false unless @server.checkKey(authKey, 'ping')
|
|
331
371
|
|
|
332
|
-
@server.ping
|
|
372
|
+
trap { @server.ping }
|
|
333
373
|
true
|
|
334
374
|
end
|
|
335
375
|
|
data/lib/daemon/ReportServer.rb
CHANGED
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
|
|
13
13
|
require 'daemon/ProcessIntercom'
|
|
14
14
|
require 'TjException'
|
|
15
|
-
require 'Message'
|
|
16
15
|
require 'TjTime'
|
|
17
16
|
|
|
18
17
|
class TaskJuggler
|
|
@@ -23,7 +22,7 @@ class TaskJuggler
|
|
|
23
22
|
|
|
24
23
|
attr_reader :uri, :authKey
|
|
25
24
|
|
|
26
|
-
def initialize(tj)
|
|
25
|
+
def initialize(tj, logConsole = false)
|
|
27
26
|
initIntercom
|
|
28
27
|
|
|
29
28
|
@pid = nil
|
|
@@ -45,33 +44,45 @@ class TaskJuggler
|
|
|
45
44
|
if (@pid = fork) == -1
|
|
46
45
|
@log.fatal('ReportServer fork failed')
|
|
47
46
|
elsif @pid.nil?
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
iFace = ReportServerIface.new(self)
|
|
54
|
-
begin
|
|
55
|
-
uri = DRb.start_service('druby://127.0.0.1:0', iFace).uri
|
|
56
|
-
@log.debug("Report server is listening on #{uri}")
|
|
57
|
-
rescue
|
|
58
|
-
@log.fatal("ReportServer can't start DRb: #{$!}")
|
|
47
|
+
if logConsole
|
|
48
|
+
# If the Broker wasn't daemonized, log stdout and stderr to PID
|
|
49
|
+
# specific files.
|
|
50
|
+
$stderr.reopen("tj3d.rs.#{$$}.stderr", 'w')
|
|
51
|
+
$stdout.reopen("tj3d.rs.#{$$}.stdout", 'w')
|
|
59
52
|
end
|
|
53
|
+
begin
|
|
54
|
+
# This is the child
|
|
55
|
+
$SAFE = 1
|
|
56
|
+
DRb.install_acl(ACL.new(%w[ deny all
|
|
57
|
+
allow 127.0.0.1 ]))
|
|
58
|
+
DRb.start_service
|
|
59
|
+
iFace = ReportServerIface.new(self)
|
|
60
|
+
begin
|
|
61
|
+
uri = DRb.start_service('druby://127.0.0.1:0', iFace).uri
|
|
62
|
+
@log.debug("Report server is listening on #{uri}")
|
|
63
|
+
rescue
|
|
64
|
+
@log.fatal("ReportServer can't start DRb: #{$!}")
|
|
65
|
+
end
|
|
60
66
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
# Send the URI of the newly started DRb server to the parent process.
|
|
68
|
+
rd.close
|
|
69
|
+
wr.write uri
|
|
70
|
+
wr.close
|
|
65
71
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
72
|
+
# Start a Thread that waits for the @terminate flag to be set and does
|
|
73
|
+
# other background tasks.
|
|
74
|
+
startTerminator
|
|
75
|
+
startWatchDog
|
|
70
76
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
# Cleanup the DRb threads
|
|
78
|
+
DRb.thread.join
|
|
79
|
+
@log.debug('Report server terminated')
|
|
80
|
+
exit 0
|
|
81
|
+
rescue
|
|
82
|
+
$stderr.print $!.to_s
|
|
83
|
+
$stderr.print $!.backtrace.join("\n")
|
|
84
|
+
@log.fatal("ReportServer caught unexpected exception: #{$!}")
|
|
85
|
+
end
|
|
75
86
|
else
|
|
76
87
|
Process.detach(@pid)
|
|
77
88
|
# This is the parent
|
|
@@ -159,38 +170,38 @@ class TaskJuggler
|
|
|
159
170
|
def ping(authKey)
|
|
160
171
|
return false unless @server.checkKey(authKey, 'addFile')
|
|
161
172
|
|
|
162
|
-
@server.ping
|
|
173
|
+
trap { @server.ping }
|
|
163
174
|
end
|
|
164
175
|
|
|
165
176
|
def addFile(authKey, file)
|
|
166
177
|
return false unless @server.checkKey(authKey, 'addFile')
|
|
167
178
|
|
|
168
|
-
@server.addFile(file)
|
|
179
|
+
trap { @server.addFile(file) }
|
|
169
180
|
end
|
|
170
181
|
|
|
171
182
|
def generateReport(authKey, reportId, regExpMode, dynamicAttributes)
|
|
172
183
|
return false unless @server.checkKey(authKey, 'generateReport')
|
|
173
184
|
|
|
174
|
-
@server.generateReport(reportId, regExpMode, dynamicAttributes)
|
|
185
|
+
trap { @server.generateReport(reportId, regExpMode, dynamicAttributes) }
|
|
175
186
|
end
|
|
176
187
|
|
|
177
188
|
|
|
178
189
|
def listReports(authKey, reportId, regExpMode)
|
|
179
190
|
return false unless @server.checkKey(authKey, 'generateReport')
|
|
180
191
|
|
|
181
|
-
@server.listReports(reportId, regExpMode)
|
|
192
|
+
trap { @server.listReports(reportId, regExpMode) }
|
|
182
193
|
end
|
|
183
194
|
|
|
184
195
|
def checkTimeSheet(authKey, sheet)
|
|
185
196
|
return false unless @server.checkKey(authKey, 'checkTimeSheet')
|
|
186
197
|
|
|
187
|
-
@server.checkTimeSheet(sheet)
|
|
198
|
+
trap { @server.checkTimeSheet(sheet) }
|
|
188
199
|
end
|
|
189
200
|
|
|
190
201
|
def checkStatusSheet(authKey, sheet)
|
|
191
202
|
return false unless @server.checkKey(authKey, 'checkStatusSheet')
|
|
192
203
|
|
|
193
|
-
@server.checkStatusSheet(sheet)
|
|
204
|
+
trap { @server.checkStatusSheet(sheet) }
|
|
194
205
|
end
|
|
195
206
|
|
|
196
207
|
end
|
data/lib/daemon/WebServer.rb
CHANGED
|
@@ -32,6 +32,7 @@ class TaskJuggler
|
|
|
32
32
|
|
|
33
33
|
# Create a web server object that runs in a separate thread.
|
|
34
34
|
def initialize(broker, port)
|
|
35
|
+
@log = LogFile.instance
|
|
35
36
|
@broker = broker
|
|
36
37
|
|
|
37
38
|
config = { :Port => port }
|
|
@@ -40,12 +41,29 @@ class TaskJuggler
|
|
|
40
41
|
|
|
41
42
|
# Serve some directories via the FileHandler servlet.
|
|
42
43
|
%w( css icons scripts ).each do |dir|
|
|
43
|
-
fullDir = AppConfig.dataDirs("data/#{dir}")[0]
|
|
44
|
+
unless (fullDir = AppConfig.dataDirs("data/#{dir}")[0])
|
|
45
|
+
@log.fatal(<<"EOT"
|
|
46
|
+
Cannot find the #{dir} directory. This is usually the result of an
|
|
47
|
+
improper TaskJuggler installation. If you know the directory, you can use the
|
|
48
|
+
TASKJUGGLER_DATA_PATH environment variable to specify the location. The
|
|
49
|
+
variable should be set to the path without the /data at the end. Multiple
|
|
50
|
+
directories must be separated by colons.
|
|
51
|
+
EOT
|
|
52
|
+
)
|
|
53
|
+
end
|
|
44
54
|
@server.mount("/#{dir}", WEBrick::HTTPServlet::FileHandler, fullDir)
|
|
45
55
|
end
|
|
46
56
|
|
|
47
57
|
# Start the web server in a new thread so we don't block this thread.
|
|
48
|
-
@thread = Thread.new
|
|
58
|
+
@thread = Thread.new do
|
|
59
|
+
begin
|
|
60
|
+
@server.start
|
|
61
|
+
rescue
|
|
62
|
+
$stderr.print $!.to_s
|
|
63
|
+
$stderr.print $!.backtrace.join("\n")
|
|
64
|
+
@log.fatal("Web server error: #{$!}")
|
|
65
|
+
end
|
|
66
|
+
end
|
|
49
67
|
end
|
|
50
68
|
|
|
51
69
|
# Stop the web server.
|
|
@@ -79,6 +97,7 @@ class TaskJuggler
|
|
|
79
97
|
generateWelcomePage(projectId)
|
|
80
98
|
else
|
|
81
99
|
attributes = req.query['attributes'] || ''
|
|
100
|
+
attributes = URLParameter.decode(attributes) unless attributes.empty?
|
|
82
101
|
generateReport(projectId, reportId, attributes)
|
|
83
102
|
end
|
|
84
103
|
rescue
|